局部内部类
如果一个类是定义在一个方法内部,那么他就是一个局部内部类。
//“局部”:只是当前所属的方法才能使用它,除了这个方法就不行了。
/*定义格式:
- 修饰符 class 外部类名称{//
- 修饰符 返回值类型 外部类名称方法(参数列表)
- {class 局部内名称{//}}}*/
/*小结: - public >protected>(default)>private
- 外部类:public/(default)
- 成员内部类:public protected default private
- 局部内部类:什么都不能写。 —*/
局部内部类Outer
代码:
public class Outer {
public void method()
{
class Inner{
int num=10;
//int num=20;
public void methodinner()
{
System.out.println(num);
}
}
Inner inner=new Inner();//只能在该方法中调用局部内部类的方法!
inner.methodinner();
}
}
主类:
代码:
public class Demo01Main {
public static void main(String[] args) {
Outer obj=new Outer();
obj.method();
}
}
注意事项:
/*局部内部类,如果希望访问所在方法的变量局部,那么这个局部变量必须是final的
- 备注:从java8开始,只要局部变量事实不变,那么final关键字可以省掉。
原因(为什么用final修饰) - 1.new来出的对象在堆内存中
- 2.局部变量跟着方法邹,在栈中
- 3.方法运行结束后,立即出栈,局部变量就会消失。
- 4.但是new出来的对象还在堆中,直到垃圾回收,如果上述过程执行完毕,对象还想调用局部变量的值,无法调用。所以使用final关键字来修饰。*/
举例:
代码:
public class MyOuter {
int num=10;
public void method()
{
class Myinner
{
/*final*/
int num=20;
// num=30;无法更改,fianl定义了!
public void methodinner()
{
System.out.println(MyOuter.this.num);//10
System.out.println(this.num);//20
}
}
Myinner myinner=new Myinner();
myinner.methodinner();
}
}