1.java中的final關(guān)鍵字:http://www.importnew.com/7553.html
final關(guān)鍵字的含義?
final在Java中是一個(gè)保留的關(guān)鍵字,可以聲明成員變量、方法、類以及本地變量。一旦你將引用聲明作final,你將不能改變這個(gè)引用了,編譯器會(huì)檢查代碼,如果你試圖將變量再次初始化的話,編譯器會(huì)報(bào)編譯錯(cuò)誤。
- final變量經(jīng)常和static關(guān)鍵字一起使用,作為常量。final變量是只讀的
- final成員變量必須在聲明時(shí)初始化或者在構(gòu)造器中初始化,否則會(huì)報(bào)編譯錯(cuò)誤。
- final本地變量(在方法中的或者代碼塊中的變量稱為本地變量)必須在聲明時(shí)賦值。
- 不能夠?qū)inal變量再次賦值。
- final方法不可以被子類覆寫(xiě)
- final類不能被繼承,它們通常是完整的類。java中有許多類是final的,如String,Integer以及其他包裝類。
2.java中的static關(guān)鍵字:http://www.cnblogs.com/dolphin0520/p/3799052.html
static方法就是沒(méi)有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過(guò)來(lái)是可以的。而且可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類本身來(lái)調(diào)用static方法。這實(shí)際上正是static方法的主要用途
簡(jiǎn)而言之:方便在沒(méi)有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用(方法/變量)。
很顯然,被static關(guān)鍵字修飾的方法或者變量不需要依賴于對(duì)象來(lái)進(jìn)行訪問(wèn),只要類被加載了,就可以通過(guò)類名去進(jìn)行訪問(wèn)。
- static方法
static方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問(wèn),因此對(duì)于靜態(tài)方法來(lái)說(shuō),是沒(méi)有this的,因?yàn)樗灰栏接谌魏螌?duì)象,既然都沒(méi)有對(duì)象,就談不上this了。并且由于這個(gè)特性,在靜態(tài)方法中不能訪問(wèn)類的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都是必須依賴具體的對(duì)象才能夠被調(diào)用。
雖然在靜態(tài)方法中不能訪問(wèn)非靜態(tài)成員方法和非靜態(tài)成員變量,但是在非靜態(tài)成員方法中是可以訪問(wèn)靜態(tài)成員方法/變量的。 - static變量
static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本,它當(dāng)且僅當(dāng)在類初次加載時(shí)會(huì)被初始化。而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化,存在多個(gè)副本,各個(gè)對(duì)象擁有的副本互不影響。
static成員變量的初始化順序按照定義的順序進(jìn)行初始化。 - static代碼塊
static塊可以置于類中的任何地方,類中可以有多個(gè)static塊。在類初次被加載的時(shí)候,會(huì)按照static塊的順序來(lái)執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次。
很多時(shí)候會(huì)將一些只需要進(jìn)行一次的初始化操作都放在static代碼塊中進(jìn)行。
在C/C++中static是可以作用于局部變量的,但是在Java中切記:static是不允許用來(lái)修飾局部變量。不要問(wèn)為什么,這是Java語(yǔ)法的規(guī)定。
3.toArray()中參數(shù)的作用
String[] result = set.toArray(new String[0]);
- 使用無(wú)參數(shù)的toArray()有一個(gè)缺點(diǎn),就是轉(zhuǎn)換后的數(shù)組類型是Object[]。 雖然Object數(shù)組也不是不能用,但當(dāng)你真的想用一個(gè)具體類型的數(shù)組時(shí)轉(zhuǎn)化就非常麻煩。
需要用到這個(gè)String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
還是一開(kāi)始就弄成String[]比較好。所以需要使用帶參數(shù)的toArray. -
String[] a = collection.toArray(new String[0]);
如果指定的數(shù)組能容納該 collection,則返回包含此 collection 元素的數(shù)組。否則,將根據(jù)指定數(shù)組的運(yùn)行時(shí)類型和此 collection 的大小分配一個(gè)新數(shù)組。這里給的參數(shù)的數(shù)組長(zhǎng)度是0,因此就會(huì)返回包含此 collection 中所有元素的數(shù)組,并且返回?cái)?shù)組的類型與指定數(shù)組的運(yùn)行時(shí)類型相同。
4. java可變參數(shù)
Java1.5增加了新特性:可變參數(shù):適用于參數(shù)個(gè)數(shù)不確定,類型確定的情況,java把可變參數(shù)當(dāng)做數(shù)組處理。
注意:可變參數(shù)必須位于最后一項(xiàng)。當(dāng)可變參數(shù)個(gè)數(shù)多余一個(gè)時(shí),必將有一個(gè)不是最后一項(xiàng),所以也只支持有一個(gè)可變參數(shù)。
因?yàn)閰?shù)個(gè)數(shù)不定,所以當(dāng)其后邊還有相同類型參數(shù)時(shí),java無(wú)法區(qū)分傳入的參數(shù)屬于前一個(gè)可變參數(shù)還是后邊的參數(shù),所以只能讓可變參數(shù)位于最后一項(xiàng)。
可變參數(shù)的特點(diǎn):
- 只能出現(xiàn)在參數(shù)列表的最后;
- ...位于變量類型和變量名之間,前后有無(wú)空格都可以;
- 調(diào)用可變參數(shù)的方法時(shí),編譯器為該可變參數(shù)隱含創(chuàng)建一個(gè)數(shù)組,在方法體中以數(shù)組的形式訪問(wèn)可變參數(shù)。
示例代碼:
public class Varable {
public static void main(String [] args){
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
public static int add(int x, int... args){
int sum=x;
for(int i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}
}
5.Arrays.asList()
public class NodeNetwork {
private List<Node> nodes;
public NodeNetwork(Node... nodes) {
this.setNodes(Arrays.asList(nodes));
}
public void setNodes(List<Node> nodes) {
this.nodes = nodes;
}
}
Node[] nodes = new Node[3];
nodes[0] = node1;
nodes[1] = node2;
nodes[2] = node3;
nnw=new NodeNetwork(nodes);
nnw.addNode(node2);
此時(shí)會(huì)報(bào)錯(cuò):UnsupportedOperationException
原因:
Returns a fixed-size list backed by the specified array.
it is documented not to support any structural modification (i.e. removing or adding elements)
因?yàn)锳rrays.asList()返回的是一個(gè)固定大小的列表,故無(wú)法對(duì)其進(jìn)行add操作。
6.StringBuilder()
String對(duì)象是不可改變的。每次使用 System.String類中的方法之一時(shí),都要在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這就需要為該新對(duì)象分配新的空間。在需要對(duì)字符串執(zhí)行重復(fù)修改的情況下,創(chuàng)建新的 String對(duì)象相關(guān)的系統(tǒng)開(kāi)銷可能會(huì)非常昂貴。如果要修改字符串而不創(chuàng)建新的對(duì)象,則可以使用System.Text.StringBuilder類。例如,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用 StringBuilder類可以提升性能。
7.transient 詳見(jiàn)http://www.importnew.com/21517.html
一旦變量被transient修飾,變量將不再是對(duì)象持久化的一部分,該變量?jī)?nèi)容在序列化后無(wú)法獲得訪問(wèn)。
transient關(guān)鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關(guān)鍵字修飾的。變量如果是用戶自定義類變量,則該類需要實(shí)現(xiàn)Serializable接口。
被transient關(guān)鍵字修飾的變量不再能被序列化,一個(gè)靜態(tài)變量不管是否被transient修飾,均不能被序列化。
8. Scanner用法
當(dāng)通過(guò)new Scanner(System.in)創(chuàng)建一個(gè)Scanner,控制臺(tái)會(huì)一直等待輸入,直到敲回車鍵結(jié)束,把所輸入的內(nèi)容傳給Scanner,作為掃描對(duì)象。如果要獲取輸入的內(nèi)容,則只需要調(diào)用Scanner的nextLine()方法即可。
public class TestScanner {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("請(qǐng)輸入字符串:");
while (true) {
String line = s.nextLine();
if (line.equals("exit")) break;
System.out.println(">>>" + line);
}
}
}
請(qǐng)輸入字符串:
234
>>>234
wer
>>>wer
bye
>>>bye
exit
Process finished with exit code 0