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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hejinzhong 中级黑马   /  2014-9-8 00:15  /  1011 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hejinzhong 于 2014-9-8 11:08 编辑

  1. //分别运行父类和子类的main方法,结果如何
  2. public class Parent {
  3.         
  4.         public void init(){
  5.                 System.out.println("1 parent init");
  6.                 this.demo();
  7.         }
  8.         public void demo(){
  9.                 System.out.println("2 parent demo");
  10.         }
  11.         public static void main(String[] args) {
  12.                 Parent parent = new Son();
  13.                 parent.init();
  14.         }
  15. }
  16. -------------------------------------------------------------------------------------------------------------
  17. public class Son extends Parent{

  18.         public void init(){
  19.                 super.init();  
  20.                 System.out.println("3 son init");
  21.                 this.demo();
  22.         }
  23.         
  24.         public void demo(){
  25.                 System.out.println("4 son demo");
  26.         }

  27.         public static void main(String[] args) {
  28.                 Son son = new Son();
  29.                 son.init();
  30.         }
  31. }
  32. 我只是让大家巩固下自己对this的理解!
复制代码
http://bbs.itheima.com/thread-142164-1-1.html  下一个输出

7 个回复

倒序浏览
程序编写有问题,用了super就不能用this,因为两个都要求放在第一行,你说不是就矛盾了,再说一个函数里头只能有一个main函数吧
回复 使用道具 举报
1169646761 发表于 2014-9-8 01:39
程序编写有问题,用了super就不能用this,因为两个都要求放在第一行,你说不是就矛盾了,再说一个函数里头只能 ...

“大神”!
回复 使用道具 举报
本帖最后由 孤鸢 于 2014-9-8 14:13 编辑

一个文件中,不能同时存在两个公共类额。。。见识短了。。。虚线代表可拆开,学习了
回复 使用道具 举报
本帖最后由 OCTSJimmy 于 2014-9-8 10:04 编辑

首先:
沙发:super和this只能第一行,那个只是在构造函数中才有的情况。
这里完全没有牵涉到构造函数

接着,板凳:
楼主明明写了public class,完全可以拆开放俩文件中。


最后,结果很有趣,都会是:

1 parent init
4 son demo
3 son init
4 son demo

下面逐次剖析:
其实不论花样怎么变,都是new的Son对象,只是parent中使用了多态,仅此而已,所以从Son的执行流程开始分析。
parent的三个方法全部被Son复写(覆盖)。

1、由main调用Son的init,Son的init调用父类的init,所以先输出“1 par...”
    注意:由于这里指明调用父类的init方法,所以与复写无关。
2、由父类的init方法,调用this的demo,由于都是new的Son对象,并且由于复写,所以调用的都只会是son的demo方法,所以输出“4 son...”
3、super语句调用父类执行完毕后,继续执行,所以输出“3 son...”
4、最后,再次调用this的demo,依然都是new的Son对象,并且由于复写,所以再次打印输出“4 son”

很有意思的题目!


点评

高手还是有的!  发表于 2014-9-8 10:45

评分

参与人数 1黑马币 +5 收起 理由
hejinzhong + 5 this 理解不错

查看全部评分

回复 使用道具 举报
1169646761 发表于 2014-9-8 01:39
程序编写有问题,用了super就不能用this,因为两个都要求放在第一行,你说不是就矛盾了,再说一个函数里头只能 ...

super和this 本就是针对类的,调用不同类的方法,当然能同时出现,放在第一行的是默认父类构造函数super(),还有一个函数中可以存在多个main函数入口,还以互相调用传值,拿不准的先验证下再说,你看楼主给你打了个双引号,我看不过去,才啰嗦了点,不要误会.

评分

参与人数 1黑马币 +2 收起 理由
hejinzhong + 2 神马都是浮云

查看全部评分

回复 使用道具 举报
你这个涉及的是多态的问题。
      首先, 父类Parent主函数中 Parent parent = new Son();  父类引用指向子类对象。
所以在编译时期,要参阅引用型变量所属类中是否有调用的方法(一定要注意是引用型变量所属的类,也就是左边的类)。如果有,编译通过,没有则编译失败。
       你这里调用的是init()方法,父类parent中定义了该方法,因此可以编译通过。
然而,当程序运行时,要参阅对象所属的类中是否有调用的方法(也就是右边的类。),所以当你调用parent.init()方法的时候,调用的是子类son的方法。而son中的init()方法又先调用了父类的init()方法。
因此,打印  1 parent init。接着调用this.demo()。this指向的是当前对象。也就是new son()。因而调用子类的demo()方法,既打印“4 son demo”。至此,super.init()执行完毕,接着执行 打印 3 son init ,最后在调用this.demo()方法 打印 4 son demo
总的打印情况应该是
1 parent init
4 son demo
3 son init
4 son demo
上面这个是调用父类Parent  main()方法的运行结果。 如果调用子类Son main()方法运行结果一样。只是不涉及多态的问题。按步骤正常运行就行。

评分

参与人数 1黑马币 +3 收起 理由
hejinzhong + 3 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马