黑马程序员技术交流社区

标题: 显式的写明子类继承父类的方法,和不写有没有区别? [打印本页]

作者: 刘云龙    时间: 2013-3-13 12:39
标题: 显式的写明子类继承父类的方法,和不写有没有区别?
本帖最后由 黄玉昆 于 2013-3-16 13:52 编辑

显式的写明子类继承父类的方法,和不写有没有区别?

  1. class AA
  2. {
  3. int num = 123;
  4. void fun1()
  5. {
  6.   System.out.println(fun2());
  7. }
  8. int fun2()
  9. {
  10.   return num;
  11. }
  12. }
  13. class BB extends AA
  14. {
  15. int num = 456;
  16. int fun2() //此处如果注释掉fun2,结果会不同,既然说子类继承了父类的方法,即使不覆盖也是可以调用的,那么为什么显示的写明和不写明,结果却不同?
  17. {
  18.   return num;
  19. }
  20. public static void main(String argv[])
  21. {
  22.   AA a;
  23.   BB b = new BB();
  24.   b.fun1();
  25.   a = b;     //多态
  26.   a.fun1();//
  27. //  System.out.println("a.num :"+a.num);
  28. // System.out.println("b.num :"+b.num);
  29. }
  30. }
复制代码

作者: 437857487    时间: 2013-3-13 16:52
要是以实现的方法写不写都一样,但是一般继承后子类一般都会重写父类的方法。
作者: 黄玉昆    时间: 2013-3-13 18:29
我看了几遍,没太理解你的意思,你最好把代码写出来,这样会清晰一些,谢谢
作者: scott0610    时间: 2013-3-13 18:50
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)。

希望对你有所帮助!
作者: 黑马-郑玉元    时间: 2013-3-13 19:04
真心的不懂你的意思!
作者: IT菜鸟    时间: 2013-3-13 22:13
说明白点呗
作者: 张雪萍    时间: 2013-3-15 09:37

  1. class AA
  2. {
  3. int num = 123;
  4. void fun1()
  5. {
  6.   System.out.println(fun2());
  7. }
  8. int fun2()
  9. {
  10.   return num;
  11. }
  12. }
  13. class BB extends AA
  14. {
  15. int num = 456;
  16. int fun2() //此处如果注释掉fun2,结果会不同,既然说子类继承了父类的方法,即使不覆盖也是可以调用的,那么为什么显示的写明和不写明,结果却不同?
  17. {
  18.   return num;
  19. }
  20. public static void main(String argv[])
  21. {
  22.   AA a;
  23.   BB b = new BB();
  24.   b.fun1();
  25.   a = b;     //多态
  26.   a.fun1();//
  27. //  System.out.println("a.num :"+a.num);
  28. // System.out.println("b.num :"+b.num);
  29. }
  30. }
复制代码
你所说的,显式的写就是在子类中出现了跟父类一模一样的方法,这叫子类的该方法覆盖了父类的该方法,父类的该方法被子类隐藏了,
所以当子类中要调用该方法时,调用的是子类中的该方法,就比如说,你跟你的父亲都有钱,你继承了你的父亲,当你要花钱的时候当然是先花你的了,
因为比较方便嘛。像你这程序之后,子类中的fun2()用到的num是本类中定义的成员变量nun,值为456,
你要是想调用父类中的fun2方法,就要用到一个关键字super,格式是super.fun2();
如果你不在子类中在写该方法,那么子类就只能继承父类中的该方法,所以调用的时候,num指的是本类也就是父类中的num,值为123.
作者: tianyun    时间: 2013-3-15 10:47
当然会不一样,父类的应用指向了子类对象,该应用只能调用子类覆盖父类的方法,而不是调用父类的方法,又因为属性是不存在继承关系的,不重写时调用父类方法,只能访问父类的属性123。重写后访问子类属性456,所以结果不同。
作者: 范天成    时间: 2013-3-15 18:56
七楼正解,赞一个{:soso_e113:}




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