[Java学习记录]Java父类中访问被子类覆盖的函数的问题

引言

在学习到Java继承时,对子类覆盖父类方法,然后互相调用有点迷糊。因此上网查找资料,在网上看到这样对一段代码对我有所启发。

  1. 示例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。

当一个类继承于另一个类,且子类中没有父类的方法时,用子类对象调用方法时,首先会在子类中查找,如果子类中没有该方法,再到父类中查找。

当一个方法只在父类中定义时,调用该方法时会使用父类中的字段值(属性)。如果该方法又调用了其他方法(该方法被子类覆盖),那么还是按照之前的顺序,先在子类中查找,再在父类中查找。

  1. 示例2
    我们将父类中的getZ方法的访问权限变成private,其他代码不变。s2.show()输出的结果变成
x = 10
y = 5
调用父类的getZ
z = 2

那是因为此时父类中的getZ方法并没有被子类继承,所以也不存在被覆盖的情况,System.out.println("z = "+getZ());语句使用的就是本类的getZ方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值