黑马程序员技术交流社区
标题:
这个两个的输出什么?有奖回答
[打印本页]
作者:
hejinzhong
时间:
2014-9-8 00:15
标题:
这个两个的输出什么?有奖回答
本帖最后由 hejinzhong 于 2014-9-8 11:08 编辑
//分别运行父类和子类的main方法,结果如何
public class Parent {
public void init(){
System.out.println("1 parent init");
this.demo();
}
public void demo(){
System.out.println("2 parent demo");
}
public static void main(String[] args) {
Parent parent = new Son();
parent.init();
}
}
-------------------------------------------------------------------------------------------------------------
public class Son extends Parent{
public void init(){
super.init();
System.out.println("3 son init");
this.demo();
}
public void demo(){
System.out.println("4 son demo");
}
public static void main(String[] args) {
Son son = new Son();
son.init();
}
}
我只是让大家巩固下自己对this的理解!
复制代码
http://bbs.itheima.com/thread-142164-1-1.html
下一个输出
作者:
1169646761
时间:
2014-9-8 01:39
程序编写有问题,用了super就不能用this,因为两个都要求放在第一行,你说不是就矛盾了,再说一个函数里头只能有一个main函数吧
作者:
hejinzhong
时间:
2014-9-8 09:03
1169646761 发表于 2014-9-8 01:39
程序编写有问题,用了super就不能用this,因为两个都要求放在第一行,你说不是就矛盾了,再说一个函数里头只能 ...
“大神”!
作者:
孤鸢
时间:
2014-9-8 09:41
本帖最后由 孤鸢 于 2014-9-8 14:13 编辑
一个文件中,不能同时存在两个公共类额。。。见识短了。。。虚线代表可拆开,学习了
作者:
OCTSJimmy
时间:
2014-9-8 09:55
本帖最后由 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:00
1169646761 发表于 2014-9-8 01:39
程序编写有问题,用了super就不能用this,因为两个都要求放在第一行,你说不是就矛盾了,再说一个函数里头只能 ...
super和this 本就是针对类的,调用不同类的方法,当然能同时出现,放在第一行的是默认父类构造函数super(),还有一个函数中可以存在多个main函数入口,还以互相调用传值,拿不准的先验证下再说,你看楼主给你打了个双引号,我看不过去,才啰嗦了点,不要误会.
作者:
卖艺人
时间:
2014-9-8 10:46
你这个涉及的是多态的问题。
首先, 父类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()方法运行结果一样。只是不涉及多态的问题。按步骤正常运行就行。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2