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

面試官:請詳細說明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中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具