版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pmcasp/article/details/81317135
super
super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
普通方法中:
没有顺序限制,可以随便调用。
构造方法中:
除了Object类之外其他所有类的构造方法第一句总是super(......)
任何类的构造方法中,若是构造方法的第一行代码没有显式调用super(......),那么Java默认都会调用super(),所以你这里的super(),加不加都无所谓 。
public Test(this,super){......} this指当前对象,super指父类对象 || 这两个都是隐式参数
多层继承(子类-父类-爷爷类...)
今天突然看到了一个两层继承的类,他重写了父类的一个方法,而父类的中的方法又是从爷爷类中重写下来的,顿时蒙圈了。于是自己写了个最简单的例子试验了一下,做个记录。
原理很简单ClassA中有一个方法onCreate(),ClassB继承ClassA,ClassC继承ClassB,并且都重写了这个方法,执行ClassC中的onCreate(),看看输出什么就是了。
public class ClassA {
protected void onCreate(){
System.out.println("It's ClassA's sysout");
}
}
public class ClassB extends ClassA {
@Override
protected void onCreate() {
System.out.println("It's ClassB's sysout");
//super.onCreate();
}
}
public class ClassC extends ClassB {
@Override
protected void onCreate() {
System.out.println("It's ClassC's sysout");
super.onCreate();
}
}
之后增加一个Main类
public class Main {
public static void main(String[] args) {
ClassC c = new ClassC();
c.onCreate();
}
}
第一遍执行的时候注释了ClassB中的super.OnCreate();执行结果为:
It's ClassC's sysout
It's ClassB's sysout
可以看到只执行了 直接父类 ClassB中的onCreate()方法,并没有执行ClassA中的方法。
第二遍执行的时候放开ClassB中的注释,执行结果为:
It's ClassC's sysout
It's ClassB's sysout
It's ClassA's sysout
执行了ClassA中的OnCreate();
另外之前有个概念一直不清晰,子类重写父类方法时,访问级别可以扩大但不能缩小。比如父类是protected,子类可以写成public。
访问级别:
修饰符 | 本类 | 同一个包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
方法修饰符为默认(friendly)时,同一个包下的子类可以重写父类方法,其他包下的子类不能重写父类方法。