问:下面关于成员内部类 InnerClass 的子类实现 ChildInnerClassX 中哪些是可以编译运行的?
class OutClass {
class InnerClass {
}
}
class ChildInnerClass1 extends OutClass.InnerClass {
}
class ChildInnerClass2 extends OutClass.InnerClass {
public ChildInnerClass2() {
super();
}
}
class ChildInnerClass3 extends OutClass.InnerClass {
public ChildInnerClass3(OutClass outClass) {
super();
}
}
class ChildInnerClass4 extends OutClass.InnerClass {
public ChildInnerClass3(OutClass outClass) {
outClass.super();
}
}
答:只有 ChildInnerClass4 子类是可以编译运行的,其他都无法编译通过。(虽然开发中很少会遇到这种)因为成员内部类的继承语法格式要求继承引用方式为 Outter.Inner 形式且继承类的构造器中必须有指向外部类对象的引用,并通过这个引用调用 super(),其实这个要求就是因为成员内部类默认持有外部类的引用,外部类不先实例化则无法实例化自己。
问:下面程序的运行结果是什么?为什么?
List list1 = new ArrayList();
List list2 = new ArrayList(){};
List list3 = new ArrayList(){{}};
List list4 = new ArrayList(){{}{}{}};
//1
System.out.println(list1.getClass() == list2.getClass());
//2
System.out.println(list1.getClass() == list3.getClass());
//3
System.out.println(list1.getClass() == list4.getClass());
//4
System.out.println(list2.getClass() == list3.getClass());
//5
System.out.println(list2.getClass() == list4.getClass());
//6
System.out.println(list3.getClass() == list4.getClass());
答:程序运行返回 6 个 false。
首先 list1 指向一个 ArrayList 对象实例;list2 指向一个继承自 ArrayList 的匿名类内部类对象;list3 也指向一个继承自 ArrayList 的匿名内部类(里面一对括弧为初始化代码块)对象;list4 也指向一个继承自 ArrayList 的匿名内部类(里面多对括弧为多个初始化代码块)对象;由于这些匿名内部类都出现在同一个类中,所以编译后其实得到的是 Demo$1、Demo$2、Demo$3 的形式,所以自然都互补相等了,不信你可以通过 listX.getClass().getName() 进行验证。
问:开发中使用 Java 匿名内部类有哪些注意事项(经验)?
答:常见的注意事项如下。
-
使用匿名内部类时必须是继承一个类或实现一个接口(二者不可兼得且只能继承一个类或者实现一个接口)。
-
匿名内部类中是不能定义构造函数的,如需初始化可以通过构造代码块处理。
-
匿名内部类中不能存在任何的静态成员变量和静态方法。
-
匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
-
匿名内部类不能是抽象类,必须要实现继承的类或者实现接口的所有抽象方法。
问:Java 匿名内部类在使用时如何初始化吗?
答:匿名内部类无法通过构造方法初始化,所以我们只能通过构造代码块进行初始化。
嘎然而止,这是续上篇 Part 2 部分的内部类 Part 3 部分,内部类最后一个 Part 部分尽请收看明日推送续集(内部类绝对算的上是面试高频题了,细节很多)~~
老铁们,别嫌短,长了你肯定不会看完的,所以这就是码农每日一题的宗旨(其他历史文章请查看公众号历史记录)~
看完分享一波嘛,和你的小伙伴一起讨论才更加有意思,右上角分享 666~
看个笑话放松一下
音乐课上老师弹了一首贝多芬的曲子,小明问小华:“你懂音乐吗?”,小华:“是的”,小明:“那你知道老师在弹什麼吗?” ,小华: “钢琴。”
Only in your smile, I just have to breathe.
只有在你的微笑里,我才有呼吸。