说说Anonymous Inner Class (匿名内部类) 是否可以extends(继承)

06-09-06 tyro
    

老看到这个网上有这个问题,跟着的答案是“

匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。”

我说说我的理解,欢迎指正

public class My {

public static void main(String[] args) {

My my = new My();

my.doTest();

}

public void doTest() throws Exception {

Dog hi = new Dog("a") {

~~~~~~~~~~ 这个应是叫做匿名内部类.如果是这样的话,这里虽然是没有写extends,implements,可却实现了相应的功能。

public String sayHello() {

return "hello " + getName() + " " + getAge();

}

};

String abc = hi.sayHello();

if (log.isInfoEnabled()) {

log.info("abc = " + abc);

}

}

}

public class Dog {

....

}

    

5
tyro
2006-09-06 17:38

public class My {
    public static void main(String[] args) {
        My my = new My();
        my.doTest();
    }
    
    public void doTest() throws Exception {
        Dog hi = new Dog("a") {
                ~~~~~~~~~~ 这个应是叫做匿名内部类.如果是这样的话,这里虽然是没有写extends,implements,可却实现了相应的功能。
            public String sayHello() {
                return "hello " + getName() + " " + getAge();
            }
        };
        String abc = hi.sayHello();
        if (log.isInfoEnabled()) {
            log.info("abc = " + abc);
        }
        
    }
 }

public class Dog {
    ....
}
<p>

banq
2006-09-07 10:01

个人认为 "匿名内部类"是反模式的,如果一个类不能重用,那我们还用类干什么?都是C/C++若的祸,忘记匿名内部类。不会的不要学。

tyro
2006-09-07 11:09

网上多是这么说的。

问:Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

也许,这道题想问的是匿名内部类是否可以做为父类被其它类继承,

~~~~~~~

或是做为接口被实现。

~~~~

如果问题是这样的话,答案则应是

匿名内部类不能被继承,也不能被实现,因为它没名字。(yes or no?)

而一个内部类,只要有名字,就可以做为父类被继承,也可以做为接口被实现。(yes or no?)

如果我理解是正确的话,那么原来的答案说得也太跳跃了,问题和答案都让人都不知所云。如果下回面试有人问我这道题,真要好好和人家交流一下。

banq
2006-09-08 12:21

内部类 就是限定死了,它属于一个类的内部用,就跟定了这个类,当然不能被外部访问或重用。

使用聚合等关系可以替代内部类。

内部类一点都没有必要使用,增加代码复杂度,维护性差,就当作没有内部类这个概念吧。

2Go 1 2 下一页