未分类
2020-08-18 13:12:53
1822677238@qq.com
手机扫码查看
局部内部类访问外部内部类局部变量为什么要加final
public class demos{
public static void main(String[] args) {
Outer out=new Outer();
out.m1();
}
}
class Outer{
int a=10;
public void m1(){
/*final*/ String str="Hello";//默认添加final
class Inner{
int a=20;
public void m2(){
int a=30;
System.out.println("Inner m2()"+str);
System.out.println("Inner m2()"+a);
System.out.println("Inner m2()"+this.a);
System.out.println("Inner m2()"+Outer.this.a);
}
}
Inner in=new Inner();
in.m2();
}
}
局部内部类它整个使用范围在方法内部,作为一个类来讲,可以new它的对象,那么对象在堆里,局部变量在栈里,他们回收时机不同,栈里面的内容会立刻回收,只要范围一跨越出了方法就没有了,但是对象可不会立刻回收,换句话说,这程序方法执行完了,c是局部变量,它会被回收,”hello”是个对象,它在堆里,不回收,Inner in也是局部变量,它要被回收,但是这个对象在堆里,它也不回收,对象会伴随着java虚拟机的垃圾收集器运行时回收。
要区分:
局部变量立即回收,对象是要伴随一个周期的时点做垃圾收集的时候才回收,他们回收时点不一样。
既然对象回收时点要比局部变量更慢,有没有一种可能局部变量被回收,对象还在呢?
这个方法一旦执行完毕,只要程序没停,局部变量肯定没了,但是inner对象还存活着,不要担心new inner 对象出圈就找不到这对象了。
可以继承也可以实现接口
public class demos{
public static void main(String[] args) {
Outer out=new Outer();
out.m1();
out.p.print();
}
}
class Outer{
int a=10;
prints p=null;
public void m1(){
final String str="Hello";
class Inner implements prints{
int a=20;
@Override
public void print(){
int a=30;
System.out.println("Inner m2()"+str);
System.out.println("Inner m2()"+a);
System.out.println("Inner m2()"+this.a);
System.out.println("Inner m2()"+Outer.this.a);
}
}
p=new Inner();
}
}
interface prints{
void print();
}
- 本页地址 https://www.9713job.com/?p=2119
- 上一篇 <<2020java教程:内部类与常用类
- 下一篇 >>2020java教程:Object类



发表回复