Java学习之内部类
一、什么是内部类
1、内部类的定义
内部类就是定义在另一个类(外部类)内部的类。你可以把它理解成:外部类是一个 "大房子",内部类是房子里的 "小房间"------ 小房间依赖大房子存在,且能直接访问大房子里的东西(成员变量、方法),而外部类要访问小房间的内容,需要先创建内部类的对象。
2、内部类的核心特点
①、内部类可以直接访问外部类的所有成员(包括 private 修饰的)
②、外部类访问内部类成员,必须先创建内部类的实例
③、内部类会生成独立的字节码文件,命名规则是 外部类名 **内部类名**.class(比如 OuterInner.class)。
二、内部类的分类
1、实例内部类
实例内部类是非静态的成员内部类,它属于外部类的实例(而非外部类本身)------ 你可以理解为:必须先有外部类的 "对象",才能创建实例内部类的对象,就像必须先有 "汽车"(外部类实例),才能有 "发动机"(内部类实例),发动机不能脱离汽车单独存在。
下面我们通过一段代码来向大家介绍内部类
OuterClass类
java
public class OuterClass {
public String name="外部类";
class Inner{
public void showOuterName() {
System.out.println("访问外部类的成员:" + name);
}
}
}
TestDemo类
java
public class TestDemo {
public static void main(String[] args) {
//1、创建外部类实例
OuterClass outerClass=new OuterClass();
//2、通过外部类实例创建内部类实例
OuterClass.Inner inner=outerClass.new Inner();
inner.showOuterName();
}
}
运行结果:

2、静态内部类
静态内部类的定义:用 static 修饰的成员内部类,属于外部类本身(而非外部类实例)。
静态内部类的特点::只能访问外部类的静态成员(静态变量、静态方法),创建时不需要外部类实例。
OuterClass类
java
public class OuterClass {
public static int data1=1;
private int data2=2;
static class Inner{
public static int data3=3;
private int data4=4;
public void test(){
System.out.println(data4);
System.out.println(data3);
System.out.println(data1);
//要想打印data2,需要先对外部类进行实例化
OuterClass outerClass=new OuterClass();
System.out.println(outerClass.data2);
}
}
}
TestDemo类
java
public class TestDemo {
public static void main(String[] args) {
//静态内部类的调用
OuterClass.Inner inner=new OuterClass.Inner();//注意调用静态内部类的调用
inner.test();
}
}
运行结果如下:

3、匿名内部类
匿名内部类的定义:匿名内部类是 Java 中一种特殊的内部类,它没有类名,通常用于快速创建一个只使用一次的类实例,特别适合简化代码。
匿名内部类的本质:
①、一个没有名字的局部内部类(定义在方法 / 代码块中)
②、必须继承一个父类,或者实现一个接口
③、定义的同时就创建了该类的实例(只能创建一个实例)
④、语法上是一个表达式,因此结尾必须以分号结束
下面我们来举一个匿名内部类的例子,来向大家解释说明匿名内部类的
匿名内部类的第一种调用方法
java
class OuterClass{
public void test(){
System.out.println("OuterClass::test()");
}
}
//测试类
public class TestDemo {
public static void main(String[] args) {
//第一种调用方法
OuterClass out= new OuterClass(){
@Override
public void test() {
System.out.println("重写test方法!!");
}
};
out.test();
}
}

匿名内部类的第二种调用方法
java
class OuterClass{
public void test(){
System.out.println("OuterClass::test()");
}
}
public class TestDemo {
public static void main(String[] args) {
//第二种调用方法
new OuterClass(){
@Override
public void test() {
System.out.println("第二种重写test方法!!");
}
}.test();
}

4、局部内部类
局部内部类是定义在方法、代码块(如 for/if 块)或构造方法中的内部类,它的作用域仅限于所在的方法 / 代码块内部,就像方法里的局部变量一样,出了这个范围就无法访问。
下面我们通过举例的方法来向大家讲解局部内部类
OuterClass类
java
public class OuterClass {
// 外部类的成员变量
private String outerField = "外部类变量";
// 定义一个方法,局部内部类写在这个方法里
public void outerMethod() {
// 方法内的局部变量(有效最终变量)
String localVar = "方法局部变量";
// ========== 定义局部内部类 ==========
class LocalInnerClass { // 这就是局部内部类,仅在outerMethod()内可见
// 局部内部类的成员变量
private String innerField = "局部内部类变量";
// 局部内部类的方法
public void innerMethod() {
// 可以访问:外部类成员变量、方法内的局部变量(有效最终变量)
System.out.println("访问外部类变量:" + outerField);
System.out.println("访问方法局部变量:" + localVar);
System.out.println("访问自身变量:" + innerField);
}
}
// ========== 调用局部内部类 ==========
// 1. 在方法内部创建局部内部类的实例(只能在当前方法内创建)
LocalInnerClass innerObj = new LocalInnerClass();
// 2. 调用局部内部类的方法
innerObj.innerMethod();
}
}
TestDemo类
java
public class TestDemo {
public static void main(String[] args) {
// 测试调用
OuterClass outerObj = new OuterClass();
outerObj.outerMethod(); // 触发局部内部类的创建和调用
// ❌ 错误:局部内部类仅在outerMethod()内可见,外部无法访问
// LocalInnerClass inner = new LocalInnerClass();
}
}
运行结果如下:
