Java内部类详解:静态与非静态

需积分: 9 0 下载量 71 浏览量 更新于2024-08-05 收藏 3KB MD 举报
"内部类是Java编程中一个重要的特性,它允许我们在一个类的定义内部定义另一个类。这种设计模式提供了更高的代码封装性和复用性。本文将详细讲解内部类的相关知识点,包括内部类的分类、访问权限以及静态与非静态内部类的区别。" 在Java中,内部类分为两种主要类型:静态内部类(也称为嵌套类)和非静态内部类。这两种类型的内部类在使用和功能上有所不同。 **非静态内部类**: 1. **访问权限**:非静态内部类可以直接访问外部类的所有成员,包括私有变量、方法,无需通过对外部类对象的引用。这是因为非静态内部类会隐含地持有一个对外部类的引用,使得它能够访问外部类的非静态成员。 ```java class Outer { String out_string = "IamOuter"; public void Inner_1() { Inner01 in = new Inner01(); in.Print(); } class Inner01 { public void Print() { System.out.println("Inner01.Print()"); System.out.println("out_string=" + out_string); } } } ``` 2. **实例化**:非静态内部类需要一个外部类的实例才能被实例化。这意味着我们不能直接创建非静态内部类的对象,而是必须先创建外部类的对象,然后通过外部类对象来创建内部类的对象。 ```java public class InnerDemo01 { public static void main(String[] args) { Outer out = new Outer(); out.Inner_1(); } } ``` **静态内部类**: 1. **访问权限**:静态内部类只能访问外部类的静态成员,因为它们不持有对外部类的实例引用。静态内部类可以看作是外部类的静态成员,因此它们可以像普通静态类一样被声明、实例化。 ```java class Outer { String out_string = "IamOuter"; static String out_static = "static"; public void Inner_2() { Inner02 in = new Inner02(); in.Print(); } static class Inner02 { public void Print() { System.out.println("Inner02.Print()"); System.out.println(out_static); } } } ``` 2. **实例化**:由于静态内部类不依赖于外部类的实例,所以我们可以直接创建静态内部类的对象,而无需先创建外部类对象。 ```java public class InnerDemo01 { public static void main(String[] args) { Outer.Inner02 in = new Outer.Inner02(); in.Print(); } } ``` 总结来说,非静态内部类和静态内部类的主要区别在于对外部类成员的访问权限和实例化方式。非静态内部类具有更紧密的耦合性,能访问外部类的非静态成员,而静态内部类则更像是外部类的一个独立的类,只能访问外部类的静态成员。选择使用哪种类型的内部类取决于具体的设计需求和封装策略。