javafinal類
① java中final有什麼用
根據程序上下文環境,Java關鍵字final有「這是無法改變的」或者「終態的」含義,它可以修飾非抽象類、非抽象類成員方法和變數。
final類不能被繼承,沒有子類,final類中的方法默認是final的。
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變數表示常量,只能被賦值一次,賦值後值不再改變。
final不能用於修飾構造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。
② java里final是什麼意思
final在java中的意思是表示最終的,無法改變的意思。
1.
final
定義數值表示這個數值是最終的,不可改變的,一旦改變是會出錯的,當用final作用於類的成員變數時,成員變數(注意是類的成員變數,局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。。
2.
final
定義方法表示這個方法是不能被重寫和重載的只能夠被子類繼承使用,使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final
方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。
3.
final
定義類便是這個類是最終的,是不能夠被繼承的,類中的方法也都是默認修飾了final方法,注意final類中的成員變數可以根據需要設為final。
③ 在Java中,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在Java里是什麼意思
final在java中的意思是表示最終的,無法改變的意思。
1.
final
定義數值表示這個數值是最終的,不可改變的,一旦改變是會出錯的,當用final作用於類的成員變數時,成員變數(注意是類的成員變數,局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。。
2.
final
定義方法表示這個方法是不能被重寫和重載的只能夠被子類繼承使用,使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final
方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。
3.
final
定義類便是這個類是最終的,是不能夠被繼承的,類中的方法也都是默認修飾了final方法,注意final類中的成員變數可以根據需要設為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修飾的類有什麼作用
Java中,final關鍵字可以用來修飾類、方法和變數(包括成員變數和局部變數)。下面就從這三個方面來了解一下final關鍵字的基本用法。
1.修飾類
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。
2.修飾方法
下面這段話摘自《Java編程思想》第四版第143頁:
「使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。「
因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設置為final的。
註:類的private方法會隱式地被指定為final方法。
3.修飾變數
修飾變數是final用得最多的地方,也是本文接下來要重點闡述的內容。首先了解一下final變數的基本語法:
對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。
⑦ JAVA,為什麼final類不能被繼承,如果定義為final的類該類裡面成員變數不特殊說明則是final類還是非final
這是final的規定。當將final用於類身上時,一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴展。
對於final類中的成員,可以定義其為final,也可以不是final。而對於方法,由於所屬類為final的關系,自然也就成了final型的。也可以明確的給final類中的方法加上一個final,但這顯然沒有意義。
採用final方法的第二個理由是程序執行的效率。將一個方法設成final後,編譯器就可以把對那個方法的所有調用都置入「嵌入」調用里。
只要編譯器發現一個final方法調用,就會(根據它自己的判斷)忽略為執行方法調用機制而採取的常規代碼插入方法(將自變數壓入堆棧;跳至方法代碼並執行它;跳回來;清除堆棧自變數;最後對返回值進行處理)。
(7)javafinal類擴展閱讀
final關鍵字的基本用法:
1、修飾類
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
2、修飾方法
final修飾的方法表示此方法已經是「最後的、最終的」含義,亦即此方法不能被重寫(可以重載多個final修飾的方法)。此處需要注意的一點是:因為重寫的前提是子類可以從父類中繼承此方法,如果父類中final修飾的方法同時訪問控制許可權為private。
將會導致子類中不能直接繼承到此方法,因此,此時可以在子類中定義相同的方法名和參數,此時不再產生重寫與final的矛盾,而是在子類中重新定義了新的方法。
3、修飾變數
final成員變數表示常量,只能被賦值一次,賦值後值不再改變。當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化後便不能發生變化。
如果final修飾一個引用類型時,則在對其初始化之後便不能再讓其指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
⑧ 在Java中,final修飾的類有什麼特點
一、Java中final修飾符既可以修飾類、方法,也可以修飾變數,基本規則如下:
1)用final修飾的類不能被擴展,也就是說不可能有子類;
2)用final修飾的方法不能被替換或隱藏:
①使用final修飾的實例方法在其所屬類的子類中不能被替換(overridden);
②使用final修飾的靜態方法在其所屬類的子類中不能被重定義(redefined)而隱藏(hidden);
3)用final修飾的變數最多隻能賦值一次,在賦值方式上不同類型的變數或稍有不同:
①靜態變數必須明確賦值一次(不能只使用類型預設值);作為類成員的靜態變數,賦值可以在其聲明
中通過初始化表達式完成,也可以在靜態初始化塊中進行;作為介面成員的靜態變數,賦值只能在其
聲明中通過初始化表達式完成;
②實例變數同樣必須明確賦值一次(不能只使用類型預設值);賦值可以在其聲明中通過初始化表達式
完成,也可以在實例初始化塊或構造器中進行;
③方法參數變數在方法被調用時創建,同時被初始化為對應實參值,終止於方法體(body)結束,在此
期間其值不能改變;
④構造器參數變數在構造器被調用(通過實例創建表達式或顯示的構造器調用)時創建,同時被初始化
為對應實參值,終止於構造器體結束,在此期間其值不能改變;
⑤異常處理器參數變數在有異常被try語句的catch子句捕捉到時創建,同時被初始化為實際的異常對象
,終止於catch語句塊結束,在此期間其值不能改變;
⑥局部變數在其值被訪問之前必須被明確賦值;
⑨ java中哪些類是final的
final---用於類、方法前;
final類---不可被繼承;
final方法---不可被覆蓋;
final類不能被繼承;
⑩ java final class 有什麼用
根據程序上下文環境,Java關鍵字final有「這是無法改變的」或者「終態的」含義,它可以修飾非抽象類、非抽象類成員方法和變數。
final類不能被繼承,沒有子類,final類中的方法默認是final的。
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變數表示常量,只能被賦值一次,賦值後值不再改變。
final不能用於修飾構造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。