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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史政法 中级黑马   /  2013-2-16 08:13  /  1716 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 史政法 于 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?

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

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

11 个回复

倒序浏览
构造函数哪来的多态啊!
i=5必须的
回复 使用道具 举报
本帖最后由 张洪慊 于 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(引用型变量所属的类)。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
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 09:41
运行结果:
b
c

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

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

紧紧抓住 此时对象中的 成员变量 只有一个 这个是从父类继承的成员变量i (它同时也是父类的成员变量)
回复 使用道具 举报
张洪慊 发表于 2013-2-16 10:45
继承之后 在堆内存中:
new Demo3("a");
中的成员变量 只有一个 为从父类继承的 i

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

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

话说你头像吓我一跳~~;P我还以为是毕老师来了!!!太虎了
回复 使用道具 举报
本帖最后由 马铿 于 2013-2-18 17:09 编辑

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

        {

                System.out.println("b");

                i=2;

        }

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

所以打印结果为5

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马