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