引言
在学习到Java继承时,对子类覆盖父类方法,然后互相调用有点迷糊。因此上网查找资料,在网上看到这样对一段代码对我有所启发。
- 示例1
class SuperClass{
private int x = 5;
private int y = 5;
private int z = 3;
SuperClass(int x){
this.x = x;
}
public int getZ(){
System.out.println("调用父类的getZ");
return x/y;
}
public void show(){
System.out.println("x = "+x);
System.out.println("y = "+y);
System.out.println("z = "+getZ());
}
}
class SubClass extends SuperClass{
private int x = -1;
private int y = -2;
private int z = -3;
SubClass(int x){
super(x);
}
public int getZ(){
System.out.println("调用子类的getZ");
return x+y;
}
}
public class Test{
public static void main(String[] args){
SuperClass s1 = new SuperClass(10);
SubClass s2 = new SubClass(10);
s1.show();/*x = 10
y = 5
调用父类的getZ
z = 2*/
s2.show();/*x = 10
y = 5
调用子类的getZ
z = -3*/
}
}
可以看到,父类对象s1调用show()方法与子类对象s2调用show()方法结果的不同。s1调用show方法就是正常的调用,不做解释。当s2调用show()方法时,会在本类(SubClass)中查找此方法,如果没有,则在父类中查找此方法。此时System.out.println("x = "+x);
与System.out.println("y = "+y);
中的字段x和y都是用的父类中的值,所以会输出10与5。由于子类的getZ方法覆盖掉了父类的getZ方法,所以System.out.println("z = "+getZ());
中的getZ方法又会先在子类中寻找,如果找到了,则使用子类中的字段值打印输出,所以会出现-3。
当一个类继承于另一个类,且子类中没有父类的方法时,用子类对象调用方法时,首先会在子类中查找,如果子类中没有该方法,再到父类中查找。
当一个方法只在父类中定义时,调用该方法时会使用父类中的字段值(属性)。如果该方法又调用了其他方法(该方法被子类覆盖),那么还是按照之前的顺序,先在子类中查找,再在父类中查找。
- 示例2
我们将父类中的getZ方法的访问权限变成private,其他代码不变。s2.show()输出的结果变成
x = 10
y = 5
调用父类的getZ
z = 2
那是因为此时父类中的getZ方法并没有被子类继承,所以也不存在被覆盖的情况,System.out.println("z = "+getZ());
语句使用的就是本类的getZ方法。