目录
在Java中,当一个事物的内部需要一个结构,而这个结构又只为这个事物服务的时候,我们就可以使用内部类(例如链表中的节点)。在Java中,可以将一个类定义在一个类或者方法的内部,这种用法我们称之为内部类。
内部类有三种类型:
实例内部类
静态内部类
局部内部类
匿名内部类
其中实例内部类和静态内部类又统称为成员内部类
实例内部类
- 实例内部类可以直接访问外部类的任意修饰符修饰的成员
- 如果外部类和内部类具有相同成员,则优先访问内部类的成员
- 若想访问外部类同名成员可使用 外部类名.this.成员名 的方式
- 内部类不能使用static成员,如果使用需要加上final修饰
class OuterClass{
public int num1 = 1;
private int num2 = 2;
public static int num3 = 3;
class InnerClass{
public int num4 = 4;
public int num1 = 10;
//public static int num = 5;//error
public static final int num = 5;
public void show(){
System.out.println(num1);//内部类的num1
System.out.println(OuterClass.this.num1);//外部类的num1
System.out.println(num2);
System.out.println(num3);
System.out.println(num4);
System.out.println(num);
}
}
}
public class Main {
public static void main(String[] args) {
//实例内部类创建对象
OuterClass out = new OuterClass();
OuterClass.InnerClass in = out.new InnerClass();
//OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();也可以
in.show();
}
}
运行结果:
静态内部类
- 静态内部类不能访问外部类的非静态成员
- 在创建静态内部类对象时不需要先创建外部类对象
class OuterClass{
public int num1 = 1;
private int num2 = 2;
public static int num3 = 3;
static class InnerClass{
public int num4 = 4;
public int num1 = 10;
//public static int num = 5;//error
public static final int num5 = 5;//静态内部类可创建静态成员
public static int num6 = 6;
public void show(){
System.out.println(num1);//内部类的num1
//System.out.println(num2);//访问外部类的num2报错,因为不是静态成员
System.out.println(num3);
System.out.println(num5);
System.out.println(num6);
}
}
}
public class Main {
public static void main(String[] args) {
//静态内部类创建对象
OuterClass.InnerClass in = new OuterClass.InnerClass();//不需要提前创建外部类对象
in.show();
}
}
运行结果:
局部内部类
局部内部类定义在方法内部,实际开发中使用较少,了解即可
注意:局部内部类对static的使用和实例内部类相同
public class Main {
public static void main(String[] args) {
int num1 = 1;
class InnerClass{
private int num2 = 2;
//public static int num3 = 3;
public static final int num4 = 4;
public void show(){
System.out.println(num1);
System.out.println(num2);
//System.out.println(num3);//不能定义static成员
System.out.println(num4);
}
}
//静态内部类创建对象
InnerClass in = new InnerClass();
in.show();
}
}
运行结果:
匿名内部类
在接口中使用,学习完进行补充