聲明:原創作品,轉載時請注明文章來自SAP師太技術博客( 博/客/園www.cnblogs.com):m.survivalescaperooms.com/jiangzhengjun,并以超鏈接形式標明文章原始出處,否則將追究法律責任!原文鏈接:http://m.survivalescaperooms.com/jiangzhengjun/p/4259259.html 實踐1、 參數是以by value方式而非by reference方式傳遞一個普通存在的誤解是:java中的參數是以by value方式傳遞。其實不是這樣的,參數是以by value方式傳遞的。請看示例:
class PassByValue {
public static void modifyPoint(Point pt, int j) {
pt.setLocation(5,5); //1
j = 15;
System.out.println("During modifyPoint " + "pt = " + pt +
" and j = " + j);
}
public static void main(String args[]) {
Point p = new Point(0,0); //2
int i = 10;
System.out.println("Before modifyPoint " + "p = " + p +
" and i = " + i);
modifyPoint(p, i); //3
System.out.println("After modifyPoint " + "p = " + p +
" and i = " + i);
}
}
這顯示,modifyPoint()改變了//2所建立的Point對象,卻沒有改變int i。在main()之中,i被賦值為10。由于參數通過by value方式傳遞,所以modifyPoint()收到i的一個副本,然后它將這個副本必為15并返回。main()內的原值i并沒有受到影響。
對于Point對象,其實modifyPoint()是與“Point對象的reference p的復件”打交道,而不是與“Point對象的復件”打交道。記住,p是個object reference,并且Java以by value方式傳遞參數,或者更準確點說,Java以by value方式傳遞object reference。當p從main()被傳入modifyPoint()時,傳遞的是p(也就是一個reference)的復件。所以modifyPoint()是在與同一個對象打交道,只不過通過別名pt罷了。在進入modifyPoint()之后和執行//1之前,內存中應該是這樣的:

如果你并不想modifyPoint()改變傳進的Point對象,你可以傳遞一個克隆對象(見64、66)或者將Point設計成不可變的(見65)。
實踐2、 對不變的data和object references使用finalclassFinalTest {
staticfinalintsomeInt= 10;
staticfinalStringBufferobjRef=newStringBuffer("sring");
staticvoidprt() {
System.out.println("someInt="+someInt+" - objRef="+objRef);
}
publicstaticvoidmain(String[] args) {
prt();
//不能重新分配FinalTest.someInt
//!!someInt = 20;//1
objRef.append(" other");//2
//不能重新分配FinalTest.objRef
//!!objRef = new StringBuffer(); //3
prt();
}
}
輸出:
someInt=10 - objRef=sring
someInt=10 - objRef=sring other
程序里的//1處理我們應該很清楚了,但//2處又是為什么呢?我們不是已經聲明objRef聲明成final,為什么還能改變?不,我們確實沒有改變objRef的值,我們改變的是objRef所指對象的值,objRef并無變化,仍然指向同一個對象。變量objRef是一個object reference,它指向對象所在的heap位置。而//3處正是我們想的那樣,編譯出錯了,因為你試圖改objRef的值,換而言之,它企圖令objRe指向其他物體。然而objRef所指對象并不受關鍵詞final的影響,因此所指向的對象本身是可變的。
關鍵詞final只能防止變量值的改變。如果被聲明為final的變量是個object reference,那么該reference不能被改變,必須永遠指向同一個對象,然而被指向的那個對象是可以隨意改變的。
實踐3、 缺省情況下所有non-private、non-static函數都可以被覆寫缺省情況下,類中任何non-private、non-static函數都允許被子類覆寫。類的設計者如果希望阻止子類覆寫(修改)某個函數,則必須采取明確的動作,也就是將該函數聲明為final。
關鍵字final在Java中有多重用途,即可被用于變量(不能修改),也可用于類(不能繼承)與方法(不能覆寫)。
聲明某個類為final,也就暗暗聲明了這個類的所有函數都為final。這種做法可以阻止它派生類,從而禁止任何人覆寫此類的所有函數。如果這種設計對你而言過于嚴苛,也可以考慮只將某些方法聲明成final,這種方式允許你派生出類,但不允許你覆寫你聲明成final的方法。另外,final比non-final方法的性能要高。
實踐4、 在arrays和ArrayList之間慎重選擇在新建一個數組時,每個元素都將依據其自己類型而被賦予缺省值:boolean-false,char- '/u0000',byte、short、int、long-0,float、double-0.0,object reference-null。
數組的容量是固定的,一旦指定了就不可更改,但ArrayList的容量是可變的,它會隨著元素的增加自動的增長。數組即可存放基本類型也可存儲引用類型,而ArrayList只能存放引用類型元素(雖然1.5可以,但這是借助于自動裝箱特性實現的)。
數組比ArrayList擁有更高的性能。
實踐5、 多態(polymorphism)優于instanceof//員工
interfaceEmployee {
publicintsalary();//工資計算
}
//經理
classManagerimplementsEmployee {
privatestaticfinalintmgrSal= 40000;//工資
publicintsalary() {
returnmgrSal;
}
}
//程序員
classProgrammerimplementsEmployee {
privatestaticfinalintprgSal= 50000;
privatestaticfinalintprgBonus= 10000;//獎金
publicintsalary() {
returnprgSal;
}
publicintbonus() {
returnprgBonus;
}
}
//薪水冊
classPayroll {
publicintcalcPayroll(Employee emp) {
intmoney = emp.salary();
if(empinstanceofProgrammer)
//如果是程序員,則計算獎金
money += ((Programmer) emp).bonus();
returnmoney;
}
publicstaticvoidmain(String args[]) {
Payroll pr =newPayroll();
Programmer prg =newProgrammer();
Manager mgr =newManager();
System.out.println("程序員的薪水"+ pr.calcPayroll(prg));
System.out.println("經理的薪水"+ pr.calcPayroll(mgr));
Word-spacing: 0px; text-transform: none; word-break: normal; margin:
新聞熱點
疑難解答