java被final修飾
Ⅰ 在java中char型變數為什麼被final修飾
char 不是一個類,它是簡單的基本類型. 對應的包裝類為 [public final class Character] 被final修飾. 被final修飾過的類不能被繼承, 也就是蔽宴或斷子絕孫了. 這祥返樣是為了保護宏伍java本身的數據類型. 包裝類不僅這一個被final 按道理應該是所有的包裝類都被終結了吧.
Ⅱ 在Java中,final修飾符要如何使用
final,字面上的意思是「最後的,最終的」,在Java中表示同樣的含義。
final可以用來修飾變數、方法和類。
1.final修飾類
final修飾類時表示此類是「最後的、最終的」,即不能被繼承,不能擁有自己的子類。
如果試圖對一個已經用final修飾的類進行集成,則會在編譯期間發生錯誤。
2.final修飾方法
final修飾方法表示此方法已經是「最後的、最終的」含義,即此方法不能被重寫,但是可以被重載。PS:重寫的前提是子類可以繼承父類的方法,如果父類中final修飾的方法同時設置許可權為private,則會導致子類不能繼承此方法。但是,可以在子類中重新定義相同方法名和參數的方法,此時不會產生重寫與final的矛盾。而是在子類中重新定義了新的方法。因為父類中及被private又被final修飾的那個方法根本沒有被繼承,子類在重新定義這個同名同參數方法時不會發生編譯錯誤。
3.final修飾變數
final修飾的變數表示此變數是「最後的、最終的」。一旦定義了final變數並且在為其顯示初始化後,final修飾的變數值不可被改變。
注意Attention:
1、final修飾的變數,無論是類屬性、對象屬性、形參還是局部變數,這些變數都需要程序員顯示初始化,系統不會對final成員邊來那個進行隱式初始化。
final修飾局部變數,與為被final修飾的變數一樣,都需要顯示初始化。即局部變數都需要顯示初始化。
對一般的類屬性和對象屬性而言,首先都是先進行默認初始化,然後在對有顯示賦值的變數進行顯示初始化。
2、Java規定final修飾的類屬性和變數熟悉感必須要進行顯示初始化賦值。
3、無論是度與基本數據類型還是引用數據類型,final修飾的變數都是首次顯示初始化後就不能修改的。對於final修飾的基本數據類型,由於在編譯時就能確定該變數的至,於是吧該變數當做常量來處理。(常量命名規則:多個有意義的單詞連接是,所有字元大寫,單詞之間用下劃線分割)。對於final修飾的是引用數據類型,由於無法在編譯是獲得值,只能在運行時獲得值。引用變數指向的是實際的對象,但是存儲的是所指向對象的地址,因此,氣質不能修改以為著其所指向的對象不能修改,即指向哪一個只能一直指向他,不能指向別的對象,但是可以修改這個對象內的屬性。
Ⅲ Java中final修飾的類有什麼作用
Java中,final關鍵字可以用來修飾類、方法和變數(包括成員變數和局部變數)。下面就從這三個方面來了解一下final關鍵字的基本用法。x0dx0a1.修飾類x0dx0a當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,運伏就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。x0dx0ax0dx0a在使用final修飾類悶漏的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。x0dx0a2.修飾方法x0dx0a下面這段話摘自《Java編程思想》第四版第143頁:x0dx0a「使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期螞悄爛的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。「x0dx0a因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設置為final的。x0dx0a註:類的private方法會隱式地被指定為final方法。x0dx0a3.修飾變數x0dx0a修飾變數是final用得最多的地方,也是本文接下來要重點闡述的內容。首先了解一下final變數的基本語法:x0dx0a對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。
Ⅳ Java 中,被final修飾的方法能被重載嗎
您好,提問者:
可以被重逗納載的,但是你如果重寫的話是不允許的,和指侍只要不是被修改喚吵,就符合java編程中final的規范。、
Ⅳ 在Java中,final修飾的類有什麼特點
關於Java中的final(2010-09-09 14:19:48)轉載▼標簽: javafinal 分類: Java知識學習
Java中的final共有三種用法:
final成員變數
當你在類中定義變數時,在其前面加上final關鍵字,那便是說,這個變數一旦被初始化便不可改變,這里不可改變的意思對基本類型來說是其值不可變,而對於對象變數來說其引用不可再變,但引用變數所指向的對象中的內容還是可以改變的。
其初始化可以在三個地方,
一是其定義處,也就是說在final變數定義時直接給其賦值,
二是在構造函數中。而且在Java1.1以前,只能是在定義時給值。
三是在初如化代碼塊中{} 或者static{}
下面這段代碼演示了這一點:更加詳細的探討請參考關於final變數的初始化探討
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Bat {
final double PI = 3.14; // 在定義時便給址值
final int i; // 因為要在構造函數中進行初始化,所以此處便不可再給值
final List list; // 此變數也與上面的一樣
Bat() {
i = 100;
list = new LinkedList();
}
Bat(int ii, List l) {
i = ii;
list = l;
}
public static void main(String[] args) {
Bat b = new Bat();
b.list.add(new Bat());//引用不可變,但引用指向的內容是可以變的
// b.i=25; syntax error i是不可變的
//b.list=new ArrayList();錯誤,對象引用是不可變的
System.out.println("I=" + b.i + " List Type:" + b.list.getClass());
b = new Bat(23, new ArrayList());
b.list.add(new Bat());
System.out.println("I=" + b.i + " List Type:" + b.list.getClass());
}
}
再例如,對於如下語句:
final StringBuffer a=new StringBuffer("immutable");
執行如下語句將報告編譯期錯誤:
a=new StringBuffer("");
但是,執行如下語句則可以通過編譯:
a.append(" broken!");
有人在定義方法的參數時,可能想採用如下形式來阻止方法內部修改傳進來的參數對象:
public void method(final StringBuffer param)
{
}
實際上,這是辦不到的,在該方法內部仍然可以增加如下代碼來修改參數對象,其它對象亦如此:
param.append("a");
在看一個例子
//: FinalData.java
//The effect of final on fields
class Value {
int i = 1;
}
public class FinalData {
// Can be compile-time constants
final int i1 = 9;
static final int I2 = 99;
// Typical public constant:
public static final int I3 = 39;
// Cannot be compile-time constants:
final int i4 = (int) (Math.random() * 20);
static final int i5 = (int) (Math.random() * 20);
Value v1 = new Value();
final Value v2 = new Value();
static final Value v3 = new Value();
// ! final Value v4; // Pre-Java 1.1 Error:for no initializer
// Arrays:
final int[] a = { 1, 2, 3, 4, 5, 6 };
public void print(String id) {
System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " + i5);
}
public static void main(String[] args) {
FinalData fd1 = new FinalData();
// ! fd1.i1++; // Error: can't change value,因為i1是final的
fd1.v2.i++; // Object isn't constant!這個可以是因為類Value中的i是普通變數
fd1.v1 = new Value(); // OK -- not final
for (int i = 0; i < fd1.a.length; i++)
fd1.a[i]++; // Object isn't constant!
//下面三個犯同樣的錯誤 Error: Can'tchange handle
// ! fd1.v2 = new Value();
// ! fd1.v3 = new Value(); //
// ! fd1.a = new int[3];
fd1.print("fd1");
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData();
fd1.print("fd1");
fd2.print("fd2");
}
}
輸出結果(由於上面用了隨機函數,所以輸出結果可能不一樣,但是規律是一樣的):
fd1: i4 = 4, i5 = 6
Creating new FinalData
fd1: i4 = 4, i5 = 6
fd2: i4 = 10, i5 = 6
結果分析:fd1與fd2的i4發現值總是不一樣,但i5的值卻是一樣的,這是為什麼呢?
我們可以發現定義i4與i5惟一的區別是後者多了一個static,由於final變數和static變數可以說
都只能存一個數據,他們惟一的區別是static變數是屬於類的,是類變數,只會被載入一次。
請參考該文章:Java_父類與子類的載入原理
而i4雖然是final的,但是它仍是個普通變數,屬於實例變數,每創建一個對象還是會被載入一次,又
由於是個隨機函數,所以最終的結果不一樣。
所以:一定要區分final與static final的細微差別。
使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的。
此程序很簡單的演示了final的常規用法。在這里使用在構造函數中進行初始化的方法,這使你有了一點靈活性。如Bat的兩個重載構造函數所示,第一個預設構造函數會為你提供默認的值,重載的那個構造函數會根據你所提供的值或類型為final變數初始化。然而有時你並不需要這種靈活性,你只需要在定義時便給定其值並永不變化,這時就不要再用這種方法。在main方法中有兩行語句注釋掉了,如果你去掉注釋,程序便無法通過編譯,這便是說,不論是i的值或是list的類型,一旦初始化,確實無法再更改。然而b可以通過重新初始化來指定i的值或 list的類型,輸出結果中顯示了這一點:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
還有一種用法是定義方法中的參數為final,對於基本類型的變數,這樣做並沒有什麼實際意義,因為基本類型的變數在調用方法時是傳值的,也就是說你可以在方法中更改這個參數變數而不會影響到調用語句,然而對於對象變數,卻顯得很實用,因為對象變數在傳遞時是傳遞其引用,這樣你在方法中對對象變數的修改也會影響到調用語句中的對象變數,當你在方法中不需要改變作為參數的對象變數時,明確使用final進行聲明,會防止你無意的修改而影響到調用方法。
另外方法中的內部類在用到方法中的參變數時,此參變也必須聲明為final才可使用,如下代碼所示:
public class INClass {
void innerClass(final String str) {
class IClass {
IClass() {
System.out.println(str);
}
}
IClass ic = new IClass();
}
public static void main(String[] args) {
INClass inc = new INClass();
inc.innerClass("Hello");
}
}
final方法
將方法聲明為final,那就說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴展,並且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。
另外有一種被稱為inline的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當你的方法主體非常龐大時,或你在多處調用此方法,那麼你的調用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。
類中所有的private方法從某種意義上講都是屬於final的,因為他們在其它地方沒法覆蓋,你可以在一個private方法前加final修飾符,但沒什麼意義。
final類
當你將final用於類身上時,你就需要仔細考慮,因為一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴展。對於final類中的成員變數,你可以定義其為final,也可以不是final。而對於方法,由於所屬類為final的關系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個final,但這顯然沒有意義。
下面的程序演示了final方法和final類的用法:
final class finals {
final String str = "final Data";
public String str1 = "non final data";
final public void print() {
System.out.println("final method.");
}
public void what() {
System.out.println(str + "\n" + str1);
}
}
public class FinalDemo { // extends final 無法繼承
public static void main(String[] args) {
finals f = new finals();
f.what();
f.print();
}
}
從程序中可以看出,final類與普通類的使用幾乎沒有差別,只是它失去了被繼承的特性。final方法與非final方法的區別也很難從程序行看出,只是記住慎用。
附註:
final在設計模式中的應用
在設計模式中有一種模式叫做不變模式,在Java中通過final關鍵字可以很容易的實現這個模式,在講解final成員時用到的程序Bat.java就是一個不變模式的例子。如果你對此感興趣,可以參考閻宏博士編寫的《Java與模式》一書中的講解。
Ⅵ Java中final修飾符可以分別用在什麼地方表示什麼意義
1,修飾類
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。
2,修飾方法
被final修飾的方法將不能被子類覆蓋,主要用於1,把方法鎖定,以防任何繼承類修改它的含。2,在早期的Java實現版本中,會將final方法轉為內嵌調用,所以效率能夠提升
3,修飾變數
對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。
當用final作用於類的成員變數時,成員變數(注意是類的成員變數,局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。
Ⅶ 在Java中,final修飾的類有什麼特點
1.可以修飾類、函數、變數。
2.被final修飾的類不可以被繼承。
3.被final修飾的方法不能被復寫。
4.被final修飾的變數是一個常量只能賦值一次,既可以修飾成員變數,又可以修逗旅飾局部變數。
加上final修飾,作為常量的話:常量的書寫規范是所有的字母都大寫,如果由多個單片語棚鎮成,單詞間通過「_」連接。
5.內部類定義在類中的局部位置上時,只能訪問該局部被final修鏈指粗飾的局部變數。
Ⅷ Java中final一個method或者一個class會導致什麼
final修飾符可以修飾類、方法、變數。
1、被final修飾橋謹的類不可以被繼承;李灶
2、被final修飾的方法不可以被重寫;
3、被敏擾基final修飾的變數不可以被再次賦值。
Ⅸ java中被final修飾的類調用時需要new 嗎
類中:加 static 的,可以直接用類名調,不加 static 的,需要 new