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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 張帅 中级黑马   /  2013-9-23 08:31  /  1074 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-23 16:33 编辑

class Demo1
{
         int num = 4;
         void show()

        {
               System.out.println("hello");
         }

}
class  Demo2 extends Demo1
{
           int num = 5
           void show()
           {
                    System.out.println("hi");
            }
}

class Test
{
             public static void main(String[] args)
           {
                   Demo1 d1 = new Demo2();
                   Demo2 d2 = new Demo2();
                    System.out.println(d1.num);
                     System.out.println(d2.numi);
                     d1.show();
                     d2.show();
             }
}
这道题目 先读主函数中的  Demo1 d1 = new Demo2();Demo2 d2 = new Demo2();,打印d1.num为4,d2.num为5,d1.show()为hello,d2.show();为hi.所以我的结果是4,5,hello,hi,而正确答案是4,5,hi,hi,为什么d1.show()父类的结果也为hi?

评分

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

查看全部评分

3 个回复

倒序浏览
Demo2 extends Demo1 对Demo1中的show()进行了复写Demo1 d1 = new Demo2();实际是将类型为Demo1变量d1指向了堆内存中Demo2的一个对象.所以调用d1中的show方法的时候实际上是调用的Demo2中的show方法

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1 很给力!

查看全部评分

回复 使用道具 举报
不知道楼主是不是很清楚类的 overload(重载) 跟 override(重写)

楼主的这个问题中属于子类 Demo2  重写了 父类 Demo1中的 show 方法,还有就是楼主的  int num = 5 这一行代码貌似少了一个 ";"分号吧! 还有 System.out.println(d2.numi); 这一行,貌似多了一个 i 吧! 你写成了 d2.numi, 你怎么编译通过的、、、 在这里  栈类存 d1 指向的是 堆内存中的 Demo2,所以执行的是 Demo2 的show方法,而不是Demo1 的 show 方法,楼主可以去看下内存分析的那段视频
希望可以帮到楼主、、、

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
整个题目Demo2 继承了 Demo1,并且子类对父类的show()方法进行了重写(即方法覆盖)。当Demo1 d1 = new Demo2();  d1指向的是Demo2的对象的引用,并且Demo2中重写了Demo1的show()方法,所以d1.show();相当于是调用的Demo2中的show()方法。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1 赞一个!

查看全部评分

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