成员内部类的面试题

成员内部类的面试题

class Test01_InnerClass {
    public static void main(String[] args){
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }
}
//要求:使用已知的变量,在控制台输出30, 20, 10。
//内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用:外部类名.this

class Outer{
    public int num = 10;
    class Inner{
        public int num = 20;
        public void show(){
            int num = 30;
            //就近原则
            System.out.println(num);
            //20为内部类的一个成员
            System.out.println(this.num);
            //Inner不是Outer的子类,而是内部类,super就不行
            System.out.println(Outer.this.num);
        }
    }
}
### Java 内部类面试题 #### 1. 什么是静态内部类? 静态内部类是定义在外部类内部的静态类。它可以访问外部类的所有静态变量和方法,即使是 `private` 的也一样[^2]。静态内部类与普通类类似,可以定义静态变量、方法以及构造方法等。其他类使用静态内部类时,需要通过“外部类.静态内部类”的方式实例化,例如: ```java Out.Inner inner = new Out.Inner(); inner.print(); ``` #### 2. 静态内部类的应用场景有哪些? 静态内部类适用于与外部类关系密切但不依赖外部类实例的情况。例如,Java集合类 `HashMap` 中有一个静态内部类 `Entry`,用于表示键值对的抽象[^2]。由于 `Entry` 仅在 `HashMap` 内部使用且不需要依赖 `HashMap` 的实例,因此将其定义为静态内部类。 #### 3. 成员内部类的特点是什么? 成员内部类是定义在外部类中的非静态类。它不能包含 `static` 成员,除非是常量或类初始化块。成员内部类可以访问外部类的所有成员(包括 `private` 成员),并且必须通过外部类的实例来创建其对象。例如: ```java public class Outer { private int x = 10; class Inner { public void display() { System.out.println("x = " + x); } } } // 使用成员内部类 Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.display(); ``` #### 4. 局部内部类的作用是什么? 局部内部类是定义在方法或代码块中的类。它的作用范围仅限于定义它的方法或代码块内。局部内部类可以访问所在方法的参数和局部变量,但这些变量必须被声明为 `final` 或者是有效的 `effectively final`。例如: ```java public class Outer { public void method() { class LocalInner { public void display() { System.out.println("This is a local inner class."); } } LocalInner localInner = new LocalInner(); localInner.display(); } } ``` #### 5. 匿名内部类的特性是什么? 匿名内部类是没有名字的局部内部类,通常用于简化代码。它可以直接继承一个类或实现一个接口,并且只能使用一次。匿名内部类的语法如下: ```java Runnable runnable = new Runnable() { @Override public void run() { System.out.println("This is an anonymous inner class."); } }; new Thread(runnable).start(); ``` 匿名内部类可以访问外部类的所有成员以及当前作用域内的 `final` 或 `effectively final` 变量。 #### 6. 内部类的内存模型是什么? 当创建一个非静态内部类的实例时,该实例会隐式持有其外部类实例的引用。这意味着非静态内部类的对象与其外部类对象紧密绑定。如果外部类对象被垃圾回收,那么所有相关的非静态内部类对象也会被回收[^2]。 #### 7. 如何避免内存泄漏问题? 为了避免非静态内部类引起的内存泄漏,可以在不需要外部类引用的情况下将内部类定义为静态类。此外,还可以显式地将外部类引用设置为 `null`,以确保垃圾回收器能够正确回收资源。 --- ### 示例代码:静态内部类成员内部类的区别 以下代码展示了静态内部类成员内部类的区别: ```java public class Outer { private static int staticField = 10; private int instanceField = 20; // 静态内部类 public static class StaticInner { public void displayStatic() { System.out.println("Static field: " + staticField); // 访问外部类的静态字段 } } // 成员内部类 public class InstanceInner { public void displayInstance() { System.out.println("Instance field: " + instanceField); // 访问外部类的实例字段 } } public static void main(String[] args) { // 创建静态内部类实例 StaticInner staticInner = new StaticInner(); staticInner.displayStatic(); // 创建成员内部类实例 Outer outer = new Outer(); InstanceInner instanceInner = outer.new InstanceInner(); instanceInner.displayInstance(); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值