国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Practical Java

2019-11-14 22:46:58
字體:
來源:轉載
供稿:網友
PRactical java聲明:原創作品,轉載時請注明文章來自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之前,內存中應該是這樣的:

image002

如果你并不想modifyPoint()改變傳進的Point對象,你可以傳遞一個克隆對象(見64、66)或者將Point設計成不可變的(見65)。

實踐2、 對不變的data和object references使用final

classFinalTest {

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:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普安县| 阳江市| 东方市| 晋城| 治多县| 建平县| 固原市| 垦利县| 东安县| 内乡县| 都昌县| 高安市| 灵武市| 荃湾区| 肃宁县| 闽清县| 天等县| 大田县| 石阡县| 陇川县| 淮阳县| 建宁县| 广汉市| 福鼎市| 云阳县| 南丹县| 偃师市| 梅河口市| 呼和浩特市| 江源县| 麻城市| 陵水| 申扎县| 剑川县| 于田县| 静安区| 大理市| 太谷县| 宜宾县| 甘肃省| 呈贡县|