A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangyuyus 中级黑马   /  2013-11-12 13:42  /  999 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • class Super
  • {
  •         int i = 20;
  •         public Super(String a)
  •         {
  •                 i=1;
  •         }
  •         public Super()
  •         {
  •                 System.out.println("b  "+i);//b  20
  •                 i += 2;
  •                 System.out.println("c  "+i);//c  22
  •         }
  • }
  • class Demo extends Super
  • {
  •         public Demo (String a)
  •         {
  •                 System.out.println("d  "+i);//d  22
  •                 i = 5;
  •                 System.out.println("e  "+i);//e  5
  •         }
  •         public static void main(String[] args)
  •         {
  •                 int i = 4;
  •                 System.out.println("a  "+i);//a  4
  •                 Super d=new Demo("A");
  •                 System.out.println("f  "+i);//f  4
  •                 System.out.println(d.i);//5
  •         }
  • }

复制代码

  • class Super
  • {
  •         int i = 20;
  •         public Super(String a)
  •         {
  •                 i=1;
  •         }
  •         public Super()
  •         {
  •                 System.out.println("a  "+i);//a  20
  •                 i += 2;
  •                 System.out.println("b  "+i);//b  22
  •         }
  • }
  • class Demo extends Super
  • {
  •         static int i = 4;
  •         public Demo (String a)
  •         {
  •                 System.out.println("c  "+i);//c  4
  •                 i = 5;
  •                 System.out.println("d  "+i);//d  5
  •         }
  •         public static void main(String[] args)
  •         {
  •                 Super d=new Demo("A");
  •                 System.out.println("e  "+i);//e  5
  •                 System.out.println(d.i);//22
  •         }
  • }

复制代码

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

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

4 个回复

倒序浏览
FFF 金牌黑马 2013-11-12 14:02:08
沙发
一个是int i = 4;未被静态修饰,就不是同一个i、他所做的改变不会改变demo里面的i。
一个是static int i = 4;一个被静态修饰了。所有的改变都是同一个i,对demo里的i有效。

点评

哟西!爱你  发表于 2013-11-12 17:24
回复 使用道具 举报
楼主,其实在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中只有成员方法有多态,可以被覆盖,也是动态绑定,是根据运行时的具体实例的类来加载方法。但是成员变量则不可以被覆盖,只能继承,是静态绑定,是根据编译时看到的引用类型确定使用哪个类的成员变量的。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马