黑马程序员技术交流社区

标题: 多态,成员变量 [打印本页]

作者: 史政法    时间: 2013-2-16 08:13
标题: 多态,成员变量
本帖最后由 史政法 于 2013-2-20 06:28 编辑
  1. class Super
  2. {
  3.         int i = 0;
  4.         public Super()
  5.         {
  6.                 System.out.println("b");
  7.                 i=2;
  8.         }
  9. }

  10. class Demo3 extends Super
  11. {
  12.         public Demo3(String a )
  13.         {
  14.                 System.out.println("c");
  15.                 i=5;
  16.         }
  17.         public static void main(String[] args)
  18.         {
  19.                 Super d = new Demo3("a");
  20.                 System.out.println(d.i);
  21.         }
  22. }
复制代码
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。

打印结果为什么i=5?

内存中是怎样运行的?图释更好.


作者: 逍林游    时间: 2013-2-16 09:03
构造函数哪来的多态啊!
i=5必须的
作者: 张洪慊    时间: 2013-2-16 09:41
本帖最后由 张洪慊 于 2013-2-16 10:56 编辑

运行结果:
b
c
5
首先注意在子类Demo3中的 i 是从父类继承的i
i首先默认值为0-->显式初始化i=0;-->父类构造函数i=2-->在子类构造函数中i=5(对父类的 i 操作)

无论编译和运行,都参考左边Super(引用型变量所属的类)。
我如果在上面的Demo3中加入
int i=10;//子类的成员变量i
在堆内存中:
new Demo3("a");中的成员分两块:子类的i 和 从父类继承的 i//关于这一点 老毕在继承中提到过 即使是private也是
此时打印结果:
b
c
2
这时候在构造函数Demo3 的 i=5;是对子类成员变量i的赋值
而父类的成员变量i经过i=0(默认)-->i=0(显式)-->i=2
运用那个理论无论编译和运行,都参考左边Super(引用型变量所属的类)。
作者: 胥文    时间: 2013-2-16 09:58
public class Super {

        int i =0;
        Super()
        {
                System.out.println("b");
                i=2;
                System.out.println(i);
        }
       
}
public class Demo extends Super {

        /**
         * @param args
         */
        Demo(String a)
        {
                System.out.println("c");
                i=5;
        }
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Super d = new Demo("a");//对象一建立就初始化,就是调用构造函数,先是把2赋给i,然后把5赋给i,所以i的输出结果等于5
                                                                      //输出的结果是b,2,c,5,从这个也可以看出赋值的过程
                System.out.println(d.i);
        }

}

作者: 史政法    时间: 2013-2-16 10:06
张洪慊 发表于 2013-2-16 09:41
运行结果:
b
c

初始化完毕Super类之后,i = 2;
然后开始子类初始化,这个时候不应该子类的里面也有一个i = 2,是从父类继承过来的吗?为什么是直接对父类的i操作,而不是继承过来后在子类里面进行构造?
真崩溃,越学越倒数,没救了,以前看一遍以后做视频题还能做出来,现在再回过去看,看完做题做不出来了,知识点混淆了,,,,,,
作者: 朱玉玺    时间: 2013-2-16 10:23
i的值变化了三次,调用demo的构造函数时,该构造函数第一行会调用super()语句,调用的结果是i=2,下边有有一句i=5,所以最后的结果是i=5,注意这里边一直改变的是父类的 i 哦。如果你把b和c都换成i,会发现它们的值分别为0和2.
作者: 张洪慊    时间: 2013-2-16 10:45
本帖最后由 张洪慊 于 2013-2-16 11:00 编辑
史政法 发表于 2013-2-16 10:06
初始化完毕Super类之后,i = 2;
然后开始子类初始化,这个时候不应该子类的里面也有一个i = 2,是从父类 ...

继承之后 在堆内存中:
new Demo3("a");
中的成员变量 只有一个 为从父类继承的 i
也就是说一直是对从父类继承的变量 i 操作- -

紧紧抓住 此时对象中的 成员变量 只有一个 这个是从父类继承的成员变量i (它同时也是父类的成员变量)
作者: 史政法    时间: 2013-2-16 11:02
张洪慊 发表于 2013-2-16 10:45
继承之后 在堆内存中:
new Demo3("a");
中的成员变量 只有一个 为从父类继承的 i

呵呵呵呵呵呵呵呵,真是有够蛋疼,又重新回过头去看了N遍视频,原理一点都没错,,,是我竟然连成员和局部都认不清了,,始终操作的只有成员一个,继承的是成员,跟局部没半点关系,知识点多了就是个悲剧,,,,,,谢了,哥们,还有楼上的众兄弟,不是不知道隐式Super,构造什么的,是一时大脑短路,搞不清成员和局部了。
作者: 张洪慊    时间: 2013-2-16 11:09
史政法 发表于 2013-2-16 11:02
呵呵呵呵呵呵呵呵,真是有够蛋疼,又重新回过头去看了N遍视频,原理一点都没错,,,是我竟然连成员和局 ...

同学,不要着急,关键你要把视频中的知识点 详细总结下 额 有利于 日后复习,即使当时理解了,由于不用,慢慢又淡忘了.时常复习下就好, 一定要做好笔记,视频多看几遍也是值得的.
作者: 张洪慊    时间: 2013-2-16 11:11
张洪慊 发表于 2013-2-16 11:09
同学,不要着急,关键你要把视频中的知识点 详细总结下 额 有利于 日后复习,即使当时理解了,由于不用,慢慢 ...

话说你头像吓我一跳~~;P我还以为是毕老师来了!!!太虎了
作者: 马铿    时间: 2013-2-18 17:02
本帖最后由 马铿 于 2013-2-18 17:09 编辑

因为子类继承了父类,子类就拥有父类的成员,子类已经继承了父类的  i   变量。子类调用自己的构造函数,有一条隐式的父类空构造函数
public Super()

        {

                System.out.println("b");

                i=2;

        }

然后再调用自己的构造函数内容
System.out.println("c");
i=5;
有个赋值 i = 5

所以打印结果为5




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