黑马程序员->面向对象 (2 -多态,异常

来源:互联网 发布:linux查看内核版本 编辑:程序博客网 时间:2024/06/07 08:05

--------------------android培训、java培训、期待与您交流! ---------------------

 

3.4............................................................多态(//多态-多态-多态-多态-多态)
    定义:某一类事物的多种存在形态。
    例子:动物中猫,狗。 猫这个对象对应的类型是猫类型;猫 x = new 猫();
    同时猫也是动物中的一种,也可以把猫称为动物。     动物 y = new 猫();
       //动物是猫和狗具体事物中抽取出来的父类型。
    //父类型引用指向了子类对象。
   1. 多态的体现。父类的引用指向了自己的子类对象,父类的引用也可以接受自己的子类对象。
   2. 多态的前提。 必须是类与类之间有关系,要么继承,要么实现。通常还有一个前提。存在覆盖。  
   3. 多态的好处。 多态的出现大大的提高程序的扩展性。
   4. 多态的弊端。 提高了扩展性,但是只能使用父类的引用访问父类中的成员。
   // 以前 Cat a = new Cat();    现在 Animal a = new Cat();------这是多态。
   用Animal a = new Cat(); 时 父类Animal和子类Cat都有的方法能用。
         而子类自有的特性方法要涉及----------------类型提升。类型转换。
   //需要强制将父类的引用,转成子类类型向下转型。
    cat c = (cat)a;
    c.catchMouse();
   //千万不要出现这样的操作,就是将父类对象转成子类对象。  我们能转换的是父类应用指向了自己的子类对象时,
      //该应用可以被提升,也可以被强制转换。  多态至始至终都是子类对象在做着变化。
    为避免子类类型错误,可以加入判断语句: if(a instanceof b),判断a是否为b类型的东西。
   //在多态中成员变量函数的特点;
    在编译时期: 参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败。
    在运行时期: 参阅对象所属的类中是否有调用的方法。
               //简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
     在多态中,成员变量的特点:
     无论编译和运行,都参考左边(引用型变量所属的类)
                 在多态中,静态成员函数的特点:
                  无论编译和运行,都参考左边。


  3.4.5........ object类
    object:是所有对象的直接后者间接父类,传说中的上帝。该类中定义的肯定是所有对象都具备的动能。
    equals:equals方法是比较两个对象(地址)是否相等。返回值为 boolean 型:false 或true
     System.out.println(obj1.equals(obj2))
    //用object的equals的比较方法时,比较各对象特有方法变量时,要强转回子类对象。
    if(!(obj instanceof Demo)) return false; Demo d = (Demo)obj; return this.num == d.num;
    tostring:将对象所属的类和对象的哈希值输出出来。
     System.out.println(对象.tostring);   //结果是::对象所在的类@对象的十六进制哈希值。
    因为所有的对象都是独立存在于内存中,有独立的内存地址值,所以tostring方法封装在 object 类中。
    //相当于 getClass().getName()+'@'+Integer.toHexString(hashCode));
    System.out.println(对象.getClass().getName()+'@'+Integer.toHexString(对象.hashCode)));
  3.4.6............内部类//内部类
   将一个类定义在另一个类的里面,对里面那个类就成为内部类(内置类,嵌套类)。
    访问特点;内部类可以直接访问外部类中的成员,包括私有成员。
         而外部类要访问内部类中的成员必须要建立内部类的对象。
             //内部类访问外部类成员,不需要建立外部的对象就可直接访问。外部类访问内部,必须要建立内部的对象。
    //之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部.this.变量。
    如果要直接访问内部类成员,要这样写: 外部.内部  名字 = new 外部().new 内部();
    //外部类和内部类中有相同名字变量时,调用变量前要加>> 外部.this.变量  <<标明是外部的this。
    2.  当内部类在成员位置上,就可以被成员修饰符所修饰。
     比如:private :将内部类在外部类中进行封装。
        static :内部类就具备 static 的特性。
       //当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
       在外部其他类中,如何直接访问 static 内部类的非静态成员呢?
         new Outer.Inner().function();
       在外部其他类中,如何直接访问 static 内部类的静态成员呢?
       Outer.Inner.function();
       //注意: 当内部类中定义了静态成员,该内部类必须是static 的。
       //       当外部类中的静态方法访问内部类时,内部类也必须是static的。
    内部类的由来:
         当描述事物时,事物的内部还有事物,该事物用内部类来描述。
         因为内部事物在使用外部事物的内容。//用于程序设计上。
    内部类定义在局部时;
        1.不可以被成员修饰符修饰。
        2.可以直接访问外部类中的成员,因为还持有外部类中的引用。
          但是不可以访问它所在的局部中的变量。只能访问被 final 修饰的局部变量。
    class Outer{
     void method(){
      final int y = 4;
      class Inner{
        void function(){
         System.out.println(y);
            }
         }
         new Inner().function();//这里不能写在局部内部类的上面,因为在上面时执行这句会
          }    //提示找不到类,因为下面的类还木有执行到语句。
       }


    匿名内部类:
        1.匿名内部类其实就是内部类的简写形式。
        2.定义匿名内部类的前提://内部类必须是继承一个类或者实现接口。
        3.匿名内部类的格式: new 父类或者接口(){定义子类的内容}
         new AbsDemo()
          {
           void show(){
            System.out.println();
           }
          }.show();
        4.其实匿名内部类就是一个匿名子类对象,而且这个类都点胖。可以理解为带内容的对象。
        5.匿名内部类中定义的方法最好不要超过3个。

3.5...................................................................异常//异常-异常-异常-异常
 异常的体系:  Throwable :   Error     : 通常出现重大问题如:运行的类不存在或者内存溢出等。
               : 不编写针对代码对齐处理。
        Exception : 在运行时运行出现的一些情况,可以通过 try catch finally
  
  Exception 和 Error 的子类名都是以父类名作为后缀。
   //异常由来: 问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。
      //其实就是java度不正常情况进行描述后的对象体现。
     对于问题的划分:两种:一种是严重的问题,一种是非严重的问题。
     //对于严重的,java通过Error类进行描述。对于Error一般不编写针对性的代码对其进行处理。
     //对于非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的代码对其进行处理。
     无论 Error 或者 Exception 都具有一些共性内容。比如:不正常情况的信息,引发原因。
   3.5.2.....异常的处理 //java提供了特有的语句进行处理
    try           try
    {           {
     需要被检测的代码       int x = d.div(4,0);  
    }           }
    catch (异常类 变量)       catch (Exception e)//Exception e = new ArithmeticException();
    {           {
     处理异常的代码:(处理方式)    System.out.println("除零了");
    }            System.out.println(e.getMessage());// by zero
    finally           System.out.println(e.toSrting());// 异常名称,异常信息
    {           } //其实jvm默认的异常处理机制,就是在调用printstackTrace方法,
     一定会执行的语句;       //打印异常的堆栈的跟踪信息。
    }
    3.对捕获到的异常进行常见方法操作 throws throws throws throws throws throws throws throws
       String getMessage
      异常声明 throws ,在功能上通过 throws 的关键字声明了该功能有可能会出现问题。
     //在函数上声明异常,便于提高安全性,让调用者进行处理,不处理则编译失败。
    4.对多异常的处理
     //1.声明异常时,建议声明更为具体的异常,这样处理的可以更具体。
     //2.对方声明几个异常,就对应几个catch块。 如多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
     建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单定义一句,e.printStackTrace(),
      也不要简单的就书写一条输出语句。


    5.自定义异常 throw throw throw throw throw throw throw throw
     //因为项目中会出现特有问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照
     //java的对问题封装的思想,将特有的问题,进行自定义异常封装。
     当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
     要么在内部 try catch 处理。
     要么在函数上声明让调用者处理。
                                   一般情况在,函数内部出现异常,函数上需要声明。
      if (条件)
             throw new /*自定义异常名称*/ //手动通过throw关键字抛出一个自定义异常对象。
     自定义异常结果只有异常名称,没有异常信息。自定义异常信息方法:
      //因为父类已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类通过
      //super语句。那么就可以直接通过getMessage 方法获取自定义的异常信息。
      自定义异常类必须继承 Exception . 继承 Exception 原因:
      //异常体系有一个特点:因为异常类和异常对象都被抛出。
      //他们都具有可抛性,这个可抛性是 Throwable 这个体系中独有特点。
      只有这个体系中的类和对象才可以被 throws 和 throw 操作。
    throws 和 throw 区别:
     throws 使用在函数上, throw 使用在函数内。
     throws 后面跟的是异常类,可以跟多个,用逗号隔开。 throw 后跟的是异常对象。


   6. RuntimeException
    这个异常类下的子类,在函数内 throw 了,不用在函数上声明。编译一样通过,如 ArithmeticException
    如果在函数上声明了该异常,调用者不用 try catch 进行处理,编译一样通过。
    Exception 中有一个特殊的子类异常 RuntimeException 运行时异常。
    //子所以不用在函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了
    //无法继续运算的情况,希望程序停止后,对代码进行修正。
    自定义异常时:如果该异常的发生,无法再继续进行运算,就让该自定义类进程 RuntimeException 。
   对于异常分两种:
      1.编译时被检测的异常。
      2.编译时不被检测的异常(运行时异常, RuntimeException 以及其子类)
   7. finally
    finally 中存放的是一定会执行的代码。//通常用于关闭资源。
   8. try 的三种格式
    try         try      try
    {      {       {
    }      }       }
    catch ()             catch()     finally
    {      {       {
    }         }       }
          finally                 //catch是用于处理异常,如果没有catch就代表异常没有被处理
          {   //过,如果该异常是检测时异常。那么必须声明。
          }
   9. 异常在子父类中的体现:
    1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
    2.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
    3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
     如果子类方法发生了异常,就必须要进行 try 处理绝对不能抛。
  10.包 package (文件夹)
    //对类文件进行分类管理。     给类提供多层命名空间。  写在程序文件的第一行。
    //类名的全称是 包名。类名。  包也是一种封装形式。
     建包的命令 javac -d . 类名.java  ———— -d 是文件目录 . 是当前目录 //意思是在当前目录下建立class文件
       //中的第一行 package 文件名,然后把本类存入进去。 
     包与包之间进行访问,被访问的包中的类以及类中的成员,需要 public 修饰,
     不同包总的子类还可以直接访问父类中被 protected 权限修饰的成员。
     包与包之间可以使用的权限只有两种: public 和 protected 。


       public      protected    default    private
   同一个类中    "ok"   "ok"    "ok"        "ok"     
   同一个包中   "ok"   "ok"  "ok"         
   子类              "ok"     "ok"                   
   不同包中   "ok"


  11.import
    导入:为了简化类名的书写,使用了一个关键字, import ,导入的是包中的类。
    //通配符 * ,如 import cn.com.www.*   :只会导入 www 中的所有类文件,不会导入 www 中的包及包下又有的类文件。
    导类,不导包。
    如果不导入包,要这样建立对象Demo d = new cn.com.www.Demo();// 很麻烦
    在类名前第一行写上 import cn.com.www.*;  后,可以直接建立对象:Demo d = new Demo();
  12.jar包
    java的压缩包。//方便项目携带。方便与使用,只要在classpath 设置jar路径即可。
         //数据库驱动,SSH 框架等都是以 jar 包体现的。
    dos 下输入 jar 即可出现 jar 相关使用方法。jar -cf haha.jar pcka pckb pckc
      //-c  创建新的归档文件 -f  指定归档文件名——|    |      |     |    |
            这个是要打的jar包名字——————————————————————      |     |    |
                      这些要打在一起的包名(文件夹名)————————————————
    //把classpath设置成 jar 包所在的地方,set classpath=jar包的绝对路径,就可以直接运行其中的 class 文件。
    java的类库 jre文件夹下的 rt.jar

 

 

-------------------android培训、java培训、期待与您交流! --------------------

原创粉丝点击