final,finally,finalize,static

1.final修饰类,方法,变量

  • final修饰变量,变量的值不能改变。修饰局部变量,使用前初始化即可。 修饰成员变量,两种方法初始化,声明的同时初始化或构造方法中初始化
  • 如果final修饰的是基本类型变量,给定值后不能改变。如果是引用类型变量,引用指向的地址不能改变,但是地址中的内容可以变。
public class Student  {
    public final StringBuffer str = new StringBuffer("old");

    public static void main(String[] args) {
        Student stu = new Student();
        stu.str.append(" man");
        //地址没有变,但是内容改变了
        System.out.println(stu.str);// old man
    }
}
  • final修饰的方法不能被重写
  • final修饰的类不能被继承,保护类不被继承修改。一些基础类库被定义为final,例 Integer,Math…..

2.finally

  • finally关键字一般位于try/catch后,在try块运行结束后执行。finally块中的语句总是会在控制转移语句(break、continue、return等)执行之前执行。但是,如果在JVM执行try或者catch块的代码时退出了,那么finally块中的代码也就可能不会被执行到了,就像线程执行的时候被打断或者是直接被杀死这类的情况。
public class Finalll {

    public static void test(){
        try {
            System.out.println("try block");
            System.exit(0);//终止JVM
        } finally {
            System.out.println("finally block");
        }
    }

    public static void main(String[] args) {
        test();//try block
    }
}
  • 当程序执行到retrun时会把返回值放到一个临时栈中,而不是立即返回, 当执行完finally块中的代码后,才会把栈中的值返回。
public class Finalll {

    public static int test(){
        int a = 1;
        try {
            System.out.println("try block");
            return 1;
        } finally {
            System.out.println("finally block");
            //这里并没有使用return,所以只是更新了a的值,并没有更新临时栈的值, 所以返回值还是1
            a = 2;            
        }
    }

    public static void main(String[] args) {
        System.out.println(test());
        //输出结果:
        try block
        finally block
        1
    }
}

原文 

https://segmentfault.com/a/1190000022148462

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » final,finally,finalize,static

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址