黑马程序员技术交流社区

标题: 覆盖的问题,结果疑惑 [打印本页]

作者: wangyuyus    时间: 2013-11-12 13:42
标题: 覆盖的问题,结果疑惑

复制代码


复制代码

一个结果是5
一个结果是22为什么是这个结果呢?

作者: FFF    时间: 2013-11-12 14:02
一个是int i = 4;未被静态修饰,就不是同一个i、他所做的改变不会改变demo里面的i。
一个是static int i = 4;一个被静态修饰了。所有的改变都是同一个i,对demo里的i有效。
作者: 文涛    时间: 2013-11-12 16:45
楼主,其实在java的多态机制中,多态是仅限于成员方法的,成员变量没有多态特性,也就是说不能动态绑定,成员变量不存在覆盖一说,父类的就是父类的,子类的就是子类的,这是静态绑定的。成员变量可以继承,也可以子类自己定义,但是子类就算自己定义了也不能覆盖父类的成员变量。
    什么是静态绑定,也就是说,那个引用调用的该成员变量就返回那个引用对应类的成员变量,也就是说成员变量和类是永久绑定的,而方法不同,方法是看调用它的具体对象的类型,就算是父类引用在调用但是实际是子类的对象在调用那么也会动态绑定到子类的方法。明白了这一点这个题就简单了。
   虽然你在子类中定义了一个静态的i变量,但是成员变量并不会覆盖掉父类的变量,所以当你调用父类的构造方法时,父类会去操作自己的成员变量而不是子类的。同样 System.out.println("e  "+i);输出5也就非常正常,因为你是在子类中调用的i变量,自然就调用了子类的i。你最困惑的可能是最后一句话 System.out.println(d.i);//22,这句话为什么会输出22,很简单,因为你定义的Super d=new Demo("A");,d是一个父类的引用,对于没有多态的成员变量来说,他是静态绑定的,他只看引用的类型,所以d.i会调用父类的i变量。自然就输出了22
    总之,java中只有成员方法有多态,可以被覆盖,也是动态绑定,是根据运行时的具体实例的类来加载方法。但是成员变量则不可以被覆盖,只能继承,是静态绑定,是根据编译时看到的引用类型确定使用哪个类的成员变量的。
作者: 黄炳期    时间: 2013-11-12 17:25
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2