作用域

用来确定变量名的可见性和他们的生命周期
就是一对大括号{}大括号外面的不能访问到大括号里面的数据

{
   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 协议 ,转载请注明出处!

常用判断 上一篇
基本数据类型 下一篇