av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

Java中final關鍵字的使用與注意總結

瀏覽:31日期:2022-08-26 16:31:57

前言

在java中可以將實例域定義為final。在構建對象是必須初始化這樣的值。必須確保在每個構造器執行之后,這個域的值被設置,并且在后面的操作中不再對其修改。使用final聲明變量之后,這個值就不能修改,一般final類型的變量都被聲明為靜態變量,而且是公有類型的,它在內存中被放在一個特有的公共區域。

也就是說,在Java語法中規定,final修飾的成員變量必須有程序員顯式地指定初始值。

定義格式為: public static final double pi = 3.1415926;

final修飾符大多應用于基本類型域,或不可變類的域(如果類中的每個方法都不會改變其對象,這種類成為不可變類。比如說Java中的String類就是一個不可變類。)

如果定義了兩個相同的變量,都是final類型的,這兩個相同的變量名有著不同的值,其實在內存中是開辟了兩個內存空間,之前定義的變量的值會被后來定義的變量的值覆蓋掉。原理是變量名指向后來定義的變量值的內存空間,之前定義的變量值會被Java虛擬機根據某種特定的算法在特定的時間處理掉。

在下面的代碼中詳細的介紹了final類型的變量如何進行定義和初始化:

public class FinalVariableText { //定義成員變量是指定默認值,合法 final int a = 6; //下面變量將在構造器或初始化塊中分配初始值 final String str; final int c ; final static double d; //既沒有指定默認值,也沒有在初始化塊、構造器中指定初始值 //下面定義的ch實例變量是不合法的 //final char ch; { //在初始化塊中只懂初始值,合法 str ='hello' ; //定義a實例變量已經有初始值了,不能為a重新賦值。下面的語句是不正確的 //a = 9; } //靜態初始化塊 static { // d是靜態成員變量,必須在靜態初始化塊中為其指定初始值 d = 5.6; } //構造器,可對 沒有設置初始值的成員變量設置初始值 //構造器必須與類名相同,這一點注意! public FinalVariableText(){ //如果在初始化塊中對str賦初值,在構造器中在為str重新賦值,是不合法的,程序會拋出錯誤。 c = 5; } public void changeFinal() { //普通方法不能為final修飾的成員變量賦值 //d = 1.3; //也不能在普通方法中為沒有設置初始值的final類型的變量賦初值 //ch = ’ch’; } public static void main(String[] args) { FinalVariableText ff = new FinalVariableText(); System.out.println(ff.a); System.out.println(ff.c); System.out.println(ff.str); System.out.println(ff.d); }

結果:65hello5.6

注意:

如果打算在構造器、初始化塊中對final類型的成員變量進行初始化,則不要在初始化之前訪問成員變量的值,否則會引發程序報錯。

final也存在局部變量的情況

系統不會對局部變量進行初始化,局部變量必須由程序員顯式的進行初始化,因此使用final修飾局部變量的時候,既可以在定義是設定默認值,也可以不指定默認值。如果在定義是沒有進行設定默認值,則可以在后面的代碼中對該final變量賦初值,但只能一次,不可以重復賦值。當然如果在定義變量的時候就已經指定默認值,在后面的代碼中就沒有必要也不允許對該變量在進行賦值操作。

public void text(final int a) { //不能對fianl修飾的形參進行賦值操作 //a = 5; 該語句是不合法的 } public static void main(String[] args) { //定義final局部變量時,指定初始值,則該變量再無法進行賦值了 final String str = 'str'; //下面的語句會報錯,不合法 //str = 'Java'; //定義final變量沒有指定默認值,則可以被賦值一次 final int d; d = 5; //再對d進行新的賦值,不合法 // d = 8; }

Final修飾基本類型變量和引用類型的變量的區別

Final修飾基本類型變量上面已經講述的很清楚了,那引用類型的變量會有什么不同呢?對于引用類型的變量而言,它僅僅是保存了一個引用關系,final只保證這個引用類型變量所引用的地址不會改變,即一直引用同一個對象,但這個對象完全可以發生改變。下面通過代碼來驗證一下:

class Person1{ private int age; //有一個參數的構造函數 public Person1(int age) { this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }} public class FinalReferenceText { public static void main(String[] args) { final int [] arr = {5,6,12,9}; System.out.println(Arrays.toString(arr)); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); arr[2] = -8; System.out.println(Arrays.toString(arr)); //下面對arr重新賦值,非法 //arr = null; //final 修飾Person變量,p是一個引用變量 final Person1 p = new Person1(45); //改變Person對象的實例變量,合法 p.setAge(55); System.out.println(p.getAge()); //下面對p重新賦值,非法 //p = null; } }

結果:[5, 6, 12, 9][5, 6, 9, 12][5, 6, -8, 12]55

final方法

Final修飾的方法不可被重寫,如果處于某種原因,不希望子類重寫父類的某個方法,則可以使用final關鍵字修飾該方法。

如果父類中的方法的是公有的,則子類中不能有一個一樣方法名,一樣參數的方法,但如果父類中的方法是私有的,那么子類中完全可以寫一個一樣的方法。

對于private類型的方法,由于其只能在當前類中可見,其子類無法訪問到該方法,所以子類無法重寫該方法,那么,如果子類中存在一個與父類private方法有相同方法名,一樣的參數列表,相同的返回值的方法,也不是方法的重寫,只是重新定義了一個新的方法。因此,final修飾一個private方法,依然可以在其子類中定義和父類private類型一樣的方法,不會有程序錯誤。

public class PrivateFinalText{ //如果將訪問修飾符改成public,則其子類中的方法定義在程序編譯時會報錯 private final void text(); } class Sub extends PrivateFinalText{ //下面的方法完全沒有問題 public void text();}

以上是我目前對Java中final關鍵字的總結,稍后會有補充!!!

總結

到此這篇關于Java中final關鍵字的文章就介紹到這了,更多相關Java的final關鍵字內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 日韩欧美在线一区 | 亚洲精品久久久一区二区三区 | 久久久精| 中国大陆高清aⅴ毛片 | 欧美一区二区三区在线免费观看 | 亚洲成人在线免费 | 亚洲日本三级 | 久久久久久久久久久蜜桃 | 亚洲视频一区在线观看 | 国产日产精品一区二区三区四区 | 99视频在线免费观看 | 久久久性 | www.婷婷| 黄色免费网 | 久久69精品久久久久久久电影好 | 亚洲成年在线 | 国产情侣激情 | 日韩一区二区在线视频 | 免费看黄视频网站 | 国产日韩欧美在线一区 | www.日韩 | 精品一区二区三区不卡 | 欧美日韩一区二区三区在线观看 | 国产日韩一区二区三区 | 亚洲高清在线播放 | 成人小视频在线观看 | 国产98色在线 | 日韩 | 久久久久午夜 | 久久国产精品精品国产色婷婷 | 夜操| 高清欧美性猛交xxxx黑人猛交 | 欧美成人一区二免费视频软件 | av毛片| 天堂一区二区三区 | 国产精品一区二区三区在线 | 精品国产一区二区三区久久狼黑人 | 一级国产精品一级国产精品片 | 欧美成年视频 | 国产精品一区二区欧美 | 毛片网站在线观看 | 欧美欧美欧美 |