黑马程序员技术交流社区
标题:
求助,如何解释这段代码?
[打印本页]
作者:
android0276
时间:
2014-7-5 16:47
标题:
求助,如何解释这段代码?
本帖最后由 android0276 于 2014-7-6 20:32 编辑
public class Problem {
public static void main(String[] args) {
//创建子类对象
new extendsBase();
}
}
class Base{
public Base(){
test();
}
public void test(){
System.out.println("Base!");
}
}
//继承Base,重写test方法
class extendsBase extends Base{
@Override
public void test() {
System.out.println("Why????");
}
}
求解释,为什么会是输出Why???。可以从高层分析,也可以从内存方面来分析。。
作者:
blue_sky
时间:
2014-7-6 09:28
这个就是有关继承的问题了:
你的extendsBase 类 继承了Base类,并重写了test()方法:
这时,当你将对象extendsBase实例化的时候,首先加载Base类,然后加载了extendsBase类,由于子类中也拥有和父类一样的方法test(),所以,当实例化该对象的时候,本应该执行父类的构造函数,但是父类的test()方法被子类覆盖,所以就加载了子类的test()方法;因此,执行的结果是Why。。。
作者:
燿陚√揚葳
时间:
2014-7-6 10:10
学习了.....
作者:
人心如水
时间:
2014-7-6 10:10
1,非静态方法,编译时期不说了,运行时期,建立的是谁的对象(new),使用谁的方法,成员变量就看是谁的引用
2,静态方法就是看引用。
最好记住吧,要扯又得扯老长
作者:
OCTSJimmy
时间:
2014-7-6 10:27
首先:new extendsBase() 实例化,没什么好说的。
接着:
class extendsBase extends Base{
/* //这是继承来的方法
public Base(){
test();
}
public void test(){
System.out.println("Base!");
}
*/
@Override
public void test() {
System.out.println("Why????");
}
}
然后:那么上面继承来了一个test,与现有的这个test不是重复了么(同修饰符,同参数列表,同返回类型)?
所以加上了@Override标记,也就是推翻原来的test,重写新的test。
那么自然是重写的,也就是新的test起作用了。
最后,这个重构有什么用?
一定会有疑问:何必打一堆这废代码,我直接在上面改不就完事了么?
嗯,没错,这是你自己写的类,可以在上面改,那么,假如以后你需要用一个别人写的类,你不能改,可又需要这个类的其他功能,就一个功能对不上号,咋办?
不就来了,只能重写!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2