Java| Java关键字-final,finalize,finally专题

来源:互联网 发布:c语言null没有数值 编辑:程序博客网 时间:2024/05/16 11:36

finalize方法

MyOpinion:
1.Java中是没有类似于C++的析构函数的.
2.finalize方法定义在Object中是protected方法.
3.java有自己的垃圾回收器,内存总是充足时,垃圾回收器永远不会执行.由于有垃圾回收器,关于内存是不需要程序员管理的.
4.finalize方法的主要作用是为了回收JNI(Java Native Interface)调用non-Java程序(C或C++)产生的内存.

析构函数介绍:
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
(MyOpinion: 析构函数与构造函数相对,用来做善后工作.出现在C++,Python语言中.)

finalize方法在Object中声明:

public class Object {    protected void finalize() throws Throwable {    }}

final

1)final介绍: final 可以用来修饰类,成员变量,方法.

2)final代码解释

public class FinalTest {    /* final修饰成员变量--成员变量必须显示初始化或者在构造方法中初始化 ,赋值后就能改变了. */    final String finalStr = "finalStr";    final String finalStr2;    final int finalInt;    final StringBuffer finalSB = new StringBuffer();// final修饰的对象的引用不能改变,但是里面的值可以改变。                                                    // 比如:finalSB.append("Yves");就改变了里面的值    public FinalTest() {        finalInt = 23;        finalStr2 = "finalStr2";    }    /* final修饰成员方法--成员方法能被子类继承,不能被子类覆写 */    final void finalMethod() {    }    /* final修饰成员内部类--类不能被继承 */    final class finalInnerClass {    }}
/** * final修饰类 类不能被继承 * * @author Yves He * */public final class FinalTest {    public void showYves() {    }}

3)final总结
①Final类不能被继承.
②Final变量能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是final对象里的数据可以被改变。也就是说final对象的引用不能改变,但是里面的值可以改变。
③类中的Final方法可以被子类继承,但是不能被子类修改。声明final方法的主要目的是防止该方法的内容被修改。

关于final的详细介绍:
https://www.w3cschool.cn/java/java-modifier-types.html

finally

1)finally介绍:
finally关键字用来创建在try代码块后面执行的代码块。无论是否发生异常,finally代码块中的代码总会被执行。在finally代码块中,可以运行清理类型等收尾善后性质的语句。

2)finally代码解释:

    public static void main(String[] args) {        try {            // 产生异常            int yves = 1 / 0;            // 出现异常后的的代码块不执行            System.out.println("Hello");        } catch (Exception e) {            // 出现异常时执行代码块        } finally {            // 一定执行代码块        }    }

常见问题:

  • 1.finalize()方法什么时候被调用?
    垃圾回收器准备释放内存的时候,会先调用finalize()。在垃圾回收器执行时会调用被回收对象的finalize()方法.
  • 2.析构函数(finalization)的目的是什么?
    圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法,但是在java中很不幸,如果内存总是充足的,那么垃圾回收啃呢个永远不会进行,也就是finailize()可能永远不被执行,显然指望它作收尾工作时靠不住的。那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。java程序由垃圾回收器,所以一般情况下内存问题不用程序由操心。但有一种JNI(java native interface)调用non-java程序(c或c++),finalize()的工作就是回收这部分内存。
    (MyOpinion:是由于使用本地方法native调用c或c++产生的内存空间,可以在西沟函数中去调用相应的释放函数来做内存维护,java产生的内存有Java的内存收集器来处理,不需要程序员来维护.)
  • 3.JAVA中FINAL, FINALLY, FINALIZE的区别?
    final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
    finally再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
    finalize 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

测试题目:

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。(对)finally是异常处理语句结构的一部分,表示总是执行。 (对)finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。(错不是关闭文件而是一些调用了native方法产生的资源)引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。(错,内容可以变)

参考:
java finalize方法的使用以及 finalize,final,finally的分别作用
http://blog.csdn.net/walkerjong/article/details/6950091