当前位置:首页 > 开发 > 编程语言 > 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

    震惊

    震惊

编辑推荐
对于大都数Java初学者认为:子类可以继承父类中访问权限设定为public 、protected、default的成员变
先来看看多继承会带来的问题,继承容易导致钻石危机(也称棱形问题),一幅图来说说明: 假设 类A
先看如下一段程序并判断调用函数输出什么?: #include<iostream> using namespace std; clas
java 和某些面向对象语言(如 c++)在实现继承的不同之处在于java只支持单继承,不支持多重继承。即ja
1.首先,我们要知道现实世界中对象主要存在3种关系:包含、关联、继承。 当对象A是对象B的一个组成
继承与合成基本概念 继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的
Java未写继承的类, 默认继承标准基类Object. 每个类都可以包含一个main()静态方法, 用于单元测试.
//仅作为学习笔记 /* 继承: 1,提高了代码的复用性 2,让类与类之间产生关系,有了这个关系,才有
class Base{ private String name = "base"; Base(){ tellName(); printName(name); } public void
先看以下代码的运行结果: // StrangeConstructor.java // A strange behavior of constructor // w
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号