final的用法

final?

根據程序上下文環境,Java關鍵字final這是無法改變的或者終態的含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變:設計或效率。

final類不能被繼承,沒有子類,final類中的方法默認是final的。

final方法不能被子類的方法覆蓋,但可以被繼承。

final成員變量表示常量,只能被賦值一次,賦值后值不再改變。

final不能用于修飾構造方法。

注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

?

1final? 

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,并且確信這個類不會載被擴展,那么就設計為final類。

?

2final方法?

如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。

使用final方法的原因有二:

第一、把方法鎖定,防止任何繼承類修改它的意義和實現。

第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行

例如:

public?class?TestFinal {

public?void?f1() {

System.out.println("f1");

}

?

// 無法被子類覆蓋的方法

public?final?void?f2() {

System.out.println("f2");

}

?

public?void?f3() {

System.out.println("f3");

}

?

private?void?f4() {

System.out.println("f4");

}

}

public?class?TestFinal2 extends?TestFinal {

public?void?f1() {

System.out.println("Test1父類方法f1被覆蓋!");

}

?

public?static?void?main(String[] args) {

TestFinal2 t = new?TestFinal2();

t.f1();

t.f2(); // 調用從父類繼承過來的final方法

t.f3(); // 調用從父類繼承過來的方法

// t.f4(); // 調用失敗,無法從父類繼承獲

}

}

?

3final變量(常量)

final修飾的成員變量表示常量,值一旦給定就無法改變!  

final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。  

從下面的例子中可以看出,一旦給final變量初值后,值就不能再改變了。  另外,final變量定義的時候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什么情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恒定不變的特征。

package?testfinal;

?

public?class?TestFinal4 {

private?final?String S?= "final實例變量S";

private?final?int?A?= 100;

public?final?int?B?= 90;

public?static?final?int?C?= 80;

private?static?final?int?D?= 70;

public?final?int?E; // final空白,必須在初始化對象的時候賦初值

?

public?TestFinal4(int?x) {

E?= x;

}

?

private?void?test() {

System.out.println(new?TestFinal4(1).A);

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

}

?

public?void?test2() {

final?int?a; // final空白,在需要的時候才賦值

final?int?b = 4; // 局部常量--final用于局部變量的情形

final?int?c; // final空白,一直沒有給賦值.

a = 3;

// a=4; 出錯,已經給賦過值了.

// b=2; 出錯,已經給賦過值了. } }?

}

?

public?static?void?main(String[] args) {

TestFinal4 t = new?TestFinal4(2);

// t.A = 101; // 出錯,final變量的值一旦給定就無法改變

// t.B = 91; // 出錯,final變量的值一旦給定就無法改變

// t.C = 81; // 出錯,final變量的值一旦給定就無法改變

// t.D = 71; // 出錯,final變量的值一旦給定就無法改變

System.out.println(t.A);

System.out.println(t.B);

System.out.println(t.C); // 不推薦用對象方式訪問靜態字段

System.out.println(t.D); // 不推薦用對象方式訪問靜態字段

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

// System.out.println(TestFianl3.E); // 出錯,因為E為final空白,依據不同對象值有所不同.

System.out.println(t.E);

TestFinal4 t1 = new TestFinal4(3);

????System.out.println(t1.E); // final空白變量E依據對象的不同而不同 }

}

4final參數

當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。

package?testfinal;

?

public?class?TestFinal3 {

public?static?void?main(String[] args) {

new?TestFinal3().f1(2);

}

?

public?void?f1(final?int?i) {

// i++;

//i是final類型的,值不允許改變的.

System.out.print(i);

}

}

?

?

final?

根據程序上下文環境,Java關鍵字final這是無法改變的或者終態的含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變:設計或效率。

final類不能被繼承,沒有子類,final類中的方法默認是final的。

final方法不能被子類的方法覆蓋,但可以被繼承。

final成員變量表示常量,只能被賦值一次,賦值后值不再改變。

final不能用于修飾構造方法。

注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

?

1final? 

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,并且確信這個類不會載被擴展,那么就設計為final類。

?

2final方法?

如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。

使用final方法的原因有二:

第一、把方法鎖定,防止任何繼承類修改它的意義和實現。

第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行

例如:

public?class?TestFinal {

public?void?f1() {

System.out.println("f1");

}

?

// 無法被子類覆蓋的方法

public?final?void?f2() {

System.out.println("f2");

}

?

public?void?f3() {

System.out.println("f3");

}

?

private?void?f4() {

System.out.println("f4");

}

}

public?class?TestFinal2 extends?TestFinal {

public?void?f1() {

System.out.println("Test1父類方法f1被覆蓋!");

}

?

public?static?void?main(String[] args) {

TestFinal2 t = new?TestFinal2();

t.f1();

t.f2(); // 調用從父類繼承過來的final方法

t.f3(); // 調用從父類繼承過來的方法

// t.f4(); // 調用失敗,無法從父類繼承獲

}

}

?

3final變量(常量)

final修飾的成員變量表示常量,值一旦給定就無法改變!  

final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。  

從下面的例子中可以看出,一旦給final變量初值后,值就不能再改變了。  另外,final變量定義的時候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什么情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恒定不變的特征。

package?testfinal;

?

public?class?TestFinal4 {

private?final?String S?= "final實例變量S";

private?final?int?A?= 100;

public?final?int?B?= 90;

public?static?final?int?C?= 80;

private?static?final?int?D?= 70;

public?final?int?E; // final空白,必須在初始化對象的時候賦初值

?

public?TestFinal4(int?x) {

E?= x;

}

?

private?void?test() {

System.out.println(new?TestFinal4(1).A);

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

}

?

public?void?test2() {

final?int?a; // final空白,在需要的時候才賦值

final?int?b = 4; // 局部常量--final用于局部變量的情形

final?int?c; // final空白,一直沒有給賦值.

a = 3;

// a=4; 出錯,已經給賦過值了.

// b=2; 出錯,已經給賦過值了. } }?

}

?

public?static?void?main(String[] args) {

TestFinal4 t = new?TestFinal4(2);

// t.A = 101; // 出錯,final變量的值一旦給定就無法改變

// t.B = 91; // 出錯,final變量的值一旦給定就無法改變

// t.C = 81; // 出錯,final變量的值一旦給定就無法改變

// t.D = 71; // 出錯,final變量的值一旦給定就無法改變

System.out.println(t.A);

System.out.println(t.B);

System.out.println(t.C); // 不推薦用對象方式訪問靜態字段

System.out.println(t.D); // 不推薦用對象方式訪問靜態字段

System.out.println(TestFinal4.C);

System.out.println(TestFinal4.D);

// System.out.println(TestFianl3.E); // 出錯,因為E為final空白,依據不同對象值有所不同.

System.out.println(t.E);

TestFinal4 t1 = new TestFinal4(3);

????System.out.println(t1.E); // final空白變量E依據對象的不同而不同 }

}

4final參數

當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。

package?testfinal;

?

public?class?TestFinal3 {

public?static?void?main(String[] args) {

new?TestFinal3().f1(2);

}

?

public?void?f1(final?int?i) {

// i++;

//i是final類型的,值不允許改變的.

System.out.print(i);

}

}

?

?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

愛恨交織的編程語言 是什么吸引了你

摘要:每門編程語言都有自身獨特的地方,那么為什么有些語言會一直存活在我們周圍,而有些語言卻逐漸被人淡忘,是什么吸引你? 每名程序員至少知道兩門以上的編程語言,有些甚至不是所謂的編程語言(比…

Unable to parse the date: 2017-12-30 日期格式轉化失敗

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如題, 日期格式轉化失敗。 原因:參數是2017-09-23 這種格式,代碼卻是寫的轉為: &qu…

linux邏輯卷管理

2019獨角獸企業重金招聘Python工程師標準>>> 摘要: Linux用戶安裝Linux操作系統時遇到的一個最常見的難以決定的問題就是如何正確地給評估各分區大小,以分配合適的硬盤空間。而遇到出現某個分區空間耗盡時,解決的方法通常是使用符…

[LeedCode]921. 使括號有效的最少添加

題目描述: 給定一個由 ( 和 ) 括號組成的字符串 S,我們需要添加最少的括號( ( 或是 ),可以在任何位置),以使得到的括號字符串有效。從形式上講,只有滿足下面幾點之一,括號字符串才是…

abstract的一些用法

abstract(抽象)修飾符,可以修飾類和方法 1,abstract修飾類,會使這個類成為一個抽象類,這個類將不能生成對象實例,但可以做為對象變量聲明的類型,也就是編譯…

github 如何設置項目的語言顯示

github 會根據一個項目文件最多的那個種類的文件顯示為對應的語言項目 如果想讓整個項目顯示為 HTML 項目, 需要進行以下步驟的設置 1.在根目錄下創建一個文件 .gitattributescreate .gitattributes2.在 .gitattributes 內編輯以下內容: *.js linguist-languageHTML…

C++提高進階,你知道多少?

C從零開始 ——何謂編程 引言 曾經有些人問我問題,問得都是一些很基礎的問題,但這些人卻已經能使用VC編一個對話框界面來進行必要的操作或者是文檔/視界面來實時接收端口數據并動態顯示曲線(還使用了多線程技術),卻連…

POJ 3352 Road Construction ; POJ 3177 Redundant Paths (雙聯通)

這兩題好像是一樣的,就是3177要去掉重邊。 但是為什么要去重邊呢??????我認為如果有重邊的話,應該也要考慮在內才是。 這兩題我用了求割邊,在去掉割邊,用DFS縮…

postman界面變成了左右結構怎么辦

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 在左上角 file -- settongs中設置一下:

面向對象階段個人總結

面向對象階段的個人總結 我個人對面相對向的總結。我想到了我認為比較好的方法,就是對照每次學習一個大模塊的前的章節目錄進行回顧總結,比如我們這階段學習是面向對象的課程,下面我就來按照章節 目錄進行一個系統…

1.springboot:入門程序

一、Spring Boot 簡介 官網英文: Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. We take an opinionated view of the Spring platform and third-party libraries so you can get st…

2018.12.18運算符,分支結構(循環),異常處理,函數

1復習 <!DOCTYPE html><html><head> <meta charset"UTF-8"> <title>復習預習</title> <style> .b { /* 作用域: {}產生的, {作用域開始的標識, }作用域結束的標識 */ /*出現在作用域中的所有內…

javax.ws.rs.NotSupportedException: Cannot consume content type

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a;javax.ws.rs.NotSupportedException: Cannot consume content type 解決&#xff1a;使用postman發送 post 請求訪…

java異常預習

java中的異常捕獲結構有try&#xff0c;catch&#xff0c;finally三部分組成。其中&#xff0c;try語句塊存放的是可能發生異常的java語句&#xff1b;catch程序塊在try語句塊之后&#xff0c;用來激發被捕獲的異常&#xff1b;finally語句塊是異常處理結構的最后執行部分&…

【親測有效】Kali Linux無法安裝網易云音樂的解決方案

問題描述 由于 Kali Linux 的內核是基于 Debian 的&#xff0c;我們在安裝網易云音樂的時候更偏向于選擇安裝網易云音樂 v1.1.0 deepin15&#xff08;64位&#xff09; 的包&#xff0c;可是我發現在安裝過程中&#xff0c;無法定位 libqcef1 軟件包&#xff0c;對于很多鐘愛網…

C/C++函數名修飾約定

函數名字修飾&#xff08;Decorated Name&#xff09;方式 函數的名字修飾&#xff08;Decorated Name&#xff09;就是編譯器在編譯期間創建的一個字符串&#xff0c;用來指明函數的定義或原型。 正在裝載數據…… LINK程序或其他工具有時需要指定函數的名字修飾來定位函數的…

設計模式中類之間的關系

設計模式 個人感覺設計模式是程序員的核心技能 &#xff0c;然后看了一些設計模式的書&#xff0c;都是講設計模式的一些理論&#xff0c;放在實現上都有點模糊&#xff0c;后來圖書館看到一本《設計模式的藝術》&#xff0c;感覺很不錯&#xff0c;有一些比較具體且容易理解的…

如何查看jar包的版本號?

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 jar包根目錄里的META-INF目錄下的MANIFEST.MF文件里一般有會記錄版本信息&#xff0c;可以到這個文件里查看 打開Java的JAR文件我們經…

JAVA中的toString()方法的用法

toString是Object類的方法&#xff0c;所有類都從Object類繼承。如果你定義的類沒有覆蓋toString方法&#xff0c;則對象在調用toString方法時用的是Object類toString方法&#xff0c;返回的是“類名hashcode". System.out.println(obj)在參數是一個對象時&#xff0c;會首…

kotlin使用spring data jpa(一)

2019獨角獸企業重金招聘Python工程師標準>>> 簡單查詢 spring data jpa是spring全家桶成員之一&#xff0c;用于操作各種數據庫&#xff0c;下面寫一個查詢訂單的簡單示例 引入sqlserver驅動包及jpa所需包implementation(org.springframework.boot:spring-boot-star…