Java 中关于this、static、final 关键字的使用
this關(guān)鍵字
this 關(guān)鍵字主要有以下幾種作用:
1:當(dāng)類成員變量與局部成員變量重名時(shí),可以用this 關(guān)鍵字把局部成員變量賦值給類成員變量
2:this可以用來在構(gòu)造函數(shù)中調(diào)用其他構(gòu)造函數(shù) ???? //必須定義在構(gòu)造函數(shù)中的第一行
3:this調(diào)用本類中的其他方法,this通常省略
下面就通過一段代碼對(duì)上面的用法做一個(gè)示例:
public class TestThis {public static void main(String[] args) {This thisDemo = new This("Jas");thisDemo.showName();} }class This{private String username;This(){System.out.println("nonparametric constructor run......");}This(String username){this();this.username = username; }public void sayHello(){System.out.print("Hello" + " ");}public void showName(){this.sayHello(); //this 可以省略System.out.println(username);} }輸出
nonparametric constructor run……
Hello Jas
在上面這個(gè)有一個(gè)無參構(gòu)造器與一個(gè)有參構(gòu)造器,通過有參構(gòu)造器傳入一個(gè)String 類型的username,在類中也定義了一個(gè)private 私有的變量username,當(dāng)想要構(gòu)造器中的username 值賦給私有變量username 時(shí)就需要使用this 關(guān)鍵字,如果你不使用this 關(guān)鍵字,會(huì)得到一個(gè)警告:“Variable ‘username’ is assigned to itself”,此時(shí)私有的屬性 username 值為null。
通過上面的打印結(jié)果我們可以看出在創(chuàng)建有參構(gòu)造對(duì)象時(shí),無參構(gòu)造函數(shù)被調(diào)用了,我們就是通過this 關(guān)鍵字完成的。如果你想在無參構(gòu)造器中調(diào)用有參構(gòu)造器只要在this() 中傳入對(duì)應(yīng)的參數(shù)就可以了。我們還可以通過使用this 關(guān)鍵字調(diào)用本類中其他的方法,但我們不必要這么做,因?yàn)榫幾g器會(huì)自動(dòng)為我們添加。
static關(guān)鍵字
static關(guān)鍵字有以下幾種特點(diǎn):
1.static是一個(gè)修飾符,用于修飾成員
2.static修飾的成員變量被所有的對(duì)象共享
3.static優(yōu)先于對(duì)象的存在,因?yàn)閟tatic的成員變量隨著類的加載就已經(jīng)存在了
4.實(shí)現(xiàn)共享,static修飾的類成員變量和類方法可以用類名直接調(diào)用
5.static修飾的成員變量多了一種調(diào)用方式,可以直接被類名調(diào)用,類名.成員變量
類成員變量與靜態(tài)變量的區(qū)別:
1.生命周期不同
成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的回收而釋放
靜態(tài)變量隨著類的加載而存在,隨著類的消失而消失
2.調(diào)用方式不同
成員變量只能被對(duì)象調(diào)用
靜態(tài)變量可以被對(duì)象調(diào)用和類名調(diào)用
3.別名不同
成員變量也稱為實(shí)例變量
靜態(tài)變量稱為類變量
4.數(shù)據(jù)存儲(chǔ)位置不同
成員變量存在堆內(nèi)存的對(duì)象中,所以也叫對(duì)象的特有數(shù)據(jù)
靜態(tài)變量存儲(chǔ)在方法區(qū)(共享數(shù)據(jù)區(qū))的靜態(tài)區(qū),所以也叫對(duì)象的共享數(shù)據(jù)
static 關(guān)鍵字使用的注意事項(xiàng):(static 關(guān)鍵字修飾的變量并不是依賴于對(duì)象而存在,它依賴于類的存在而存在,所以在靜態(tài)方法中你不能調(diào)用非靜態(tài)方法(當(dāng)然你也不能調(diào)用非靜態(tài)變量),反過來卻是可以的。)
1.靜態(tài)方法只能訪問靜態(tài)成員。(非靜態(tài)既可以訪問靜態(tài)又可以訪問非靜態(tài))
2.靜態(tài)方法中不可以使用this和super關(guān)鍵字。(沒有聲明對(duì)象)
3.主函數(shù)是靜態(tài)的。(所以主函數(shù)只能訪問當(dāng)前類的靜態(tài)方法)
靜態(tài)代碼塊(存在于類中):
隨著類的加載而運(yùn)行,只執(zhí)行一次
作用:
用于給類初始化 –> 類比: 構(gòu)造函數(shù)給類對(duì)象初始化
一般適用于成員都是靜態(tài)變量的類中
static{ }
現(xiàn)在總結(jié)一下static 主要的一些應(yīng)用場(chǎng)景:當(dāng)你想要一個(gè)變量被由該類導(dǎo)出的所有對(duì)象共享時(shí),那么你可以將該變量定義為static 的,這樣做可以減少堆內(nèi)存的消耗。如果你想要一段代碼隨著類的加載只執(zhí)行一次時(shí)(并不隨著每個(gè)對(duì)象的創(chuàng)建都加載一次),那么你可以使用靜態(tài)代碼塊,比如當(dāng)我們想要加載一些配置文件的時(shí)候。
單例模式中惡漢式就是使用了靜態(tài)變量,該變量只會(huì)在內(nèi)存中創(chuàng)建一個(gè)對(duì)象。
class Person{private Person(){}Person static s = new Person();public static Person f(){return s;} }通過靜態(tài)代碼塊加載配置文件。
private static Properties pro = null;//初始化文件資源static{pro = new Properties();try{pro.load(new FileReader(BasicFactory.class.getClassLoader().getResource("config.properties").getPath()));}catch (Exception e) {e.printStackTrace();}}final關(guān)鍵字
這里主要介紹final 的三種情況:修飾數(shù)據(jù)、方法和類
修飾數(shù)據(jù)和參數(shù)
有的時(shí)候你希望告知編譯器一些數(shù)據(jù)時(shí)恒定不變的,那么final 關(guān)鍵字修飾的變量就能幫你完成這個(gè)任務(wù)。
1.一個(gè)永不改變的編譯期常量(被static 與 final 同時(shí)修飾)
2.一個(gè)在運(yùn)行時(shí)被初始化的值,而你卻不想改變它
對(duì)于基本數(shù)據(jù)類型,final 使數(shù)值恒定不變;對(duì)于對(duì)象的引用,final 使引用恒定不變。一旦被初始化指定一個(gè)對(duì)象那么就無法再把它改為指向另一個(gè)對(duì)象。
final 修飾方法
使用final 修飾方法的原因主要有兩個(gè):第一個(gè)原因是把方法鎖定,以防止任何繼承類修改它的含義(即:final 修飾的方法不可以被覆蓋);另一個(gè)原因就是效率,如果一個(gè)方法被修飾為final 的,就是同意編譯器將針對(duì)該方法的所有調(diào)用都轉(zhuǎn)為內(nèi)嵌調(diào)用。但是隨著Java版本的更新,虛擬機(jī)可以檢測(cè)到這種個(gè)情況,并優(yōu)化去掉這些效率反而降低的額外的內(nèi)嵌調(diào)用。所以現(xiàn)在只有在你明確禁止該方法被覆蓋時(shí),才會(huì)將該方法設(shè)置為final 的。
在這里提一下final 與private ,類中所有的private 方法都隱式的被指定為final 的。由于無法調(diào)用private 方法,因此也就無法覆蓋它。
修飾類
當(dāng)某個(gè)類的整體被修飾為final 時(shí),就意味著你不打算繼承該類,并且你不允許任何人這樣做。當(dāng)然如果你將一個(gè)類定義為final 的那么final 中的所有方法也都隱式的被指定為final 的。我們要謹(jǐn)慎使用final 關(guān)鍵字,因?yàn)槟泐A(yù)見一個(gè)類是否被復(fù)用是很困難的。在Java 原生類中很多就使用了final ,比如String ,Character 等。
參考書籍
《Java 編程思想》Bruce Eckel 著 陳昊鵬 譯
總結(jié)
以上是生活随笔為你收集整理的Java 中关于this、static、final 关键字的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界宝可梦阿尔宙斯指令(我的世界神奇
- 下一篇: Java 虚拟机内存分配与回收策略