面试题:JAVA中final关键字的作用
final關鍵字的功能概述
??在Java中,關鍵字 final 的意思是終態,可以用于聲明變量、方法和類,分別表示基本類型變量值不可變,引用類型變量引用地址不可變但值可變,方法不可被覆蓋,類不可被繼承。下面進行詳細闡述。
1、用來修飾變量
??當使用final修飾一個變量(屬性)時,這個屬性就成為一個常量。此時可以考慮賦值的位置有直接初始化、代碼塊中初始化和構造器中初始化。
final修飾局部變量
??使用final修飾形參時,表明此形參是一個常量。當我們調用此方法時,給常量形參賦一個實參以后,就只能在方法體內使用此形參,而不能重新賦值。形參是局部變量,其作用域是整個方法體。
public void localArg(final int arg){
arg = 20;//編譯不通過,異常信息【Cannot assign a value to final variable 'arg'】
System.out.println(arg);
}
public void localArg(){
final int ARG = 10;//常量,基本類型變量
ARG += 20;//編譯不通過
}
final關鍵字修飾成員變量
??對于成員變量來說,一旦使用final關鍵字,也是不能再次改變。
??和局部變量的不同點在于,成員變量需要有默認值,因此必須手動賦值。final修飾的成員變量賦值途徑有兩個,而且只能二者選擇其一:①在定義的時候直接賦值,②在構造方法體里面賦值,此時必須保證所有重載的構造方法都對final修飾的成員變量賦值。
public User(Long id, int age, String name) {
super();
this.id = id;
this.age = age;
this.name = name;
var = 91;
}
//定義時直接賦值
private final int a = 32;
//使用構造方法賦值
private final int var;
public User() {
var = 90;
}
final修飾基本類型變量
??當使用final修飾基本類型變量時,不能對基本類型變量重新賦值,因此基本類型變量不能被改變。上文中的int ARG就屬于基本類型變量。
final修飾引用類型變量
??當使用final修飾引用類型變量時,比如對象和數組等,不可變的含義就是地址值不能改變,但是該地址指向的對象的內容是可以改變的。它保存的僅僅是一個引用,final只能保證這個引用類型變量所引用的地址不會改變,即一直引用同一個對象,但這個對象完全可以改變。
??這里引用一個網上常見的例子,以說明final修飾基本類型變量和引用類型變量的區別。
//final修飾基本類型變量和引用類型變量的區別
import java.util.Arrays;
class Person
{
private int age;
public Person(){}
// 有參數的構造器
public Person(int age) {
this.age = age;
}
public void setAge(int age){this.age = age;}
public int getAge(){return age;}
}
public class FinalReferenceTest {
public static void main(String[] args) {
//final修飾數組,iArr是一個引用變量
final int[] iArr = {5,6,12,19};
System.out.println(Arrays.toString(iArr));
//對數組元素排序,合法
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//對數組元素賦值,合法
iArr[2] = -8;
System.out.println(Arrays.toString(iArr));
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//下面語句對iArr重新賦值,非法
//iArr = null;
//final修飾Person變量,p是一個引用變量
final Person p = new Person(45);
//改變Person對象的age實例變量,合法
p.setAge(23);
System.out.println(p.getAge());
//下面語句對p重新賦值,非法
//p = null;
}
}
??綜上所述,對于一個被final修飾的變量,如果是基本數據類型的變量,則其數值一旦被初始化便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象,但是,可以改變其數值。
2.用來修飾方法
??當使用final修飾方法時,這個方法將成為最終方法,無法被子類重寫。但是,該方法仍然可以被繼承。例如Object類中的getClass()方法。使用IDEA,在User類中重寫 Object類中的getClass()方法,則可以看到如下異常信息,提示方法無法被子類重寫。
'getClass()' cannot override 'getClass()' in 'java.lang.Object'; overridden method is final
??在java中,把一個類中的方法修飾為final,意味著兩個功能,第一點是該方法不能被重載,第二點是允許編譯器將所有對此方法的調用轉化為inline(行內)調用的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高。第二點也同時提醒我們,要謹慎的將方法定義為final,因為如果方法很龐大,你的代碼量就會因為inline而迅速膨脹,可能反而會影響效率。
3.用來修飾類
??當用final修改類時,該類成為最終類,無法被繼承。簡稱為“斷子絕孫類”。
/***
* final用法3:修飾類,則該類成為最終類,無法被繼承
*下面這行代碼放開注釋,就會拋出異常提示
*/
//class MyString extends String{}
??比如常用的String類、System類、StringBuffer類,它們都是最終類。定義斷子絕孫類的目的是提高安全性,增強程序的可讀性。
??老鐵們, 因個人能力有限,難免有瑕疵,如果發現bug或者有更好的建議,那么請在文章下方留言!
總結
以上是生活随笔為你收集整理的面试题:JAVA中final关键字的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农商银行和农村信用社一样吗 两者性质不一
- 下一篇: AI面试助手面试精灵重磅发布“双栏模式”