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方法不可以被子類覆寫
- final類不能被繼承,它們通常是完整的類融击。java中有許多類是final的屑咳,如String须板,Integer以及其他包裝類。
2.java中的static關(guān)鍵字:http://www.cnblogs.com/dolphin0520/p/3799052.html
static方法就是沒有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法化焕,反過來是可以的政溃。而且可以在沒有創(chuàng)建任何對(duì)象的前提下瘤袖,僅僅通過類本身來調(diào)用static方法测柠。這實(shí)際上正是static方法的主要用途
簡(jiǎn)而言之:方便在沒有創(chuàng)建對(duì)象的情況下來進(jìn)行調(diào)用(方法/變量)。
很顯然工育,被static關(guān)鍵字修飾的方法或者變量不需要依賴于對(duì)象來進(jìn)行訪問虾宇,只要類被加載了,就可以通過類名去進(jìn)行訪問如绸。
- static方法
static方法一般稱作靜態(tài)方法嘱朽,由于靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問旭贬,因此對(duì)于靜態(tài)方法來說,是沒有this的搪泳,因?yàn)樗灰栏接谌魏螌?duì)象稀轨,既然都沒有對(duì)象,就談不上this了岸军。并且由于這個(gè)特性奋刽,在靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都是必須依賴具體的對(duì)象才能夠被調(diào)用艰赞。
雖然在靜態(tài)方法中不能訪問非靜態(tài)成員方法和非靜態(tài)成員變量佣谐,但是在非靜態(tài)成員方法中是可以訪問靜態(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塊的順序來執(zhí)行每個(gè)static塊沛厨,并且只會(huì)執(zhí)行一次宙地。
很多時(shí)候會(huì)將一些只需要進(jìn)行一次的初始化操作都放在static代碼塊中進(jìn)行。
在C/C++中static是可以作用于局部變量的逆皮,但是在Java中切記:static是不允許用來修飾局部變量。不要問為什么参袱,這是Java語法的規(guī)定电谣。
3.toArray()中參數(shù)的作用
String[] result = set.toArray(new String[0]);
- 使用無參數(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);
還是一開始就弄成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無法區(qū)分傳入的參數(shù)屬于前一個(gè)可變參數(shù)還是后邊的參數(shù)钱反,所以只能讓可變參數(shù)位于最后一項(xiàng)。
可變參數(shù)的特點(diǎn):
- 只能出現(xiàn)在參數(shù)列表的最后殿遂;
- ...位于變量類型和變量名之間诈铛,前后有無空格都可以;
- 調(diào)用可變參數(shù)的方法時(shí)墨礁,編譯器為該可變參數(shù)隱含創(chuàng)建一個(gè)數(shù)組幢竹,在方法體中以數(shù)組的形式訪問可變參數(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è)固定大小的列表恩静,故無法對(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)開銷可能會(huì)非常昂貴疙咸。如果要修改字符串而不創(chuàng)建新的對(duì)象,則可以使用System.Text.StringBuilder類风科。例如撒轮,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用 StringBuilder類可以提升性能贼穆。
7.transient 詳見http://www.importnew.com/21517.html
一旦變量被transient修飾题山,變量將不再是對(duì)象持久化的一部分,該變量?jī)?nèi)容在序列化后無法獲得訪問故痊。
transient關(guān)鍵字只能修飾變量顶瞳,而不能修飾方法和類。注意,本地變量是不能被transient關(guān)鍵字修飾的慨菱。變量如果是用戶自定義類變量焰络,則該類需要實(shí)現(xiàn)Serializable接口。
被transient關(guān)鍵字修飾的變量不再能被序列化抡柿,一個(gè)靜態(tài)變量不管是否被transient修飾舔琅,均不能被序列化。
8. Scanner用法
當(dāng)通過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