zoukankan      html  css  js  c++  java
  • final, finally, finalize

    final

    1. final修饰类:

    final修饰类即表示此类已经是“最后的、最终的”含义。因此,用final修饰的类不能被继承,即不能拥有自己的子类。

    如果视图对一个已经用final修饰的类进行继承,在编译期间或发生错误。

     2. final修饰方法:

    final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。

    此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,

    将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是

    在子类中重新定义了新的方法。

    3. final 修饰变量:

    final修饰的变量表示此变量是“最后的、最终的”含义。一旦定义了final变量并在首次为其显示初始化后,final修饰的变量值不可被改变。

    对于一般的类属性和对象属性,由类和对象的初始化过程中可以看出,首先都进行了默认初始化。然后对有显示赋值的变量才再进行显示初始化。

    但对final修饰的类属性和对象属性而言,如果不显示初始化,其默认将是进行默认初始化后的值,这与final本身出发点矛盾,因此,Java语法规定:

    final修饰的类属性和变量属性必须要进行显示初始化赋值。

    final修饰符修饰的变量在由于其本身的特性,在编译期就能直接确定其值:

    public class Test {
        public static void main(String[] args) {
            String country = "China";
            String name = "qqyumidi";
            String userInfo = country + name;  //编译后此处依然是country和name变量
            String user = "China" + "qqyumidi";  //编译后此处直接变成Chinaqqyumidi
        }
    }
    public class Test {
        public static void main(String[] args) {
            final String country = "China";
            final String name = "qqyumidi";
            String userInfo = country + name;  //编译后此处直接是Chianqqyumidi
        }
    }

    finally

    finally作为异常处理的一部分,它只能用在try/catch语句中,并且finally语句块最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

    在try-catch-finally语句中执行return语句:finally会撤销try块和catch块的return语句,继续执行最后的finally块中的代码。

    finally在以下情况会不执行:

    1. 在 try 语句块中执行了 System.exit (0) 语句,终止了 Java 虚拟机的运行。

    2. 在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),或者突然死机或者断电

    finalize

    finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在对象被回收的时候被调用。其实gc可以回收大部分的对象,所以一般是不需要程序员去实现finalize的。 

    特殊情况下,才需要自定义finalize去释放一些资源,比如:

    • 一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。
    • 一个对象正在处理的是非Java 资源,比如,调用类似C的malloc( )函数,用它分配存储空间,而且除非调用了free( )函数,否则存储空间将不会得到释放,从而造成内存泄露。当然,free( )是C和C++中的函数,所以你需要在finalize( )中用本地方法调用它;
    • 文件句柄或window 字符字体,你要确认在一个对象被撤消以前要保证这些资源被释放。

    自定义finalize():

    protected void finalize( )
    {
    // finalization code here
    }
    • 关键字protected是防止在该类之外定义的代码访问finalize()标识符。
    • 使用finalize还需要注意一个事,调用super.finalize();

    一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象(而是在下一次垃圾回收动作发生时,才会真正回收对象占用的内存),所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。

    有三种情况会调用finalize():

    1. 所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
    2. 程序退出时为每个对象调用一次finalize方法。
    3. 显式的调用finalize方法
  • 相关阅读:
    hdu6060[贪心+dfs] 2017多校3
    Codeforces 547B. Mike and Feet[单调栈/队列]
    Codeforces 545E. Paths and Trees[最短路+贪心]
    gitignore使用
    es学习
    google浏览器安装jsonview
    sychronized关键字底层详解加锁升级过程
    idea 中 “XXX has broken path” 错误解决
    kafka高并发读写的原因
    window redis版本 安装
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/13535113.html
Copyright © 2011-2022 走看看