关于继承的一道题目
2007-10-08 21:48
344 查看
在csdn的张孝祥专栏(http://blog.csdn.net/zhangxiaoxiang/archive/2006/08/15/1066757.aspx)上看到张老师出的一道题目,说是会让98%的Java程序员犯难的偏门问题!!
当然,实际上哪有那么夸张,张老师也太低估搞java的了,而且这道题目怎么看我都好象在TIJ中看到过。。。但题目中还是有些细节值得学习学习地。。。
问题:
public class Parent
{
public void test()
{
}
public Parent()
{
test();
}
public static void main(String[] args)
{
new Child();
}
}
class Child extends Parent
{
private int instanceValue = 20;
public void test()
{
System.out.println("instance value is: " + instanceValue);
}
}
各位先猜猜打印的结果是多少呢?为什么呢?
在下面的回复中,我认为这种答案应该是正确的:
当实例化Child时(new Child()),
会调用父类(Parent)的Constructor(构造函数).
而在Parent的constructor中又调用的test()方法,
此方法被子类Child Override了,所以那时会调用
子类的test()方法,而调用的时候,子类的实例化
还没有结束,其instance variable instanceValue还没有被赋值
为20,而int 类型的默认值为0。
因此打印的结果应该是0,而不是20。
这题目确实不难,但有两点引起我的思考:
(1)我在做这题目的时候,在new Child()时居然错误地认为,会先去调用Child类默认的构造函数,而实际上是:当创建派生类的对象时,系统将会调用基类的构造函数和派生类的构造函数,构造函数的执行次序是:先执行基类的构造函数,再执行派生类的构造函数。如果派生类又有对象成员,则,先执行基类的构造函数,再执行成员对象类的构造函数,最后执行派生类的构造函数。
(2)instanceValue 这个变量是不会被赋值20的,但如果题目改为 private static int instanceValue = 20;那答案就应该是20了,因为在编译前就会赋20给这个变量。
当然,实际上哪有那么夸张,张老师也太低估搞java的了,而且这道题目怎么看我都好象在TIJ中看到过。。。但题目中还是有些细节值得学习学习地。。。
问题:
public class Parent
{
public void test()
{
}
public Parent()
{
test();
}
public static void main(String[] args)
{
new Child();
}
}
class Child extends Parent
{
private int instanceValue = 20;
public void test()
{
System.out.println("instance value is: " + instanceValue);
}
}
各位先猜猜打印的结果是多少呢?为什么呢?
在下面的回复中,我认为这种答案应该是正确的:
当实例化Child时(new Child()),
会调用父类(Parent)的Constructor(构造函数).
而在Parent的constructor中又调用的test()方法,
此方法被子类Child Override了,所以那时会调用
子类的test()方法,而调用的时候,子类的实例化
还没有结束,其instance variable instanceValue还没有被赋值
为20,而int 类型的默认值为0。
因此打印的结果应该是0,而不是20。
这题目确实不难,但有两点引起我的思考:
(1)我在做这题目的时候,在new Child()时居然错误地认为,会先去调用Child类默认的构造函数,而实际上是:当创建派生类的对象时,系统将会调用基类的构造函数和派生类的构造函数,构造函数的执行次序是:先执行基类的构造函数,再执行派生类的构造函数。如果派生类又有对象成员,则,先执行基类的构造函数,再执行成员对象类的构造函数,最后执行派生类的构造函数。
(2)instanceValue 这个变量是不会被赋值20的,但如果题目改为 private static int instanceValue = 20;那答案就应该是20了,因为在编译前就会赋20给这个变量。
相关文章推荐
- 一道关于C++ 的面试题目(继承、构造函数以及析构函数)
- 一道关于继承和多态的题目
- 一道关于public,private,protected继承的经典题目
- 一道关于继承的题目
- 一道题目引发的关于c++命名域的问题--Avoid hiding inheried names
- 关于C++临时对象的一道题目
- 关于short的一道简单题目
- [C语言]关于指针和int型的一道题目
- 关于fork的一道题目
- 一道关于竞赛图的题目
- 巨人笔试一道关于多态的题目
- 搜狗一道java题目 关于对象 synchronized 关键字作用在 int, integer
- 网易2009年校园招聘--一道关于<list>的STL题目
- 11,一道关于栈内存分配的题目
- 一道关于多态题目的解析
- [转]一道关于继承的工作机制的试题
- 关于Java的一道内存的题目
- 关于一道题目解法
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- 《深入理解计算机系统》上的一道题目,关于位的。