this变量

这是一个很经典的案例,在这里我拿出来分享一下。大部分人做这道题都会出错的。

首先,定义一个父类Base:定义额一个i变量,一个没有参数的构造函数,并在构造函数中调用display()函数

package javaExperice;

public class Base {
	private int i=2;
	public Base(){
		this.display();
	}
	public void display()
	{
		System.out.println(i);
	}
}

接着,定义一个子类Derived类,与父类差不多,定义了一个变量i,一个没有参数的构造函数,并在构造函数中给i赋值为222.

package javaExperice;

public class Derived  extends Base{
	private int i=22;
	public Derived(){
		i=222;
	}
	public void display(){
		System.out.println(i);
	}
}
最后做一个测试类:只new 了一个子类对象而已。

package javaExperice;

public class Base_DerivedTest {
	public static void main(String[] args) {
		new Derived();
	}
}
结果:

大部分的人会猜这道题很简单啊,不就是在new对象的时候调用子类的构造函数,而子类的构造函数要首先调用父类的没有参数的构造函数,因此赋值给i的是222,所以结果应该为222.但是正确答案是什么呢?答案既不是2,也不是22,也不是222,答案结果却是0.为什么会这样呢。我们需要详细的解答一下代码的执行流程:

1.调用子类的构造函数,子类的构造函数先调用父类的构造函数。因此调用父类的构造函数,执行变量i的初始化,此时i=2,接着调用display函数,但那是构造函数的this指的是谁?this是调用的就是谁,故名思议,this在子类的构造函数中,因此this 是Derived实例,到那时又在父类构造函数,因此编译类型是Base。相当于多台函数Base b=new Dervied();因此this调用的是子类重写的display();

因此结果是0


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值