在 Java 中,内部类是一个非常重要的概念,它可以将一个类定义在另一个类的内部,从而实现更加灵活的编程。
内部类的定义
内部类是定义在另一个类的内部的类,它可以访问包含它的外部类的成员,包括私有成员。Java 中内部类有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。
内部类的使用方法
1. 成员内部类
成员内部类是定义在另一个类的内部的非静态类,它可以访问外部类的所有成员,包括私有成员。成员内部类可以被外部类的所有方法访问,也可以被其他类访问,但需要通过外部类的对象来创建。
下面的代码演示了如何定义和使用成员内部类:
public class Outer {
private int num;
public void method() {
Inner inner = new Inner();
inner.print();
}
public class Inner {
public void print() {
System.out.println(num);
}
}
}
在上面的代码中,Inner
是一个成员内部类,可以访问外部类的私有成员 num
。在外部类的方法 method
中,我们通过创建 Inner
类的对象并调用 print
方法来访问 num
的值。
2. 局部内部类
局部内部类是定义在方法中的类,它只能在该方法中被访问。局部内部类可以访问外部类的所有成员,包括私有成员。
下面的代码演示了如何定义和使用局部内部类:
public class Outer {
private int num;
public void method() {
class Inner {
public void print() {
System.out.println(num);
}
}
Inner inner = new Inner();
inner.print();
}
}
在上面的代码中,Inner
是一个局部内部类,只能在 method
方法中被访问。在 method
方法中,我们创建 Inner
类的对象并调用 print
方法来访问 num
的值。
3. 匿名内部类
匿名内部类是没有名字的内部类,它通常用于创建一个实现了某个接口或继承了某个类的子类对象。匿名内部类可以在创建对象的同时定义类的实现。
下面的代码演示了如何定义和使用匿名内部类:
public class Outer {
public void method() {
Runnable runnable = new Runnable() {
public void run() {
System.out.println("Hello World!");
}
};
Thread thread = new Thread(runnable);
thread.start();
}
}
在上面的代码中,我们创建了一个匿名内部类来实现 Runnable
接口,并在其中定义了 run
方法。然后我们创建了一个 Thread
对象并将该匿名内部类的实例传递给它的构造函数,最后启动线程。
4. 静态内部类
静态内部类是定义在另一个类的内部的静态类,它不能访问外部类的非静态成员。静态内部类可以被外部类的所有方法访问,也可以被其他类访问,不需要通过外部类的对象来创建。
下面的代码演示了如何定义和使用静态内部类:
public class Outer {
private static int num;
public static class Inner {
public void print() {
System.out.println(num);
}
}
}
在上面的代码中,Inner
是一个静态内部类,可以访问外部类的静态成员 num
。在其他类中,我们可以通过 Outer.Inner
来访问该静态内部类。
内部类与外部类的关系
在 Java 中,内部类和外部类之间存在一定的关系。具体来说,内部类可以访问外部类的所有成员,包括私有成员,而外部类只能访问内部类的公有成员。
此外,内部类可以用 this
关键字来引用外部类的对象,从而访问外部类的成员。外部类也可以通过创建内部类的对象来访问内部类的成员。
示例代码
下面是一个完整的示例代码,演示了 Java 中内部类的使用方法:
public class Outer {
private int num;
public void method() {
Inner inner = new Inner();
inner.print();
}
public class Inner {
public void print() {
System.out.println(num);
}
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.num = 10;
outer.method();
Inner inner = outer.new Inner();
inner.print();
Runnable runnable = new Runnable() {
public void run() {
System.out.println("Hello World!");
}
};
Thread thread = new Thread(runnable);
thread.start();
Outer.Inner staticInner = new Outer.Inner();
staticInner.print();
}
}
在上面的代码中,我们定义了一个外部类 Outer
,其中包含一个成员内部类 Inner
和一个静态成员 num
。在 main
方法中,我们创建了一个 Outer
对象并为其成员变量 num
赋值。然后我们通过创建 Inner
类的对象来访问 num
的值。接着,我们创建了一个匿名内部类来实现 Runnable
接口,并在其中定义了 run
方法。然后我们创建了一个 Thread
对象并将该匿名内部类的实例传递给它的构造函数,最后启动线程。最后,我们通过创建 Inner
类的静态对象来访问静态内部类的方法。