黑马程序员技术交流社区

标题: 子父类继承问题,,, [打印本页]

作者: 0618张军    时间: 2015-7-5 16:04
标题: 子父类继承问题,,,
/*当第一次调用父类构造方法时会运行到show()方法,,,红色部分,,
此时的show方法为什么会输出的是子类的show方法,而不是父类的????
*/
class Fu {
Fu() {
  super();
  show();//???
  return;
}
void show() {
  System.out.println("父类show");
}
}
class Zi extends Fu {
int num = 8;
Zi() {
  super();
  return;
}
void show() {
  System.out.println("子类show" + num);
}
}
public class ExtendDemo {
public static void main(String[] args) {
  Zi z = new Zi();
  z.show();
}
}

作者: a80194367    时间: 2015-7-5 16:04
码字解释不知道你能不能懂,我试试吧
首先当创建对象时,内存中有堆内存,栈内存和方法区,主函数main()会到栈内存开辟空间,然后创建子类对象时,由于子类继承父类,在方法区就会先加载父类的shou(),void show()。然后加载子类的方法在方法区,然后创建对象,在堆内存完成对象的默认初始化,(注意:默认初始化在显示初始化之前),所以先运行子类构造器,运行子类构造器,里面有super()继续运行父类构造器,注意(运行父类构造器的时候由于子父类指向同一个地址指针,而此时创建的是子类对象,所以子类对象要先查看方法区是否有子类函数,有的话运行子类,没有再找父类方法含数,此时栈内的父类构造器弹栈,重点:之后子类才能显示初始化(int x=8),所以显示初始化之后,输出的就是8了,也就是子类的方法num=8了。如果还是看不明白,私信我,我给你画个图就明白了
作者: 683280    时间: 2015-7-5 16:18
因为你复写 了 父类的show()方法,复写之后无论你在哪里调用show()方法 ,都是你复写之后的show()。
作者: Diors    时间: 2015-7-5 17:51
继承中,构造方法才会在第一行隐式调用父类默认构造方法,其他方法一旦与父类方法同名同参数,父类的这个方法就被覆盖了
作者: 董婷婷_Rbeok    时间: 2015-7-5 18:10
因为子类继承父类后,子类的show方法声明和父类的一样,就表示重写了父类的show方法,所以调用方法的时候,就是调用是子类的方法。
作者: joerk    时间: 2015-7-5 19:13
继承情况下,子类重写了父类的方法时,再想要访问父类的那个被重写的方法,在子类中就只能通过super.方法名([参数1,参数2,.....])来访问啦,否则调用的就只是子类中重写的方法了。希望你的问题得到解答!:lol
作者: joerk    时间: 2015-7-5 19:15
a80194367 发表于 2015-7-5 18:10
码字解释不知道你能不能懂,我试试吧
首先当创建对象时,内存中有堆内存,栈内存和方法区,主函数main() ...

这也能碰到你?。。。。。{:3_46:}
作者: q953655369    时间: 2015-7-5 21:25
你复写了show方法
作者: 妳的微笑    时间: 2015-7-5 23:08
子类zi创建的对象,就是调用子类重写的父类方法,如果没有重写才会去调用父类的呀
作者: hakey    时间: 2015-7-6 07:15
父类的show方法被你覆盖,重写了。怎么还会调用父类的show方法呢?倘若你把子类的show方法声明为私有,或者加个参数什么的,让它跟父类的show方法不一样,那就不会重写,你就可以用父类的show方法了。望楼主采纳。
作者: zhuoxiuwu    时间: 2015-7-6 11:34
a80194367 发表于 2015-7-5 18:10
码字解释不知道你能不能懂,我试试吧
首先当创建对象时,内存中有堆内存,栈内存和方法区,主函数main() ...

讲的非常详细,赞一个
作者: a80194367    时间: 2015-7-6 16:29
zhuoxiuwu 发表于 2015-7-6 11:34
讲的非常详细,赞一个

赞一个应该给黑马币滴  ,  楼主为什么还不打赏我腻
作者: zhuoxiuwu    时间: 2015-7-6 16:45
a80194367 发表于 2015-7-6 16:29
赞一个应该给黑马币滴  ,  楼主为什么还不打赏我腻

想入学,技术分都还没到10分啊。
作者: a80194367    时间: 2015-7-7 08:10
感谢楼主,没有白码字,
作者: 君子无醉    时间: 2015-7-8 09:36
可以看下我论坛上分享的笔记 对这一部分知识点总结的很详细
作者: y137123606    时间: 2015-7-8 22:34
因为你复写啦show方法
作者: zhangfurui    时间: 2015-7-12 19:28
简单点说就是子类重写了父类。
作者: 1158865593    时间: 2015-7-25 07:20
父类中的方法被你重写后就会被子                    类中的方法覆盖掉,所以如果想要             使用父类中的方法,就              要避免覆盖父类的方法




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