首頁 > Java > Java面試題 > 面試官:請詳細說明final關鍵字的作用,以及它與static的差異

面試官:請詳細說明final關鍵字的作用,以及它與static的差異

王林
發布: 2021-03-08 10:27:40
轉載
4564 人瀏覽過

面試官:請詳細說明final關鍵字的作用,以及它與static的差異

前言:

果不其然,在上次的面試中面試官又問了這樣的問題:請你說下final關鍵字的具體含義,並詳細講解它的作用以及它與static的區別。為了讓正在面試中的各位重視這個問題,特意將答案整理出來以供大家參考。

1、final關鍵字的意思

final表面意思是不可更改的,恆量的意思;類似C語言中的const關鍵字,指的是無法改變的量,這與靜態標量static是有差別的,靜態變數指的是只有一份儲存空間,值是可以改變的。使用final一定原因是出於軟體設計的角度,因為別人看到final這個關鍵字就知道是什麼意思,達到心領神會的效果,但也正是由於這種"語義"的存在,在程式設計中要謹慎使用,以免誤用。

在Java中final修飾的是常數,而且變數名稱要大寫;

Math類別:public static final double E = 2.7182818284590452354;public static final double PI = 3.1415926535846. .....java源碼中好多變數都用final修飾

2、final的作用

final根據修飾位置的不同作用也不相同,針對三種情況:

(1)修飾變量,被final修飾的變數必須初始化,賦初值後不能再重新賦值。

注意:局部變數不在我們討論的範疇,因為局部變數本身就有作用範圍,不使用private、public等詞修飾。

(2)修飾方法,被final修飾的方法代表不能重寫。

(3)修飾類,被final修飾的類,不能夠被繼承。

注意:final修飾的類,類別中的所有成員方法都被隱式地指定為final方法。

2.1、final修飾變數


被final修飾的變數必須顯示的初始化,初始化可以以三種方式:1)定義時初始化,2)在建構器中設置值,3)在非靜態區塊中為final實例變數設定值。

final修飾變數指的是:這個變數被初始化後便不可改變,這裡不可改變的意思對基本型別來說是其值不可變,而對於物件變數來說其引用不可變,即不能再指向其他的對象。

public class Test01{    
    final int x1= 10000;    
    final int x2;    
    final int x3;
    {
       x2 = 20000;
        }
    Public exe3(){        
        this.x3 = 3000;
        }
}
登入後複製

如果final修飾的變數是物件類型,那麼不可更改指的是該變數不可以再指向別的對象,但是當物件的值時可以更改的,例如:

final Operate operate = new Operate() ;// operate有一个普通变量i初始化为10operate.i = 11;
operate.i = 12;
System.out.println(operate.i); //输出12上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。
登入後複製

3、final和static的區別

static作用於成員變數用來表示只保存一份副本,而final的作用是用來保證變數不可變,看一下網路上的一個例子:

public class Test {
    public static void main(String[] args)  {
        MyClass myClass1 = new MyClass();
        MyClass myClass2 = new MyClass();
        System.out.println(myClass1.i);
        System.out.println(myClass1.j);
        System.out.println(myClass2.i);
        System.out.println(myClass2.j);
 
    }
}
class MyClass {
    public final double i = Math.random();
    public static double j = Math.random();
}
//运行结果,两次打印,j的值都是一样的,j是static类型的属于类,因此两次值相同。i不是static的因此属于对象,但是i的值是不可变的。
登入後複製

(學習影片分享:

java影片教學

4、其他final相關的知識


(1)使用final關鍵字,如果編譯器能夠在編譯階段確定某變數的值,那麼編譯器就會把該變數當作編譯期常數來使用。如果需要在執行時間確定,那麼編譯器就不會最佳化相關程式碼。

public class Test {    
    public static void main(String[] args)  {
        String a = "hello2";  
        final String b = "hello";
        String d = "hello";
        String c = b + 2;  
        String e = d + 2;
        System.out.println((a == c));
        System.out.println((a == e));
    }
}
    //final类型,在编译阶段能够确定值。
    //非final类型在编译阶段确定不了
    输出:
        true
        false
    public class Test {    
            public static void main(String[] args)  {
            String a = "hello2";  
            final String b = getHello();
            String c = b + 2;  
            System.out.println((a == c));
 
        }     
    public static String getHello() {        
        return "hello";
    }
}
//即便是final类型,编译阶段也确定不了值。输出false
登入後複製

(2)注意不要將final與finally、finalize()等搞混。

(3)將類別、方法、變數宣告為final能夠提高效能,這樣JVM就有機會進行估計,然後最佳化。

(4)介面中的變數都是public static final 的。

相關推薦:

java面試題目及答案

原文連結:

http://www.cnblogs.com/liun1994/p/6691094.html

原文作者:隨風浪子90

以上是面試官:請詳細說明final關鍵字的作用,以及它與static的差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板