1、语法
//定义外部类
Class Outer{
//1.外部类成员
//2.成员方法
[访问修饰符] 数据类型 方法名([参数列表]){
//3.局部内部类
class 内部类名{
//4.内部类成员
}
//5.创建局部内部类对象:局部内部类名 对象 = new 局部内部类名();
//6.调用属性或者方法
}
}
说明
1)在方法中定义的内部类称为局部内部类;
2)与局部变量类似,在局部内部类前不允许加访问修饰符;外部类可以使用public 或 (default)修饰;成员内部类:可以使用public、protected、(default)、private;
3)局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部变量,但外部类的局部变量必须声明为final,JDK1.8+可以省略。原因:
-
new出来的对象存放在堆内存中;
-
局部变量跟着方法走,存储在栈内存中;
-
方法运行结束后,立即出栈,局部变量随之消失;
-
而局部类new出来的对象在堆内存中持续存在,走到垃圾回收消失
4)在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。
2、例子
public class Outer {
//外部类成员变量
int count = 100 ;
public void test() {
//注意:JDK1.8中,会自动进行检测,当局部内部类访问局部变量时,会隐式在该局部变量加final关键字,声明为常量
int local1 = 200 ;
final int local2 = 300 ;
//local = 300 ; //在此,再次给local变量赋值,会报错,常量不允许重新赋值
//局部内部类
class Inner {
void display() {
//访问外部类的成员变量
System.out.println(count);
//访问方法的final局部变量,JDK1.8会自动声明为final
System.out.println(local1);
System.out.println(local2);
}
}
//实例化局部内部类对象,并调用方法
Inner inner = new Inner() ;
inner.display();
}
}
public class MainTest {
public static void main(String[] args) {
Outer outer = new Outer() ;
outer.test();
}
}