关注一下嘛,又不让你背锅!
问:下面关于成员内部类 InnerClass 的子类实现 ChildInnerClassX 中哪些是可以编译运行的?
classOutClass{
classInnerClass{
}
}
classChildInnerClass1extendsOutClass.InnerClass{
}
classChildInnerClass2extendsOutClass.InnerClass{
publicChildInnerClass2(){
super();
}
}
classChildInnerClass3extendsOutClass.InnerClass{
publicChildInnerClass3(OutClassoutClass){
super();
}
}
classChildInnerClass4extendsOutClass.InnerClass{
publicChildInnerClass3(OutClassoutClass){
outClass.super();
}
}
答:只有 ChildInnerClass4 子类是可以编译运行的,其他都无法编译通过。(虽然开发中很少会遇到这种)因为成员内部类的继承语法格式要求继承引用方式为 Outter.Inner 形式且继承类的构造器中必须有指向外部类对象的引用,并通过这个引用调用 super(),其实这个要求就是因为成员内部类默认持有外部类的引用,外部类不先实例化则无法实例化自己。
问:下面程序的运行结果是什么?为什么?
Listlist1=newArrayList();
Listlist2=newArrayList(){};
Listlist3=newArrayList(){{}};
Listlist4=newArrayList(){{}{}{}};
//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.
只有在你的微笑里,我才有呼吸。