作用域
用来确定变量名的可见性和他们的生命周期
就是一对大括号{}大括号外面的不能访问到大括号里面的数据
{
int a=1;
{
int b=1;
}
int c=1;
}对象作用域
java对象作用域和基本数据类型的作用域不一样,
java对象是由jvm中的gc完成对象的销毁,
只要gc不清理那么java对象就会一直在内存中只不过无法访问,
不过我们通过特殊的方式完成Java对象的救助
在java对象中有一个特殊的方法
@Override
protected void finalize() throws Throwable {
super.finalize();
}我们可以这个方法完成java对象的自救
public class demo1 {
static tem t;
public static void main(String[] args) {
t=new tem();
t.name="Hello";
t=null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.name);
t=null;
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.name);
}
static class tem{
String name;
@Override
protected void finalize() throws Throwable {
super.finalize();
t=this;
}
}
}
==》
Hello
Exception in thread "main" java.lang.NullPointerException
at com.bYiyLi.BasicDataType.demo1.main(demo1.java:23)
Process finished with exit code 1当第一将t赋值为null时,
按照道理来说第一次 t.name就会报错
但是第一次却访问成功还打印出了Hello
可是第二次却失败了
原因
finalize()是由gc调用的方法
在方法中我们成功的将对象重新赋值给了t ,这样就自救成功。
但是这个方法只能被gc执行一遍
,这就是第二次自救失败的原因。这个方法很早之前就推荐不使用不过却没有移除。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!