Java中的成员内部类(也称为非静态内部类)是定义在另一个类(外部类)内部的类。
这种内部类与它的外部类之间有着紧密的联系,主要体现在几个方面:它可以访问外部类的所有成员(包括私有成员),并且它的实例自动持有外部类实例的引用。下面详细讲解Java中的成员内部类:
1. 定义成员内部类
成员内部类定义在外部类的任何方法之外,通常作为外部类的一个成员存在。它不能包含静态成员(除了静态常量),因为成员内部类实例总是依赖于外部类实例。
public class Outer {private int age=18;public static String a;//成员内部类public class Inner{public String name;private int age=28;public void test(){System.out.println(age);System.out.println(a);int age=38;System.out.println(age);//38System.out.println(this.age);//28System.out.println(Outer.this.age);//18}}
}
2. 访问外部类成员
1.成员内部类可以直接访问外部类的所有成员(包括私有成员),而无需任何特殊语法。
2.可以在成员内部类的实例方法中,拿到当前外部类对象,格式:外部类名.this
3. 创建成员内部类实例
要创建成员内部类的实例,你需要先创建外部类的实例,然后通过外部类实例来创建内部类实例。这是因为成员内部类的实例总是与外部类的一个实例相关联。
public class test1 {public static void main(String[] args) {Outer.Inner in=new Demo1().new Inner();in.test();}
}
4. 成员内部类的用途
- 封装:成员内部类提供了一种将逻辑紧密相关的类组织在一起的方式,从而增强了代码的封装性。
- 回调:成员内部类可以作为回调接口的实现,这样可以避免在外部类中创建大量仅用于回调的匿名内部类。
- 访问控制:通过内部类,可以隐藏一些实现细节,同时允许在包级别或类级别控制访问。
5. 注意事项
- 成员内部类不能声明为
static
,因为静态成员属于类本身,而非类的实例。如果需要静态内部类,应使用静态内部类(也称为嵌套类)。 - 成员内部类实例的创建总是依赖于外部类实例,因此它们之间的生命周期也是紧密相关的。
- 成员内部类可以访问外部类的
this
引用,但不能直接访问外部类的静态成员(除非通过外部类名访问)。