黑马程序员技术交流社区

标题: 求助,如何解释这段代码? [打印本页]

作者: 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