黑马程序员技术交流社区

标题: 自学求解 [打印本页]

作者: 張帅    时间: 2013-9-23 08:31
标题: 自学求解
本帖最后由 杨增坤 于 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?

作者: 麦田守望者0812    时间: 2013-9-23 09:21
Demo2 extends Demo1 对Demo1中的show()进行了复写Demo1 d1 = new Demo2();实际是将类型为Demo1变量d1指向了堆内存中Demo2的一个对象.所以调用d1中的show方法的时候实际上是调用的Demo2中的show方法
作者: yting_xmei1129    时间: 2013-9-23 10:38
不知道楼主是不是很清楚类的 overload(重载) 跟 override(重写)

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

作者: 梁贺    时间: 2013-9-23 10:39
整个题目Demo2 继承了 Demo1,并且子类对父类的show()方法进行了重写(即方法覆盖)。当Demo1 d1 = new Demo2();  d1指向的是Demo2的对象的引用,并且Demo2中重写了Demo1的show()方法,所以d1.show();相当于是调用的Demo2中的show()方法。




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