核心技术读书笔记----第5章 继承(一)

第5章 继承(一)

1、super:当希望子类调用超类的方法时,使用**super.方法名**super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特殊关键字。

public double getSalary(){
    double baseSalary=super.getSalary();
    return baseSalary+bonus;
}

2、子类构造器:子类构造器不能访问超类私有域,必须利用超类构造器对这部分私有域进行初始化,并且此语句必须是子类构造器的第一句话。如果子类没有显示调用超类构造器,则自动调用超类默认构造器。构造函数必须出现在第一行上,注定了只能调用一个构造函数。

public Manager(String name,double salary,int year,int month,int day){
    super(name,salary,year,month,day);
    bonus=0;
}

3、this作用:1.引用隐式参数 2.调用该类其他的构造器
super作用:1.调用超类方法 2.调用超类构造器
注意:调用构造器的语句只能作为另一个构造器的第一条语句出现;构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器。

4、引用论坛

java规定,在执行构造函数之前必须执行父类的构造函数,直到这个类是java.lang.Object类的构造函数。
然而函数的入口是子类构造函数,因此任何构造函数第一句必须是执行父类构造函数,如果没有添加super关键字,那么编译器会为该构造函数第一句添加一个super()语句(你可以这么理解,当然编译以后并不是这样)。如果有super关键字显示的调用父类构造函数,就是用指定的那个父类构造函数,否则使用默认的无参数构造函数。也有一种情况例外,就是存在this关键字,调用本类其它构造函数,但是按照递归调用,最终还是会调用父类构造函数。
如果你继承的父类没有无参数构造函数,那么你这个类第一句必须显示的调用super关键字来调用父类对应的有参数构造函数,否则不能通过编译。调用本类或者父类的构造函数,必须在构造函数的第一句,或者逻辑上的第一句。

/*
作者:mys
功能:在执行子类构造函数前必须先执行父类的构造函数
日期:2018/7/19
 */
package cn.mys;

public class Text7 {
    public static void main(String []args){
        Father father=new Father(40,"sky");
        System.out.println("father:"+father.getName()+" "+father.getAge());
        Son son=new Son(19,"mys");
        System.out.println("father:"+son.getName()+" "+son.getAge());
    }
}
//超类
class Father
{
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
    //无参构造函数
    public Father(){}
    //带参构造函数
    public Father(int age, String name) {
        this.age = age;
        this.name = name;
        System.out.println("超类构造函数");
    }
}
//子类
class Son extends Father{
    public Son(int age, String name){
        super(age,name);//调用超类构造函数初始化超类私有域
        System.out.println("子类构造函数");
    }
}

5、一个变量可以指示多种实际类型的现象称为多态,在运行时能自动调用哪个方法的现象叫动态绑定。在Java中,不需要将方法声明为虚拟方法,动态绑定是默认的处理方式,如果不希望一个方法具有虚拟方法的特征,则标记为final。

6、由一个公共类派生出来的所有类的集合称为继承层次;在继承层次中,从某个特定的类到祖先的路径称为该类的继承链。一个祖先类可以有多个子孙继承链,Java不支持多继承

7、置换法则:“is a ”程序中出现超类对象的任何地方都可以用子类对象替换,可以将一个子类的对象赋值给超类。
在Java中,对象变量是多态的,一个超类变量可以引用一个超类对象,也可以引用超类的任一个子类对象,不能将一个超类的引用赋值给子类对象
子类数组的引用可以转换成超类数组的引用,而不需要采用强制转换。注意:所有数组都要牢记创建他们的元素类型,并负责监督仅将类型兼容的引用存到数组中。

//超类变量可以引用超类的任一个子类对象
Employee e;
e=new Employee(...);
e=new Manager(...);//ok
//不能将一个超类的引用赋值给子类对象
Manager boss=new Manger(...);
Employee []staff=new Employee[3];
boss=staff[0];//变量staff[0]与boss引用同一个对象
Employee e=staff[0];//Error
//子类数组的引用可以转换成超类数组的引用,而不需要采用强制转换。
Manager []managers=new Manager();
Employee []staff=managers;

8、方法的调用
1)编译器查看对象的声明类型和方法名
2)编译器查看调用方法时提供的参数类型
重载解析:在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法,这个过程叫重载解析
方法的签名:方法的名字和参数列表
3)如果是private、public、final或者构造器,那么编译器可以准确知道应该调用那个方法,此调用方式称为静态绑定
4)当程序运行时,并采用静态绑定的方式,虚拟机一定调用与其引用对象的实际类型最合适的那个类方法。虚拟机事先为每个类创建一个方法表,其中列出所有方法的签名和实际调用方法。如果调用super.f(),编译器将对隐式参数超类的方法表进行搜索。

9、动态绑定无需对现存的代码进行修改,就可以对程序进行扩展。在覆盖一个方法时,子类方法不能低于超类方法的可见性。

10、final
1)不允许扩展的类称为final类
2)域可以被声明为final,但对域来说,构造对象之后就不能改变它的值
3)如果将一个类声明为final,只有其中的方法自动成为final,而不包括域。
4)为了避免动态绑定带来的系统开销而使用final

扫描二维码关注公众号,回复: 2268379 查看本文章

11、只能在继承层次内进行类型转换;在将超类转换成子类之前,应先使用instanceof进行检查

猜你喜欢

转载自blog.csdn.net/mys_mys/article/details/81109363