Java核心技术读书笔记5-1 类的继承关系和访问
1.类,超类,子类
1.1 super关键字:super关键字可以在子类中使用以获取超类的public属性和方法。可以用于重写超类方法时获取超类的方法逻辑。
@Override
public String getName() {
System.out.println(super.getName());
System.out.println(this.name);
return name;
}
super在使用时与this类似,但实际上是完全不同的。super用来获取超类的原生方法逻辑,或域的初值,仅此而已。
而this关键字是调用函数时的隐变量,代表的是当前调用对象。所以this不仅可以调用本类的方法和域,还可以作为对象返回。
public Manager getMyself(){
return this;
}
// 以下写法会报错
// public Employee getMySuperClassObj(){
// return super;
// }
Manager m = new Manager();
Manager myself = m.getMyself();
System.out.println(m == myself); //true
1.2 重写与重载
重写:在Java中,方法的名字和参数列表称为方法的签名。Java允许子类具有与超类同名且方法签名相同的方法。这称为重写或覆盖。覆盖时,子类方法不能低于超类方法的可见性。重写不允许返回类型不同,返回类型不属于方法签名。
重载:Java允许同一类或与超类具有多个相同名字但是不同参数列表的方法,这称为重载。
1.3 super构造器:如果子类继承了超类,那么对于超类的私有域是无法访问的,所以可以通过调用超类构造器的形式为这些域赋值:super(parameters..); 会根据相应的参数调用超类构造器,且这个语句必须是子类构造器的第一句。若子类没有显示调用超类构造器,则自动调用超类无参构造器,此时若超类没有无参构造器,则报错。
1.4 多态
多态:对于一个超类类型的变量,其既可以引用本类型的对象,也可以引用子类类型的对象,这种现象被称为多态。可以用(a instanceof A)返回的boolean值来判断a是否是A的对象,或者a的类型是否是A的子类。超类数组类型变量可以直接引用子类数组类型变量。
动态绑定:对于一个超类类型的变量,在调用一个子类和超类共有的同名方法时(说明子类有对该方法进行重写),会根据其实际引用的对象调用其方法。这种现象被称为动态绑定,即只有在运行时才可确定变量调用的方法来自于哪。
静态绑定:当变量调用的是private/static/final方法时,编译器在编译期就可确定调用的那个方法,因此称为静态绑定。
方法表:JVM定义了方法表列出了所有方法的签名和实际调用的方法,以便真正调用方法时可以更快完成。
1.5 继承层次:由一个公共超类派生出来的所有类的集合被称为继承层次,从某个特定的类到其祖先的路径被称为该类的继承链。
1.6 final类和方法
final修饰域:变量变为常量,初始化后便不可以在修改。
final修饰方法:子类不可以覆盖这个方法。
final修饰类:final类不可以被继承,同时final类的方法也都被设置为final方法。
1.7 内联与即时编译
内联:如果一个方法没有被覆盖而且很短,那么编译器就可以对他进行优化。如将调用getName()方法替换为访问name域。但方法的重写覆盖了这个特性。
即时编译:JVM的即时编译器可以准确的知道类间的继承、覆盖关系,如果调用的方法满足内联特性且此时方法还没有被覆盖或者调用的是超类的方法,那么久启用内联。若此时加载了一个子类对方法进行了覆盖则会再取消内联。
1.8 抽象类与抽象方法
抽象类:一种派生其它类的基类,不会作为想使用的特定实例类,也不可实例化创建对像。但可以创建抽象类型的变量,使用规则类似于没有父类对象的父类。
抽象方法:使用abstract关键字修饰的方法,没有方法体与对应的括号。包含一个或多个抽象方法的类必须是抽象类,但抽象类一样可以包括具体数据和方法。只有子类全部实现抽象方法后子类才可以不作为抽象类,否则子类必须仍是抽象类。
1.9 可见性控制
private:仅本类可见
public:所有类可见
protected:对本包和子类可见,应谨慎使用,因为子类继承是无限制的。
default(不加修饰符):对本包可见
浙公网安备 33010602011771号