第四章~第七章
1。Compiler不會(huì)自動(dòng)在當(dāng)前目錄中查找需要的class,除非在classpath中有“.”路徑
2。當(dāng)一個(gè)class中使用了另一個(gè)class,如果在classpath路徑中沒有該class,但是有source(.java文件),將會(huì)自動(dòng)編譯
3。除非確認(rèn)必須透露底層實(shí)現(xiàn),否則應(yīng)該將所有的fields都定義為private
4。protected類型也提供package access
5。如果一個(gè)類在一個(gè)package中,比如:package com.cert,那么這個(gè)類應(yīng)該位于這樣的目錄結(jié)構(gòu)中:/classes/com/cert。而classpath環(huán)境變量中應(yīng)該有/class路徑
6。class不允許定義成private或者protected
7。當(dāng)轉(zhuǎn)化一個(gè)object到String時(shí),調(diào)用的是toString()方法,可以在類中實(shí)現(xiàn)這個(gè)方法,當(dāng)需要的時(shí)候,JVM將自動(dòng)調(diào)用此方法。當(dāng)基類中有此方法時(shí),子類也會(huì)自動(dòng)繼承此方法
8。在子類的構(gòu)造函數(shù)中使用super表示基類
9。如果基類的構(gòu)造函數(shù)有參數(shù)傳入,那么子類必須在自己構(gòu)造函數(shù)的第一行顯式執(zhí)行基類構(gòu)造函數(shù):super(parameter)
10。對(duì)于被重載的函數(shù),基類中的函數(shù)在子類中仍然可見,而在C++中則會(huì)被隱藏
11。final關(guān)鍵字:對(duì)于primitives,表示value是定值,不允許改變;對(duì)于object reference,表示此reference不允許指向另一個(gè)新的object;對(duì)于method,表示此方法不能被重載;對(duì)于class,表示此類不允許被繼承
12。任何private方法都是final的
13。在一個(gè)class的instance被initial的時(shí)候(classname bjectname),具有如下創(chuàng)建順序:基類中的static變量,子類中的static變量,如果此instance被new出(objectname = new classname),那么還會(huì)按照如下順序執(zhí)行:基類中成員變量(非static,按照定義的順序),基類的constructor(從最初的基類開始),該object類的成員變量(非static,按照定義的順序),該object類的congstructor
14。在JAVA中,除了static和final(private隱式為final)的方法,所有都是late binding(對(duì)應(yīng)于early binding)
15。abstract類相當(dāng)于C++中的虛函數(shù),abstract類的子類必須實(shí)現(xiàn)該類中的所有abstract方法,否則也必須是abstract類
16。abstract類不允許創(chuàng)建自己的實(shí)例
17。在一個(gè)類的constructor中最好只調(diào)用本壘的final和private方法,因?yàn)榇祟惙椒ú粫?huì)被重載
18。如果只有重載(method overloading),而沒有l(wèi)ate binding,則不能被稱為是多態(tài)(polymorphism),也就不能說是面向?qū)ο蟮模╫bject-oriented)
19.Interface只是提供一個(gè)框架,沒有任何實(shí)現(xiàn)。Interface中可以定義fields,但是他們隱式為static和final的 36.如果不需要inner class object和outer class object聯(lián)系,那么可以將inner class定義為static,這通常被稱為nested class。在此種狀況下,inner class不擁有outer class object的reference(如35中所述)
20.可以把interface中的方法定義為public,但即使沒有加public關(guān)鍵字,interface中的所有方法也是public的,所以在implements一個(gè)interface時(shí),class中的這些方法也必須定義為public,否則編譯報(bào)錯(cuò)。
21.Interface中方法前面可以加abstract關(guān)鍵字,但是跟不加的效果一樣。
22.Interface不僅僅是一個(gè)更純粹的abstract類,更有價(jià)值的是可以用interface實(shí)現(xiàn)多重繼承。
23.只能繼承一個(gè)non-interface,但是可以實(shí)現(xiàn)任意多的interface。也就是說只能extends一個(gè)class,但是可以implements任意多的interface。
24.在設(shè)計(jì)一個(gè)基類的時(shí)候,如果可以不用實(shí)現(xiàn)任何方法以及不用定義成員變量,則應(yīng)該首選interface,其次是abstract class,再其次是concrete class。
25.重載的函數(shù)不能以返回值類型不同來區(qū)分。
26.Interface可以extends其他的interface,可以extends多個(gè)。
27.因?yàn)閕nterface中的所有fields都是static和final的,所以可以利用interface方便地實(shí)現(xiàn)諸如C++中的enum功能。
28.在http://jakata.apache.org/commons 中有很多有用的class(但是很多好像已經(jīng)在j2dk1.4中實(shí)現(xiàn)了,比如String類的功能)
29.Interface中的fields可以說不是interface的一部分,只是作為interface的輔助存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)域
30.Inner class可以定義為private或者protected,而普通的class只可以定義為public或者package access。
31.包含在某個(gè)scope中的inner class,也是和其他的class一樣同時(shí)被貶意,只是在scope之外,該class是不可用的。
32.匿名class需要以分號(hào)(;)結(jié)尾,如:return new classname{code};
33.如果要在匿名inner class中使用外部傳入的參數(shù),那么此參數(shù)必須為final。
34.在匿名class中不可以有命名的constructor,但是確實(shí)可以使用constructor,只需要將代碼放置在{}中。如:
return new Base(){
{System.out.println(“Inside instance initializer”);}
}
當(dāng)然也有限制,因?yàn)椴荒苤剌d,所以只能有一個(gè)constructor。
35.Inner class對(duì)enclosing class中的所有的elements都有access權(quán)限。這是因?yàn)閕nner class擁有一個(gè)隱式的enclosing class object的reference。同時(shí)這也解釋了為什么inner class object只能由enclosing class object來創(chuàng)建(通過enclosing class提供的一個(gè)方法)。
37.普通的inner class不允許有static成員,但是nested class可以。
38.nested class object不可以存取outer class中的non-static成員
39.一般地說,在interface中不能有任何代碼,但是一個(gè)nested class可以放在interface中
40.當(dāng)編譯時(shí),對(duì)于inner class會(huì)生成:outerclass$innerclass.class文件,對(duì)于匿名inner class,會(huì)在$后面加上數(shù)字表示。
41.可以將測(cè)試代碼放在一個(gè)nested class中,假設(shè)outer class名為A,nested class名為tester,則運(yùn)行:java A$tester即可進(jìn)行測(cè)試。當(dāng)發(fā)布產(chǎn)品時(shí),只需要簡(jiǎn)單地將A$tester.class文件刪除即可。
42.在inner class中要使用outer class object,可以用outerclassname.this來表示
43.除了在outer class中提供一個(gè)方法來return new innerclass,還可以直接在外部使用new方法。如:
outerclass o = new outerclass;
outerclass.innerclass inner = o.new innerclass();
44.如果要繼承inner class,則在該繼承類的constructor中必須顯式引入enclosing class object的reference.如:InheritInner(enclosing wi){wi.super();}
如果要繼承inner class的類本身是繼承了enclosing class類的inner class,那么就不用顯式引入reference。
45.當(dāng)enclosing class的繼承類對(duì)inner class重載的時(shí)候,不會(huì)發(fā)生像對(duì)method重載時(shí)那樣的auto upcasting,所以對(duì)inner class重載是沒有意義的。
46.只有當(dāng)想生成多個(gè)object時(shí),才需要使用local inner class來代替anonymous inner class(指包含在方法中的inner class)
47.無論outer class是不是一個(gè)繼承類,對(duì)于inner class都沒有限制。這也是使用inner class的最主要理由。也就是說interface解決了多重繼承的一部分問題,而inner class豐富了另外一部分(inner class的出現(xiàn),實(shí)現(xiàn)了在效果上等同于繼承于多個(gè)non-interface的用法)
聯(lián)系客服