黑马程序员技术交流社区
标题:
自学求解
[打印本页]
作者:
張帅
时间:
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