黑马程序员技术交流社区
标题:
匿名内部类连名字都没有,会有构造函数么?
[打印本页]
作者:
单凯
时间:
2013-8-19 20:26
标题:
匿名内部类连名字都没有,会有构造函数么?
本帖最后由 单凯 于 2013-8-19 21:26 编辑
好多人对内部类都多少有点疑惑,看帖的时候有很多人提问,当初我做基础题的时候也碰到过一道内部类的题,当时就没做出来。
后来看视频就懂了一点,今天有看到人问内部类的问题,就上网查了。
然后看到一句话,匿名内部类不能有构造方法,但可以创建一个实例。
一开始我好奇为啥没有构造函数,后来知道是没有名字,总不能光写一对括号吧,所以没有构造函数。
自己没有可以调用父类的嘛,反正内部类要继承父类,可是调用父类构造函数也算是自己有构造函数的哟!
另外,如果匿名内部类是实现一个接口的话,接口可是没有构造函数的,它调用谁的让自己初始化?
跟我有同样疑惑的童鞋可以看一下这个:
http://zangxt.iteye.com/blog/421560
不过这里面没有实现接口的例子,所以我想问当内部类实现接口实例化对象时,怎么初始化对象?
作者:
yangjie
时间:
2013-8-19 21:05
继承和实现是不一样的啊。先不说内部,如果普通类没指定父类只实现了接口,那这个类就默认是Object的子类。
根据你给的帖子的代码改动了一下:
public class Main {
public static void main(String[] args) {
InnerTest inner = new InnerTest();
Test t = inner.get();
System.out.println(t.getI());
}
}
interface Test {
public int getI();
}
class InnerTest {
public Test get() {
return new Test() {
// @Override
public int getI() {
return 10;
}
};
}
}
javap -c InnerTest$$$$$$$$1
复制代码
运行javap -c InnerTest$1的结果
class InnerTest$$$$1 implements Test {
final InnerTest this$$$$0;
InnerTest$$$$1(InnerTest);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$$$$0:LInnerTest;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":
()V
9: return
public int getI();
Code:
0: bipush 10
2: ireturn
}
复制代码
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