概述
这是一个很经典的案例,在这里我拿出来分享一下。大部分人做这道题都会出错的。
首先,定义一个父类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
最后
以上就是顺利期待为你收集整理的this变量的全部内容,希望文章能够帮你解决this变量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复