Java中父子类的那些事
Java中父子类的那些事
构造方法
1、子类构造方法执行时,都会先执行父类的构造方法,若没有显式地调用父类的构造方法(super()、super(xx)等),则默认是调用了父类的无参构造方法(super());
2、若父类的所有构造方法都被private修饰,则父类相当于是个final类,不能被继承,因为1的原因,子类没法创建对象;
3、创建子类对象时,只是调用了父类的构造方法,并没有创建父类对象;调用构造方法不等于创建对象,只是用于初始化,new关键字只调用了一次,空间只开辟了一块,对象也只创建了一个;
成员变量
1、子类声明了与父类完全一样的成员变量,不会覆盖掉父类的成员变量。而是在子类实例化时,会同时定义两个成员变量,子类也可以同时访问到这两个成员变量(this.i&super.i),但父类不能访问到子类的成员变量(父类不知道子类的存在)。
2、在方法中使用成员变量时,究竟使用的是父类还是子类的成员变量,由方法所在的类决定;即,方法在父类中定义和执行,则访问的是父类的成员变量,方法在子类中定义(包括覆盖父类方法)和执行,则访问的是子类的成员变量。
3、成员变量没有多态的属性,只有非private且非static的实例方法,才能实现运行时的多态。
this和super
1、this.xx代表this所在类的成员变量(即,如果该类被继承,虽然创建出的对象是子类,但this.xx仍指向父类的成员变量)
2、super()和this()均需放在构造方法内第一行
3、从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字,用于指向父类里的变量、方法
成员方法
1、可重写的成员方法才支持多态,不可重写的成员方法(final、private、静态)以及成员变量不支持多态
2、子类重写父类的方法,访问权限不能小于父类(private<protected<public)
总结
Fu fu = new Zi(); fu.xxx,执行的xxx是父的or子的?
xxx是不支持多态的(成员变量、不能被重写的方法),看左边变量;
xxx是支持多态的(能被子类重写的方法),看右边对象;
一个Demo全明白
父类子类分别调用同名成员变量、同名静态方法、同名普通方法
输出:
fu.age = 80 //成员变量看左边变量
Fu static //静态方法看左边变量
Zi hello //被复写的方法看右边对象
zi.age = 40 //成员变量看左边变量
Zi static //静态方法看左边变量
Zi hello //被复写的方法看右边对象