Java继承——类、超类和子类

1.定义子类:

    已经存在的类称为超类、基类或父类

    新类称为子类、派生类或孩子类

2.覆盖方法:

    子类覆盖父类中的同名方法之后,如果想要调用父类中的同名方法可以使用关键字super

    例如:super.getXxxx();

    因为有时候只有调用父类中的同名方法才可以访问父类中的私有域

3.子类构造器:

    在子类构造器中调用父类的构造器:

    例如:

    public Manager(String name,double salary,int year,int month,int day){

        super(name,salary,year,month,day);

        bonus = 0;

    }

    super调用构造器的语句必须是子类构造器的第一句

    一个对象变量可以指示多种实际类型的现象被称为多态

    在运行时能够自动地选择调用哪个方法的现象称为动态绑定

4.继承层次:

    由一个公共超类派生出来的所有类的集合称为继承层次

    从某个特定的类到其祖先的路径被称为该类的继承链

5.理解方法调用:

    编译器查看对象的声明类型和方法名

    编译器将会一一列举该类中名为XXX的方法和其超类中访问属性为public且名为XXX的方法

    编译器还将查看调用方法时提供的参数类型,就是在所有名为XXX的方法中查找一个与提供的参数类型完全匹配的方法,这个过程被称为重载解析

    如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,这种调用方式成为静态绑定

    每次调用方法都要进行搜索,时间开销相当大,因此虚拟机先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法

    动态绑定有一个非常重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展

    在覆盖一个方法的时候,子类方法不能低于超类方法的可见性

6.阻止继承:final类和方法:

    final类中的所有方法自动地成为final方法,但是不包括域

    如果一个方法没有覆盖并且很短,编译器就能够对它进行优化处理,这个过程为称为内联

    例如:内联调用e.getName()将被替换为访问e.name域

    虚拟机中的即时编译器可以准确地知道类之间的继承关系,并能够检测出类中是否真正存在覆盖给定的方法

    如果方法很简短、被频繁调用且没有真正地被覆盖,那么即时编译器就会将这个方法进行内联处理

    如果虚拟机加载了另一个子类,而在这个子类中包含了对内联方法的覆盖,那么优化器将取消对覆盖方法的内联

7.强制类型转换:

    在进行类型转换之前,先查看一下是否能够成功地转换

    例如:if(staff[1] instanceof Manager){

                  boss = (Manager) staff[1];

              }

    对象类型转换的要求:

        只能在继承层次内进行类型转换

        在将超类转换成子类之前,应该使用instanceof进行检查

8.抽象类:

    包含一个或多个抽象方法的类本身必须被声明为抽象的

    抽象方法充当占位的角色,它们的具体实现在子类中

    抽象类不能被实例化

9.受保护访问:

    超类中的某些方法允许被子类访问,或允许子类的方法访问超类的某个域,为此需要将这些方法或域声明为protected

    仅对本类可见——private

    对所有类可见——public

    对本包和所有子类可见——protected

    对本包可见——默认

猜你喜欢

转载自blog.csdn.net/qq_38386085/article/details/80739507