首先,我觉得自己以前对继承的理解有误区。继承并不是子类构造了一个父类中已有的类型
的对象,并持有了这个对象的引用,无论是哪种访问权限控制符修饰的。而是父类中已有的对象的引用
对子类而言是否能够直接调用。
继承的作用:
父类中可访问的引用(public、protected)能够在子类中直接调用,不必通过对象引用.X
的方式调用。父类中的引用并没有被子类复制一份,只是对子类可见,可操作。
public class X {
}
public class A {
protected X x = new X();
}
public class B extends A {
public X getSuperX(){
return super.x;
}
public X getX(){
return this.x;
}
public void changeX(){
this.x = new X();
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
System.out.println(b.getSuperX());
System.out.println(b.getX());
b.changeX();
System.out.println(b.getSuperX());
System.out.println(b.getX());
}
}
D:\software\IntelliJ\jbr\bin\java.exe -javaagent:D:\software\IntelliJ\lib\idea_rt.jar=51384:D:\software\IntelliJ\bin -Dfile.encoding=UTF-8 -classpath E:\javaWorkSpace\untitled\out\production\untitled Main
X@568db2f2
X@568db2f2
X@378bf509
X@378bf509
Process finished with exit code 0
能够直接调用的引用可以被子类重写,重写后,子类将不能直接调用,转而需要通过super
关键字进行调用。
super关键字
super
关键字是java提供给子类的一个父类对象的引用,用以访问父类的引用
。可以调用父类的构方法以及被子类重写的引用等。
关于super,有如下一段话:
super关键字在java中的作用是使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量或成员方法,super只是记录在对象内部的父类特征(属性和方法)的一个引用。啥叫被屏蔽的成员变量或成员方法?就是被子类重写了的父类的protected和public修饰的方法和成员变量,由于被重写了,所以就称作被屏蔽。