当前位置:首页 > 开发 > 编程语言 > Java > 正文

Java继承的一点问题

发表于: 2010-05-30   作者:酷的飞上天空   来源:转载   浏览:
摘要: 偶然间看到这篇将java继承的文章觉得比较有趣,所以记下来备忘 文章地址http://www.iteye.com/topic/180601   看下面代码的输出 public class Test1 { int i = 1; public void say(){ System.out.println(i); } } public class

偶然间看到这篇将java继承的文章觉得比较有趣,所以记下来备忘

文章地址http://www.iteye.com/topic/180601

 

看下面代码的输出

public class Test1 {
       int i = 1;
	public  void say(){
		System.out.println(i);
	}
}

public class Test2 extends Test1{
	int i = 2;
	public static void main(String []args){
		new Test2().say();
	}
}

不看上面的帖子,你能猜到会输出几么?

答案是:1

 ps:即使Test1中i为private 那也是输出1。不信可以自己测试

 

如果你的答案也是1,那么恭喜你答对了。可以不用往下看了。

 

现在有两个问题:

1.为什么输出的是1,而不是2?

2.Test1到底有没有被创建对象?也即是说new Test2()这句创建了几个对象。

 

先说第二个问题

到底创建了几个对象呢? 答案当然是一个。从DEBUG运行可知,自始至终只有一个this,只是里面有两个名称为i的变量。但一个对象里面是不可能出现两个重名的可见变量的,所以有一个必然被隐藏,毫无疑问自然是父类的i变量。

这里有一个本质的问题,那就是调用一个类的构造方法是对类的实例化么?从对象的初始化顺序可知父类的构造方法是优先子类被调用的。我的理解是父类构造方法的调用是为了对其实例变量的初始化,地球人都知道实例变量的初始化总是在构造方法中进行。

 

 

再说第二个问题

因为多态只发生在方法的调用上,和变量没关系。所以和多态无关。那么这也只能从语言上面解释了,即父类对其类变量的调用结果不会受其子类同名变量的影响。

 

下面代码输出说明多态只发生在方法之上

public class Test1 {
    int i = 1;
	public  void say(){
		System.out.println(i);
	}
}

public class Test2 extends Test1{
	int i = 2;
	public static void main(String []args){
		Test1 t = new Test2();
		System.out.println(t.i);
	}
}
/*
  output:
  1
*/

 

 以上仅供参考,个人一点理解。

如果我理解有误请告诉我,只是希望自己不要对别人产生误导。

 

Java继承的一点问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号