《PHP教程:Java中final關(guān)鍵字詳解》要點(diǎn):
本文介紹了PHP教程:Java中final關(guān)鍵字詳解,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP編程談到final關(guān)鍵字,想必很多人都不陌生,在使用匿名內(nèi)部類的時(shí)候可能會(huì)經(jīng)常用到final關(guān)鍵字.另外,Java中的String類就是一個(gè)final類,那么今天我們就來了解final這個(gè)關(guān)鍵字的用法.
主要介紹:一.final關(guān)鍵字的基本用法.二.深入理解final關(guān)鍵字
PHP編程一.final關(guān)鍵字的基本用法
PHP編程 在Java中,final關(guān)鍵字可以用來修飾類、辦法和變量(包括成員變量和局部變量).下面就從這三個(gè)方面來了解一下final關(guān)鍵字的基本用法.
PHP編程 1.修飾類
PHP編程 當(dāng)用final修飾一個(gè)類時(shí),表明這個(gè)類不能被繼承.也就是說,如果一個(gè)類你永遠(yuǎn)不會(huì)讓他被繼承,就可以用final進(jìn)行修飾.final類中的成員變量可以根據(jù)需要設(shè)為final,但是要注意final類中的所有成員辦法都會(huì)被隱式地指定為final辦法.
PHP編程
PHP編程 在使用final修飾類的時(shí)候,要注意謹(jǐn)慎選擇,除非這個(gè)類真的在以后不會(huì)用來繼承或者出于平安的考慮,盡量不要將類設(shè)計(jì)為final類.
PHP編程 2.修飾辦法
PHP編程 下面這段話摘自《Java編程思想》第四版第143頁(yè):
PHP編程 “使用final辦法的原因有兩個(gè).第一個(gè)原因是把辦法鎖定,以防任何繼承類修改它的含義;第二個(gè)原因是效率.在早期的Java實(shí)現(xiàn)版本中,會(huì)將final辦法轉(zhuǎn)為內(nèi)嵌調(diào)用.但是如果辦法過于龐大,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升.在最近的Java版本中,不需要使用final辦法進(jìn)行這些優(yōu)化了.“
PHP編程 因此,如果只有在想明確禁止 該辦法在子類中被覆蓋的情況下才將辦法設(shè)置為final的.
PHP編程 注:類的private辦法會(huì)隱式地被指定為final辦法.
PHP編程 3.修飾變量
PHP編程 修飾變量是final用得最多的地方,也是本文接下來要重點(diǎn)闡述的內(nèi)容.首先了解一下final變量的基本語(yǔ)法:
PHP編程 對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象.
PHP編程 舉個(gè)例子:
PHP編程
PHP編程 上面的一段代碼中,對(duì)變量i和obj的重新賦值都報(bào)錯(cuò)了.
PHP編程二.深入理解final關(guān)鍵字
PHP編程 在了解了final關(guān)鍵字的基本用法之后,這一節(jié)我們來看一下final關(guān)鍵字容易混淆的地方.
PHP編程1.類的final變量和普通變量有什么區(qū)別?
PHP編程 當(dāng)用final作用于類的成員變量時(shí),成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時(shí)或者構(gòu)造器中進(jìn)行初始化賦值,而且final變量一旦被初始化賦值之后,就不能再被賦值了.
PHP編程 那么final變量和普通變量到底有何區(qū)別呢?下面請(qǐng)看一個(gè)例子:
PHP編程
public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}
PHP編程 true
false
PHP編程 大家可以先想一下這道題的輸出結(jié)果.為什么第一個(gè)比較結(jié)果為true,而第二個(gè)比較結(jié)果為fasle.
PHP編程這里面就是final變量和普通變量的區(qū)別了,當(dāng)final變量是基本數(shù)據(jù)類型以及String類型時(shí),如果在編譯期間能知道它的確切值,則編譯器會(huì)把它當(dāng)做編譯期常量使用.也就是說在用到該final變量的地方,相當(dāng)于直接拜訪的這個(gè)常量,不需要在運(yùn)行時(shí)確定.這種和C語(yǔ)言中的宏替換有點(diǎn)像.
PHP編程因此在上面的一段代碼中,由于變量b被final修飾,因此會(huì)被當(dāng)做編譯器常量,所以在使用到b的地方會(huì)直接將變量b 替換為它的? 值.而對(duì)于變量d的拜訪卻需要在運(yùn)行時(shí)通過鏈接來進(jìn)行.
PHP編程想必其中的區(qū)別大家應(yīng)該明白了,不過要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器才會(huì)進(jìn)行這樣的優(yōu)化,比如下面的這段代碼就不會(huì)進(jìn)行優(yōu)化:
PHP編程
public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c));
}
public static String getHello() {
return "hello";
}
}
PHP編程 這段代碼的輸出結(jié)果為false.
PHP編程2.被final修飾的引用變量指向的對(duì)象內(nèi)容可變嗎?
PHP編程 在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對(duì)象,那么該引用變量指向的對(duì)象的內(nèi)容可變嗎?看下面這個(gè)例子:
PHP編程
public class Test {
public static void main(String[] args) {
final MyClass myClass = new MyClass();
System.out.println(++myClass.i);
}
}
class MyClass {
public int i = 0;
}
PHP編程 這段代碼可以順利編譯通過并且有輸出結(jié)果,輸出結(jié)果為1.這說明引用變量被final修飾之后,雖然不能再指向其他對(duì)象,但是它指向的對(duì)象的內(nèi)容是可變的.
PHP編程3.final和static
PHP編程 很多時(shí)候會(huì)容易把static和final關(guān)鍵字混淆,static作用于成員變量用來表示只保存一份副本,而final的作用是用來保證變量不可變.看下面這個(gè)例子:
PHP編程
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
PHP編程 運(yùn)行這段代碼就會(huì)發(fā)現(xiàn),每次打印的兩個(gè)j值都是一樣的,而i的值卻是不同的.從這里就可以知道final和static變量的區(qū)別了.
PHP編程4.匿名內(nèi)部類中使用的外部局部變量為什么只能是final變量?
PHP編程 這個(gè)問題請(qǐng)參見上一篇博文中《Java內(nèi)部類詳解》中的解釋,在此處不再贅述.
PHP編程5.關(guān)于final參數(shù)的問題
PHP編程 關(guān)于網(wǎng)上流傳的”當(dāng)你在辦法中不需要改變作為參數(shù)的對(duì)象變量時(shí),明確使用final進(jìn)行聲明,會(huì)防止你無意的修改而影響到調(diào)用辦法外的變量“這句話,我個(gè)人理解這樣說是不恰當(dāng)?shù)?
PHP編程 因?yàn)闊o論參數(shù)是基本數(shù)據(jù)類型的變量還是引用類型的變量,使用final聲明都不會(huì)達(dá)到上面所說的效果.
PHP編程 看這個(gè)例子就清楚了:
PHP編程
PHP編程 上面這段代碼好像讓人覺得用final修飾之后,就不能在辦法中更改變量i的值了.殊不知,辦法changeValue和main辦法中的變量i根本就不是一個(gè)變量,因?yàn)閖ava參數(shù)傳遞采用的是值傳遞,對(duì)于基本類型的變量,相當(dāng)于直接將變量進(jìn)行了拷貝.所以即使沒有final修飾的情況下,在辦法內(nèi)部改變了變量i的值也不會(huì)影響辦法外的i.
PHP編程 再看下面這段代碼:
PHP編程
public class Test {
public static void main(String[] args) {
MyClass myClass = new MyClass();
StringBuffer buffer = new StringBuffer("hello");
myClass.changeValue(buffer);
System.out.println(buffer.toString());
}
}
class MyClass {
void changeValue(final StringBuffer buffer) {
buffer.append("world");
}
}
PHP編程 運(yùn)行這段代碼就會(huì)發(fā)現(xiàn)輸出結(jié)果為 helloworld.很顯然,用final進(jìn)行修飾并沒有阻止在changeValue中改變buffer指向的對(duì)象的內(nèi)容.
PHP編程有人說假如把final去掉了,萬一在changeValue中讓buffer指向了其他對(duì)象怎么辦.有這種想法的朋友可以自己動(dòng)手寫代碼試一下這樣的結(jié)果是什么,如果把final去掉了,然后在changeValue中讓buffer指向了其他對(duì)象,也不會(huì)影響到main辦法中的buffer,原因在于java采用的是值傳遞,對(duì)于引用變量,傳遞的是引用的值,也就是說讓實(shí)參和形參同時(shí)指向了同一個(gè)對(duì)象,因此讓形參重新指向另一個(gè)對(duì)象對(duì)實(shí)參并沒有任何影響.
PHP編程以上內(nèi)容就是Java中final關(guān)鍵字詳解,希望對(duì)大家有所贊助.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP教程:Java中final關(guān)鍵字詳解》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/8813.html