Java内部类的分类和定义格式
1. 成员内部类
修饰符 class 外部类名称{
修饰符 class 内部类名称{
//...
}
//...
}
- 实例化内部类
Outer.Inner obj = new Outer().new Inner();
obj.methodInner();
- 如果出现了重名现象,格式为:
外部类名称.this.外部类成员变量名
外部类名称.this.成员方法名
注意不是super关键字,成员内部类不是子类
public class Outer {
int num = 10;
public class Inner {
int num = 20;
public void methodInner() {
int num = 30;
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(Outer.this.num);//10
}
}
}
2. 局部内部类
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名(参数列表){}
class 局部内部类名称{
//...
}
}
//...
}
- 外部类方法中需要对内部类实例化才可以使用,不能到外面使用,看下面例子
public class Outer {
int num = 10;
public void methodInner() {
class Inner{
int num = 20;
public void methodInner(){
System.out.println(num);
}
}
Inner obj = new Inner();
obj.methodInner();
}
}
public class Demo05Main {
public static void main(String[] args) {
Outer obj = new Outer();
obj.methodInner();
}
}
如果局部内部类想要访问成员方法的局部变量,那么这个局部变量必须是有效final的
- 从Java 8开始只要局部变量实施不变,那么final关键字可以省略。
原因:
- new出来的对象存在堆内存中
- 局部变量是跟着方法走的,在栈内存中
- 方法运行结束后,方法立即处栈,局部变量就会立即消失
- 但是new出来的对象会在堆内存中持续存在,知道垃圾回收消失
类的权限修饰符
public > protected > (default) > private
定义一个类的时候,权限修饰符规则:
- **外部类:**public /(default)
- **成员内部类:**public > protected > (default) > private
- **局部内部类:**什么都不能写,但也不是default