当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
目录
内部类的分类
成员内部类:静态与非静态
成员内部类
一方面,作为外部类的成员
1. 可以调用外部类的结构
2. 可以被 static 修饰
3. 可以被四种不同的权限修饰
另一方面,作为一个类
1. 类内可以定义属性、方法、构造器等
2. 可以被 final 修饰,表示此类不能被继承。言外之意,不使用 final ,就可以被继承
3. 可以被 abstract 修饰
内部类使用注意事项
在局部内部类的方法中,如果调用局部内部类所声明的方法中的局部变量,要求此局部变量声明为 final
JDK 7 及之后版本:要求此局部变量显式的声明为 final 的
JDK 8 及之后的版本:可以省略 final 的声明
public void method() {
final int num = 10;
class AA{
public void show1() {
System.out.println(num);
}
}
内部类代码举例
public class InnerClassTest {
public static void main(String[] args) {
Animal.Dog dog = new Animal.Dog(); // 创建静态成员内部类实例
dog.show();
Animal a = new Animal();
Animal.Cat cat = a.new Cat(); // 创建非静态成员内部类实例
cat.play();
System.out.println("*********");
cat.display("dispaly name");
}
}
class Animal{
String name = "Animal name";
int age;
public void eat() {
System.out.println("Animal eat()");
}
// 静态成员内部类
static class Dog{
String name;
int age;
public void show() {
System.out.println("Dog show()");
}
}
// 非静态成员内部类
class Cat{
String name = "Cat name";
public void play() {
System.out.println("Cat play()");
Animal.this.eat(); // 调用外部类非静态属性
}
public void display(String name) {
System.out.println(name); // 方法的形参
System.out.println(this.name); // 内部类的属性
System.out.println(Animal.this.name); // 外部类的属性
}
}
}
>>> Dog show()
Cat play()
Animal eat()
*********
dispaly name
Cat name
Animal name