final,finally,finalize,static

1.final修飾類,方法,變量app

  • 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
    }
}
相關文章
相關標籤/搜索