Java 继承

extends 继承

  1、继承是什么,为什么继承

    使用 extends 父类

    子类继承父类,代码可以得到复用

    使用继承机制可以做到方法的覆盖和多态机制

    继承也是存在缺点的:耦合度高,父类修改,子类受牵连

  2、继承的相关特性

    ① B类继承A类,则称A类为超类(superclass)、父类、基类,B类则称为子类(subclass)、派生类、扩展类。
        class A{}
        class B extends A{}
      我们平时聊天说的比较多的是:父类和子类。
        superclass 父类
        subclass 子类

    ② java 中的继承只支持单继承,不支持多继承,C++中支持多继承,
      这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码:
      class B extends A,C{ } 这是错误的。

    ③ 虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,
      例如:class C extends B,class B extends A,也就是说,C 直接继承 B,其实 C 还间接继承 A。

    ④ java 中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。
      但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中直接访问。可以通过间接的手段来访问。)

    ⑤ java 中的类没有显示的继承任何类,则默认继承 Object类,Object类是
      java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有
      Object类型中所有的特征。

    ⑥ 继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它们之间的耦合度非常高,Account 类发生改变

      之后会马上影响到 CreditAccount 类

  3、子类继承父类之后,能使用子类对象调用父类方法吗?

    可以,因为子类继承了父类之后,这个方法就属于子类了。

    本质上,子类继承父类之后,是将父类继承过来的方法归为自己所有。

    实际上调用的也不是父类的方法,是他子类自己的方法(因为已经继承过来了就属于自己的。)

  4、什么时候继承

    凡是采用“is a”能描述的,都可以继承。

    例如:
      Cat is a Animal:猫是一个动物
      Dog is a Animal:狗是一个动物
      CreditAccount is a Account:信用卡账户是一个银行账户
    ....

    
假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码,那么他们两个之间就可以继承吗?

      不一定,还是要看一看它们之间是否使用is a来描述。

      class Customer{
        String name; // 名字
        // setter and getter
      }

      class Product{
        String name; // 名字
        // setter and getter
      }

      class Product extends Customer{
      }

      以上的继承就属于很失败的。因为:Product is a Customer,是有违伦理的。

  5、默认继承的 Object 类

      JDK源代码在什么位置?   C:\Program Files\Java\jdk-13.0.2\lib\src.zip

      你现在能看懂以下代码了吗?

        System.out.println("Hello World!");

        System.out 中,out后面没有小括号,说明out是变量名。

        另外System是一个类名,直接使用类名System.out,说明out是一个静态变量。

        System.out 返回一个对象,然后采用“对象.”的方式访问println()方法。

      Object类当中有很多方法,大部分看不懂,其中有一个叫做toString()的,我们进行了测试,发现:
        System.out.println(引用);
        当直接输出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后输出toString()方法的执行结果。

 

// 对于本章节内容来说,难点主要是类和类继承之后的代码执行顺序,请看程序:
public class Test {
    public static void main(String[] args) { 
        new H2(); 
    } 
}
class H1{ 
    { System.out.println("父类代码块"); 
    } 
    public H1() { 
        System.out.println("父类构造");
    } 
    static{ 
        System.out.println("父类静态代码块"); 
    } 
} 
class H2 extends H1{ 
    static{ System.out.println("子类静态代码块"); 
    } 
    {
        System.out.println("子类代码块"); 
    } 
    public H2(){ 
        System.out.println("子类构造"); 
    } 
}
    /*我们对以上的程序进行分析,子类H2继承H1,new H2()执行的时候,会先进行类加载,
    先加载H2的父类H1,所以H1当中的静态代码块先执行,然后再执行H2中的静态代码块,
    静态代码块执行结束之后,不会马上执行构造方法,代码块会先执行,
    Java中有一条规则:子类构造方法执行前先执行父类的构造方法
    (学习super之后大家就知道了),所以父类H1的代码块先执行,再执行H1的构造方法,
    然后再执行H2的代码块,最后执行H2的构造方法。
    我们对以上程序进行编译并运行,请看下图结果:*/

 

posted @ 2020-08-30 16:01  一叶扁舟,乘风破浪  阅读(422)  评论(0编辑  收藏  举报