黑马程序员技术交流社区

标题: 匿名内部类连名字都没有,会有构造函数么? [打印本页]

作者: 单凯    时间: 2013-8-19 20:26
标题: 匿名内部类连名字都没有,会有构造函数么?
本帖最后由 单凯 于 2013-8-19 21:26 编辑

好多人对内部类都多少有点疑惑,看帖的时候有很多人提问,当初我做基础题的时候也碰到过一道内部类的题,当时就没做出来。
后来看视频就懂了一点,今天有看到人问内部类的问题,就上网查了。
然后看到一句话,匿名内部类不能有构造方法,但可以创建一个实例。
一开始我好奇为啥没有构造函数,后来知道是没有名字,总不能光写一对括号吧,所以没有构造函数。
自己没有可以调用父类的嘛,反正内部类要继承父类,可是调用父类构造函数也算是自己有构造函数的哟!
另外,如果匿名内部类是实现一个接口的话,接口可是没有构造函数的,它调用谁的让自己初始化?


跟我有同样疑惑的童鞋可以看一下这个:
http://zangxt.iteye.com/blog/421560


不过这里面没有实现接口的例子,所以我想问当内部类实现接口实例化对象时,怎么初始化对象?

作者: yangjie    时间: 2013-8-19 21:05
继承和实现是不一样的啊。先不说内部,如果普通类没指定父类只实现了接口,那这个类就默认是Object的子类。
根据你给的帖子的代码改动了一下:
  1. public class Main {

  2. public static void main(String[] args) {
  3. InnerTest inner = new InnerTest();
  4. Test t = inner.get();
  5. System.out.println(t.getI());
  6. }
  7. }

  8. interface Test {
  9. public int getI();
  10. }

  11. class InnerTest {

  12. public Test get() {
  13. return new Test() {
  14. // @Override
  15. public int getI() {
  16. return 10;
  17. }
  18. };
  19. }
  20. }

  21. javap -c InnerTest$$$$$$$$1
复制代码
运行javap -c InnerTest$1的结果
  1. class InnerTest$$$$1 implements Test {
  2. final InnerTest this$$$$0;

  3. InnerTest$$$$1(InnerTest);
  4. Code:
  5. 0: aload_0
  6. 1: aload_1
  7. 2: putfield #1 // Field this$$$$0:LInnerTest;
  8. 5: aload_0
  9. 6: invokespecial #2 // Method java/lang/Object."<init>":
  10. ()V
  11. 9: return

  12. public int getI();
  13. Code:
  14. 0: bipush 10
  15. 2: ireturn
  16. }
复制代码
6: invokespecial #2 // Method java/lang/Object."<init>"
可以看到确实是调用的Object的构造函数。

感谢LZ分享的帖子,学到了不少新东西。原来这个带号码的class是匿名内部类,我上回做练习的时候看见过还以为是什么乱码呢{:soso_e127:}  
作者: 单凯    时间: 2013-8-19 21:15
yangjie 发表于 2013-8-19 21:05
继承和实现是不一样的啊。先不说内部,如果普通类没指定父类只实现了接口,那这个类就默认是Object的子类。 ...

好厉害

作者: HM张博文    时间: 2013-8-20 15:48
如果实现了接口,那他是Object的子类,所以还是有构造方法的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2