码迷,mamicode.com
首页 > 其他好文 > 详细

this变量

时间:2015-04-16 09:08:42      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:面试 java基础 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


this变量

标签:面试 java基础 this

原文地址:http://blog.csdn.net/u014010769/article/details/45066283

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!