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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© android0276 中级黑马   /  2014-7-5 16:47  /  1119 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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???。可以从高层分析,也可以从内存方面来分析。。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

4 个回复

倒序浏览
这个就是有关继承的问题了:
你的extendsBase 类 继承了Base类,并重写了test()方法:
这时,当你将对象extendsBase实例化的时候,首先加载Base类,然后加载了extendsBase类,由于子类中也拥有和父类一样的方法test(),所以,当实例化该对象的时候,本应该执行父类的构造函数,但是父类的test()方法被子类覆盖,所以就加载了子类的test()方法;因此,执行的结果是Why。。。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
学习了.....
回复 使用道具 举报
1,非静态方法,编译时期不说了,运行时期,建立的是谁的对象(new),使用谁的方法,成员变量就看是谁的引用
2,静态方法就是看引用。

最好记住吧,要扯又得扯老长
回复 使用道具 举报
首先: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起作用了。
最后,这个重构有什么用?
一定会有疑问:何必打一堆这废代码,我直接在上面改不就完事了么?
嗯,没错,这是你自己写的类,可以在上面改,那么,假如以后你需要用一个别人写的类,你不能改,可又需要这个类的其他功能,就一个功能对不上号,咋办?
不就来了,只能重写!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马