问:说说内部类和静态内部类的区别?

示例

内部类(Non-static Inner Class):

public class OuterClass {
    private String outerField = "我是外部类字段";

    class InnerClass {
        public void display() {
            System.out.println(outerField); // 可以直接访问外部类的成员
        }
    }

    public void showInnerClass() {
        InnerClass inner = new InnerClass(); // 实例化内部类
        inner.display();
    }
}

public class Test {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.showInnerClass(); // 外部类方法调用内部类
    }
}

静态内部类(Static Inner Class):

public class OuterClass {
    private static String outerField = "我是外部类静态字段";

    static class StaticInnerClass {
        public void display() {
            System.out.println(outerField); // 可以直接访问外部类的静态成员
        }
    }

    public static void showStaticInnerClass() {
        StaticInnerClass inner = new StaticInnerClass(); // 不需要外部类实例即可实例化
        inner.display();
    }
}

public class Test {
    public static void main(String[] args) {
        OuterClass.showStaticInnerClass(); // 直接通过外部类调用静态内部类的方法
    }
}
区别说明

1. 实例化

  • 内部类:需要依赖外部类的实例来创建实例。即内部类的实例与外部类的实例是绑定的,每一个内部类实例都隐式地持有一个外部类实例的引用。
  • 静态内部类:不需要外部类的实例即可创建实例,因为它属于类层级(而非实例层级),所以它可以直接通过外部类名来访问(如果它是publicprotected/default访问级别,并且在相同的包中或子类中)。

2. 访问权限

  • 内部类:可以直接访问外部类的所有成员(包括私有成员),因为它持有一个外部类实例的引用。
  • 静态内部类:只能直接访问外部类的静态成员。如果需要访问非静态成员,则必须通过外部类的实例。

3. 用途

  • 内部类:常用于实现回调接口(如事件监听器)、定义辅助类以及实现多继承的效果(Java不直接支持多继承,但可以通过内部类实现)。
  • 静态内部类:常用于作为工具类或者当内部类与外部类逻辑上较为独立时使用。它提供了一种将代码组织在一起的方式,但又保持了类的独立性和可重用性。
结语
特性内部类 (Non-static Inner Class)静态内部类 (Static Inner Class)
实例化需要外部类的实例不需要外部类的实例
访问外部类成员可以访问所有成员(包括私有)只能访问静态成员
持有外部类引用
用途实现回调、辅助类、多继承模拟组织代码、工具类、逻辑独立
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值