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

tyro 06-09-06
    

老看到这个网上有这个问题,跟着的答案是“
匿名的内部类是没有名字的内部类。不能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 {
....
}

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 下一页