java中final、finally、finalized使用方法

首先需要明白  final和finally是关键字,finalize是一个方法。

1. final关键字

  final可以修饰类、方法、变量,

  • 修饰类表示类不可以被继承
  • 修饰方法表示此方法不可以被重写(覆盖)但是可以被重载
  • 修饰变量表示变量不可变(引用不可变--也就是不可以重新指向另一个对象,但是引用内容可以变),而且static final 经常用作常量处理。
package cn.qlq.fina;
/**
 * final 关键字使用
 * @author Administrator
 *
 */
public class TestCla {
    
    private static final int a = 1;
    
    private static final User u = new User();;

    public static void main(String[] args) {
        // a = 2;// final修饰的变量不可改变(引用不可变)
        
        // u=new User();//引用不可变,不可再指向其他对象,但是引用内容可以改变
        
        u.setUsername("sssssss");
        u.setUsername("XXXXXXX");
    }
    
    public void test1(final int x ){
//        x=1;//final修饰的变量不可改变,方法上的形参也不可以变
    }
}

2.finally的使用:---通常用于try..catch..之后关闭一些IO流等操作

  1. try语句没有被执行,如在try语句之前就返回了,这样finally语句就不会执行;因此说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。

  2. 如果在try代码块中执行System.exit(0)语句;那么将终止Java虚拟机JVM,因此,finally语句也不会被执行到。

  3. finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中return已经确定的返回值,如果返回值类型为传址类型,则影响;传值类型,则不影响。若finally里也有return语句则覆盖try或catch中的return语句直接返回。

测试代码:

package cn.qlq.test;

/**
 * 
 * @author Administrator
 *
 */
public class MyTest {

    public static final int i = 6;

    @SuppressWarnings("finally")
    public static long test1() {
        String val = "5d";
        long value = 5;
        try {
            value = Long.parseLong(val);
        } catch (NumberFormatException e) {
            System.out.println("catch...");
            return value++;
        } finally {
            System.out.println("finally...");
            value--;
            return value;
        }
    }
    
    public static void main(String[] args) {
        System.out.println(MyTest.test1());
    }
}

结果:

catch...
finally...
5

3.finalize()析构方法的使用

  finalize()在JVM回收对象的时候会调用该对象的此方法,用于垃圾回收的时候处理一些事情。

package cn.qlq.test;

/**
 * 
 * 测试finalize()方法,对象消亡的时候调用的方法,类似于C++的析构函数
 * @author Administrator
 *
 */
public class MyTest {

    public static final int i = 6; 
    
    @Override
    protected void finalize() throws Throwable {
        System.out.println("对象要死亡");
    }
    @SuppressWarnings("finally")
    public long test1() {
        String val = "5d";
        long value = 5;
        try {
            value = Long.parseLong(val);
        } catch (NumberFormatException e) {
            System.out.println("catch...");
            return value++;
        }finally {
            System.out.println("finally...");
            value--;
            return value;
        }
    }

    public static void main(String[] args) {
        MyTest my = new MyTest();
        System.out.println(my.test1());
        my = null;//清空对象的引用,使其被垃圾回收
        System.gc();//调用GC回收垃圾
    }
}

结果:

catch...
finally...
5
对象要死亡

原文地址:https://www.cnblogs.com/qlqwjy/p/9373927.html