在类的内部存在的类叫做内部类,内部类是嵌套类的一种。具体可以分为以下4种:
静态内部类:使用static关键字修饰的类
成员内部类:不使用static关键字修饰的类
方法内部类:在方法内部存在的内,它的作用域只在方法内部
匿名内部类:涉及接口和抽象类,暂时不讨论
静态内部类
当开发者不想通过使用外部类的对象访问内部类,而是直接访问时,可以声明内部类为static类型。
静态内部类可以访问外部类的静态成员,但是不能访问外部类的非静态成员。(但可以通过对象访问,注意对象与类的区分)
定义静态内部类的方法如下:
class enclosingClass{
static class innerClass{
}
}
在静态内部类中,可以有静态成员,也可以有非静态成员。不管类是静态的还是非静态的,可以在main方法中直接使用的永远是静态成员。对于非静态成员,如果要使用,也必须先建立起实例对象,示例代码如下:
class enclosingClass{
static int outerA = 1;
int outerX = 5;
static class innerClass{
static int innerB = 2;
int innerC = 3;
public void getValue(){
outerA++;
System.out.println(outerA);
}
static void sayHello(){
System.out.println("Hello!");
}
}
public static void main(String[] args){
System.out.println(enclosingClass.innerClass.innerB); //外部类的main方法直接使用内部类的静态变量
innerClass.sayHello(); //直接使用内部类的静态方法
// System.out.println(enclosingClass.innerClass.innerC); //内部类的非静态方法不能直接使用,否则会报错
innerClass in = new innerClass(); //创建静态内部类对象
System.out.println(in.innerC); //使用静态内部类对象访问内部类非静态变量
in.getValue(); //使用静态内部类对象访问非静态方法
}
}
普通内部类/成员内部类
静态内部类去掉static关键字就成了成员内部类。成员内部类是外部类的成员字段,它必须要依赖于外部类的对象而存在。所谓皮之不存,毛将焉附。使用成员内部类首先要创建外部类对象,再通过外部类的对象new一个内部类对象。然后才能使用内部类的变量和方法。需要注意的是,成员内部类中不能存在静态字段,如果写了一个静态变量或者静态方法,编译器就会报错。这是静态内部类和成员内部类的主要区别之一。
class outerClass{
class innerClass2{
int aa = 15; //成员内部类不能有静态字段,否则会出错。
}
public static void main(String[] args){
enclosingClass.innerClass2 in2 = new enclosingClass().new innerClass2(); //通过外部类对象的new方法,创建内部类对象
System.out.println(in2.aa); //使用内部类对象
}
}
方法内部类
方法内部类比较简单,就是在方法内部使用类,方法内部类只能在方法内起作用,方法使用结束即终结。
class outerClass{
int method(int a){
class innerClass{ //方法内部类
}
}
}
学到这里,虽然学懂了概念,但是难以深入理解。等待过一段时间,再来深入全面总结一下内部类的知识。