Java 内部类
一个事物的内部,还需要一个完整的结构进行描述,而这个结构只为外部服务,这个内部的完整结构叫内部类。可以将一个类定义到另一个类内,或一个方法内,里面的是内部类,外面的是外部类。
实例内部类
- 如何实例化内部类
- 外部类的成员在内部类中都能直接访问
package test2;
class OutClass {
private int a = 3;
public static int b = 2;
class InClass {
private int a = 1;
// 在运行时确定的
// static 修饰的调用不需要实例化就能调用,而这个变量在内部类需要实例化内部类才能使用
// public static int d = 2;
public static final int d = 3; // 在编译的时候就确定了,是个常量,不依赖于实例化
public int e = 2;
public void test() {
System.out.println("inClass::test");
System.out.println(this.a); // 1
System.out.println(a); // 1
System.out.println(OutClass.this.a); // 3
}
}
public void test() {
InClass inclass = new InClass();
System.out.println(inclass.a);
System.out.println(inclass.e);
System.out.println("outClass::test");
}
}
public class TestNbl {
public static void main(String[] args) {
// 实例化内部类
OutClass class1 = new OutClass();
OutClass.InClass class2 = class1.new InClass();
OutClass.InClass class3 = new OutClass().new InClass();
class1.test();
class2.test();
}
}
- 字节码文件 外部类类名$内部类类名.class
静态内部类
创建外部类对象的引用。静态内部类不需要有外部类对象的引用。
class OClass {
private int a = 1;
public static int b = 2;
public int c = 3;
static class IClass {
public int d = 4;
public static int e = 5;
private int f = 6;
public void test() {
OClass Out = new OClass();
System.out.println(Out.a);
System.out.println(b);
System.out.println(Out.c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println("iclass::test");
}
}
public void test() {
System.out.println("oclass::test");
}
}
public class TestNbl {
public static void main(String[] args) {
OClass.IClass a = new OClass.IClass();
a.test();
}
}
匿名内部类
你有一个类实现了 IA 接口,重写了 test 方法。
interface IA {
void test();
}
public class TestNbl {
public static void main(String[] args) {
// 第一种方法调用
// 匿名内部类对象
IA a = new IA() {
public void test() {
System.out.println("重写了接口的方法!");
}
};
a.test();
// 第二种方法调用
new IA() {
public void test() {
System.out.println("重写了接口的方法!");
}
}.test();
}
}
局部内部类
-
只能在其方法内部使用
-
不能被 public 和 static 修饰符修饰
-
很少使用
-
字节码文件 局部内部类在编译后会生成类似 OuterClass$1LocalInnerClass.class 的文件。


