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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄玉昆 于 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. }
复制代码

点评

如果问题已经解决了,请将分类改为已解决;一定要对别人的回答有相应的回复哦,谢谢  发表于 2013-3-15 08:41

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
要是以实现的方法写不写都一样,但是一般继承后子类一般都会重写父类的方法。
回复 使用道具 举报
我看了几遍,没太理解你的意思,你最好把代码写出来,这样会清晰一些,谢谢
回复 使用道具 举报
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)。

希望对你有所帮助!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
真心的不懂你的意思!
回复 使用道具 举报
说明白点呗
回复 使用道具 举报

  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.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
当然会不一样,父类的应用指向了子类对象,该应用只能调用子类覆盖父类的方法,而不是调用父类的方法,又因为属性是不存在继承关系的,不重写时调用父类方法,只能访问父类的属性123。重写后访问子类属性456,所以结果不同。
回复 使用道具 举报
七楼正解,赞一个{:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马