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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹旗龙 黑马帝   /  2012-2-11 15:42  /  2168 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 尹旗龙 于 2012-2-12 13:46 编辑

class A {
    void m() {
        System.out.println("outer");
    }
}

public class ShuChu {

    /**
     * @param args
     */
    public static void main(String[] args) {
        new ShuChu().go();
    }
    void go() {
        new A().m();
        class A {
            void m() {
                System.out.println("inner");
            }
        }
        new A().m();
    }
    class A {
        void m() {
            System.out.println("middle");
        }
    }
}

运行结果为:
middle
inner
为什么顺序是这样呢?
哪位可以把程序改成我想要的结果
即:
inner
middle
outer

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

3 个回复

倒序浏览
那就不要把内部类和外部类都定义成A,因为创建对象的时候
先是找内部是否有该类,有的话就会创建这个类的对象,如果
要想完成你的输出,可以把类不都定义成A
class A {
    void m() {
        System.out.println("outer");
    }
}
public class ShuChu {
    /**
     * @param args
     */
    public static void main(String[] args) {
        new ShuChu().go();
    }
    void go() {
        class C {
            void m() {
                System.out.println("inner");
            }
        }
        new C().m();
        new B().m();
    }
    class B {
        void m() {
            System.out.println("middle");
            new A().m();
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
何森 发表于 2012-2-11 16:34
那就不要把内部类和外部类都定义成A,因为创建对象的时候
先是找内部是否有该类,有的话就会创建这个类的对 ...

嗯 你说这事一种方法
回复 使用道具 举报
在不更改类名的情况下,我只能想到先打印inner,后打印middle的方法,若还将outer也打印出来,这个个人觉得没办法。除非你更改外部类A的类名,或将类A放在另一个包中。
ShuChu 类中的go方法做如下更改:
void go() {
        class A {
            void m() {
                System.out.println("inner");
            }
        }
        new A().m();        
        this.new A().m();
        
    }

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

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