【码农每日一题】Java 内部类(Part 3)相关面试题

274 阅读3分钟
关注一下嘛,又不让你背锅!

问:下面关于成员内部类 InnerClass 的子类实现 ChildInnerClassX 中哪些是可以编译运行的?

  1. class OutClass {

  2.    class InnerClass {

  3.    }

  4. }

  5. class ChildInnerClass1 extends OutClass.InnerClass {

  6. }

  7. class ChildInnerClass2 extends OutClass.InnerClass {

  8.    public ChildInnerClass2() {

  9.        super();

  10.    }

  11. }

  12. class ChildInnerClass3 extends OutClass.InnerClass {

  13.    public ChildInnerClass3(OutClass outClass) {

  14.        super();

  15.    }

  16. }

  17. class ChildInnerClass4 extends OutClass.InnerClass {

  18.    public ChildInnerClass3(OutClass outClass) {

  19.        outClass.super();

  20.    }

  21. }

答:只有 ChildInnerClass4 子类是可以编译运行的,其他都无法编译通过。(虽然开发中很少会遇到这种)因为成员内部类的继承语法格式要求继承引用方式为 Outter.Inner 形式且继承类的构造器中必须有指向外部类对象的引用,并通过这个引用调用 super(),其实这个要求就是因为成员内部类默认持有外部类的引用,外部类不先实例化则无法实例化自己。

问:下面程序的运行结果是什么?为什么?

  1. List list1 = new ArrayList();

  2. List list2 = new ArrayList(){};

  3. List list3 = new ArrayList(){{}};

  4. List list4 = new ArrayList(){{}{}{}};

  5. //1

  6. System.out.println(list1.getClass() == list2.getClass());

  7. //2

  8. System.out.println(list1.getClass() == list3.getClass());

  9. //3

  10. System.out.println(list1.getClass() == list4.getClass());

  11. //4

  12. System.out.println(list2.getClass() == list3.getClass());

  13. //5

  14. System.out.println(list2.getClass() == list4.getClass());

  15. //6

  16. 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.

只有在你的微笑里,我才有呼吸。