可以把一个类的定义放在另一个类的内部,这就是内部类。内部类的主要作用是实现一种逻辑上的组织和封装,将相关的类放在一起,提高代码的可读性和模块化。
优点
①它可以访问外部类的所有成员,包括私有成员。
②内部类不为同一包的其他类所见,具有很好的封装性;
③内部类有效实现了"多重继承",优化 java 单继承的缺陷。
内部类可以分为四种:成员内部类、局部内部类、匿名内部类、静态内部类
成员内部类
成员内部类是定义在另一个类的内部的普通类。它可以访问外部类的所有成员,包括私有成员。成员内部类可以被用来组织和封装与外部类相关的逻辑。
创建方式:外部类实例.new 内部类()
public class OuterClass {
private int x;
public class InnerClass {
public void display() {
System.out.println("Value of x: " + x);
}
}
}
静态内部类
静态内部类是被声明为静态的内部类。它不持有外部类的引用,并且可以直接通过外部类名访问。
创建方式:new 外部类.静态内部类
public class OuterClass {
private static int y;
public static class NestedClass {
public void display() {
System.out.println("Value of y: " + y);
}
}
}
局部内部类
局部内部类是定义在方法内部的类。它只能在方法内部使用,不可被方法之外的任何代码访问。局部内部类可以访问外部方法的局部变量,但是这些变量必须是 final
或者是事实上的 final
。
创建方式:在对应方法内,new 内部类()
public class OuterClass {
public void display() {
final int z = 10;
class LocalInnerClass {
public void printValue() {
System.out.println("Value of z: " + z);
}
}
LocalInnerClass inner = new LocalInnerClass();
inner.printValue();
}
}
匿名内部类
匿名内部类是没有显式定义类名的内部类,通常用于创建只需要使用一次的类的实例。
匿名内部类必须继承一个抽象类或者实现一个接口。
匿名内部类不能定义任何静态成员和静态方法。
当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
匿名内部类不能是抽象的,它必须要实现继承的类或者实现
创建方式:new 类/接口{}
public interface MyInterface {
void display();
}
public class OuterClass {
public MyInterface createInstance() {
return new MyInterface() {
public void display() {
System.out.println("Anonymous inner class implementation");
}
};
}
}