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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2014-6-24 21:28  /  2289 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 我为你着迷 于 2014-6-24 22:28 编辑
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(String a)
  5.         {
  6.                 System.out.println("A");
  7.                 i=1;
  8.         }
  9.         public Super()
  10.         {
  11.                 System.out.println("B");
  12.                 i+=2;
  13.         }
  14. }

  15. class Demo extends Super
  16. {
  17.         public Demo(String a)
  18.         {
  19.                 System.out.println("C");
  20.                 i=5;
  21.         }
  22.         public static void main(String[] args)
  23.         {
  24.                 int i=4;
  25.                 Super d=new Demo("A");
  26.                 System.out.println(d.i);
  27.         }
  28. }
复制代码
大家好 这个程序的运行结果是B C 5
System.out.println(d.i);这句话打印的结果是5 。我的问题是d.i是啥意思啊 尼玛 给我看蒙了啊。KAO。
为什么不是直接输出System.out.println(i);呢?还是父类的引用在调用变量,那么如果是这样的话那运行应该走的是父类中的变量啊 应该是2吧  麻烦各路仁兄JAVA大神帮小弟解答下内心疑惑  3Q

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

12 个回复

倒序浏览
i是局部变量而非成员变量,这是多态的性质,局部变量在多态中,运行结果为子类的值,编译看左边,运行看右边,所以很正常结果为5,父类引用指向子类对象。如果直接输出i,结果应该为4,局部中有就不到其他地方找,视频中都有讲解。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
class Demo extends Super
{
        public Demo(String a)
        {
                System.out.println("C");
                i=5;
        }
        public static void main(String[] args)
        {
                int i=4;//此处是给Demo类的属性i赋值
                Super d=new Demo("A");//先进构造函数Super()  、再进构造函数Demo(String a),d.i的值改变
                System.out.println(d.i);
        }
}
回复 使用道具 举报
  1. Super d=new Demo("A");
复制代码

运行路线——Super()——public Demo(String a)
回复 使用道具 举报
1楼正解
回复 使用道具 举报
我也看蒙了;
回复 使用道具 举报
本帖最后由 踏雪风暴 于 2014-6-25 11:42 编辑

其实很简单的:
public static void main(String[] args)
        {
                int i=4;                                            //  这里其实是多余的,因为求 d.i  是指构造函数Demo中的i
                                                                        //   main 中的 i  与  d.i 是不同的, 愿意是因为都是局部变量的
                                                                       //  这里应该明白了吧
                Super d=new Demo("A");            //先进构造函数Super()  、再进构造函数Demo(String a)
                System.out.println(d.i);                 //  当然这里可以输出  i  了,但是有上面的分析知道  i  与  d.i 二者是不同的,你                                                                        //  替换二者的变量,也会发现结果是不同的。
        }

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
木华 发表于 2014-6-25 07:57
i是局部变量而非成员变量,这是多态的性质,局部变量在多态中,运行结果为子类的值,编译看左边,运行看右 ...

你好 我只是知道多态在成员函数 成员变量和静态函数中的特点  但是局部变量在多态中的特性我还没有留意过  
回复 使用道具 举报
hhnog 发表于 2014-6-25 10:13
class Demo extends Super
{
        public Demo(String a)

谢谢  辛苦了
回复 使用道具 举报
alive 中级黑马 2014-6-25 18:24:26
10#
new Demo是子类的对象 ,d.i是子类的成员变量,如果Super d = new Super()那d.i就是父类的变量了
回复 使用道具 举报
alive 发表于 2014-6-25 18:24
new Demo是子类的对象 ,d.i是子类的成员变量,如果Super d = new Super()那d.i就是父类的变量了 ...

嗯 我知道了 谢谢
回复 使用道具 举报
我来学习一下
回复 使用道具 举报
看一楼的代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马