1.super:super和this不是類(lèi)似的禁熏,this是對(duì)象的引用,super不是一個(gè)對(duì)象的引用邑彪,不能將super賦值給一個(gè)對(duì)象變量瞧毙,它只是一個(gè)指示編譯器調(diào)用父類(lèi)方法的關(guān)鍵字〖闹ⅲ可以通過(guò)super(...)的形式在子類(lèi)構(gòu)造器的第一行來(lái)調(diào)用父類(lèi)構(gòu)造器升筏;如果子類(lèi)構(gòu)造器沒(méi)有顯式的調(diào)用super(...),那將自動(dòng)調(diào)用父類(lèi)的默認(rèn)構(gòu)造器(super()無(wú)參數(shù))瘸爽,如果父類(lèi)沒(méi)有無(wú)參數(shù)的構(gòu)造器您访,將會(huì)報(bào)錯(cuò)
public class A {
? ? private double salary;
? ? ...
? ? public double getSalary(){return salary;}
}
public class B extends A {
? ? private double bonus;
? ? ...
? ? @override
? ? public double getSalary(){return super.getSalary()+bonus;}//這里也只能這么寫(xiě)了,因?yàn)椴荒茉L問(wèn)父類(lèi)的私有數(shù)據(jù)salary剪决,也不能直接調(diào)用父類(lèi)的getSalary灵汪,因?yàn)樽宇?lèi)有同名的
}
2.一個(gè)對(duì)象引用可以指向多種實(shí)際類(lèi)型的對(duì)象的現(xiàn)象被稱(chēng)作多態(tài)檀训,在運(yùn)行時(shí)能夠自動(dòng)地選擇調(diào)用哪個(gè)方法的現(xiàn)象被稱(chēng)為動(dòng)態(tài)綁定
3.方法簽名:方法名和參數(shù)(類(lèi)型,數(shù)量享言,順序)峻凫,返回值不是因素
4.對(duì)象變量是多態(tài)的,一個(gè)父類(lèi)的對(duì)象變量既可以引用一個(gè)父類(lèi)對(duì)象览露,也可以引用一個(gè)子類(lèi)對(duì)象
A{fx,fy},B extends A{fy,fz}
A a = new B();
a.fy();//B中的fy荧琼,運(yùn)行看右邊(B)
a.fz();//error,編譯看左邊(A)差牛,
對(duì)于Parent p = new Child();這樣的多態(tài)形式命锄,p.成員變量,p.靜態(tài)的偏化,編譯運(yùn)行都是參考左邊脐恩,即Parent;而p.成員函數(shù)的形式侦讨,編譯參考左邊(Parent)驶冒,運(yùn)行則參考右邊(Child)。參考這個(gè)
5.子類(lèi)在重寫(xiě)父類(lèi)的方法時(shí)韵卤,子類(lèi)的方法的可見(jiàn)性不能低于父類(lèi)方法的可見(jiàn)性骗污,子類(lèi)方法的返回值類(lèi)型可以是父類(lèi)方法返回值類(lèi)型的子類(lèi)
6.final類(lèi)(類(lèi)中的所有方法自動(dòng)成為final,但數(shù)據(jù)域不會(huì)自動(dòng)成final)沈条,類(lèi)的某個(gè)方法聲明為final需忿,則其子類(lèi)不能覆蓋這個(gè)方法
7.instanceof,子類(lèi)也返回true
8.轉(zhuǎn)換:
? ? 父類(lèi) a = new子類(lèi)();向上轉(zhuǎn)換
? ? 子類(lèi) b = (子類(lèi))a//向下轉(zhuǎn)換拍鲤,只有在需要調(diào)用子類(lèi)中特有的東西才需要轉(zhuǎn)換
9.抽象類(lèi)贴谎,關(guān)鍵字abstract
? ? 只要包含了抽象方法的類(lèi)都要聲明為抽象類(lèi)。即使不含抽象方法季稳,也可以聲明為抽象類(lèi)擅这。抽象類(lèi)不能實(shí)例化,但可以定義一個(gè)抽象類(lèi)的對(duì)象變量景鼠,引用一個(gè)非抽象子類(lèi)的對(duì)象
10.類(lèi)之間單繼承仲翎,接口和類(lèi)之間可以多實(shí)現(xiàn),接口和接口之間可以多繼承
11.private:僅對(duì)本類(lèi)可見(jiàn)
? ? ?public:對(duì)所有類(lèi)可見(jiàn)
? ? ?protected:對(duì)本包和子類(lèi)可見(jiàn)
? ? ?默認(rèn)(沒(méi)有修飾符):對(duì)本包可見(jiàn)
12.比較對(duì)象equals(注意參數(shù)為Object類(lèi)型)順序:
? ? 判斷是否==(地址比較)——判斷參數(shù)是否為null——判斷是否類(lèi)型相同getClass()/instanceof(根據(jù)具體情況選擇哪一種铛漓,詳見(jiàn)卷一p172)
溯香,最后進(jìn)行類(lèi)型轉(zhuǎn)換,根據(jù)業(yè)務(wù)邏輯判斷是否相等
instanceof和getClass的區(qū)別:就算是子類(lèi)instanceof也返回true浓恶,getClass則返回實(shí)際的類(lèi)型
13.為了防止出現(xiàn)null的情況玫坛,請(qǐng)使用Objects.equals(a,b),有一個(gè)參數(shù)為null則返回false包晰,否則調(diào)用a.equals(b)湿镀,所以參數(shù)所屬的類(lèi)的equals需要寫(xiě)好
14.在子類(lèi)中定義equals方法時(shí)炕吸,首先調(diào)用超類(lèi)的equals方法(前提是超類(lèi)重寫(xiě)了equals,不然是原始的equals)勉痴,如果超類(lèi)的域都相等赫模,則進(jìn)一步比較子類(lèi)中的域
15.equals的幾個(gè)要求
? ? 自反性:對(duì)于非空x,x.equals(x)應(yīng)該返回true
? ? 對(duì)稱(chēng)性:對(duì)于任何x蒸矛,y瀑罗,x.equals(y)返回true,則y.equals(x)也應(yīng)該返回true
? ? 傳遞性:x雏掠,y斩祭,z
? ? 一致性:如果x,y磁玉,引用的對(duì)象沒(méi)有發(fā)生變化停忿,則反復(fù)調(diào)用x.equals(y)應(yīng)該返回相同的結(jié)果
? ? 對(duì)于任意非空x驾讲,x.equals(null)返回false
16.注意在覆蓋父類(lèi)方法時(shí)蚊伞,使用@Override標(biāo)記可以避免一些錯(cuò)誤,因?yàn)橐3謪?shù)類(lèi)型相同吮铭,比如很容易一不小心就寫(xiě)成public boolean equals(A a)时迫,這不是在覆蓋Object的equals方法,而是在寫(xiě)另外一個(gè)不相關(guān)的方法谓晌,因?yàn)镺bject的equals方法的參數(shù)類(lèi)型是Object掠拳,使用@Override標(biāo)記就可以避免這種錯(cuò)誤
17.編寫(xiě)一個(gè)類(lèi)最需要注意的幾個(gè)地方:equals方法,hashCode方法纸肉,toString方法溺欧,構(gòu)造函數(shù),訪問(wèn)器/修改器柏肪,如果重寫(xiě)了equals姐刁,就必須重寫(xiě)hashCode,如果x.equals(y)返回true烦味,則x.hashCode()必須和y.hashCode()的值一樣
18.hashCode(返回一個(gè)整數(shù)值聂使,可正可負(fù))方法定義在Object類(lèi)中,返回值為對(duì)象的存儲(chǔ)地址
19.String類(lèi)重寫(xiě)了hashCode方法谬俄,是根據(jù)字符串內(nèi)容導(dǎo)出的柏靶,StringBuilder和StringBuffer沒(méi)重寫(xiě)hashCode,繼承的是Object中的hashCode
? ? int hash = 0;
? ? for(int i = 0;i<length();i++) {
? ? ? ? hash = 31*hash + charAt(i);
????}
20.一些API
? ? Objects.equals(a,b);//null安全比較溃论,a屎蜓,b有一個(gè)為null則返回false,否則返回a.equals(b)
? ? Objects.hashCode(a);//null安全求哈希碼钥勋,a為null炬转,則返回0控汉,否則返回a.hashCode()
? ? Objects.hash(a,b,c...);//返回一個(gè)組合的哈希碼
? ? Arrays.hashCode(type[] a)//返回?cái)?shù)組a的哈希碼
? ? getClass().getName()//動(dòng)態(tài)獲取類(lèi)名
21.toString方法,定義在Object類(lèi)中返吻,默認(rèn)打印對(duì)象所屬類(lèi)的類(lèi)名和對(duì)象哈希碼(@符號(hào)連接)姑子,所以一般需要重寫(xiě),數(shù)組沒(méi)有重寫(xiě)toString方法测僵,如果打印一個(gè)整形數(shù)組街佑,會(huì)得到形如[I@2a46e30這樣的結(jié)果,[I表示這是個(gè)整形數(shù)組捍靠,所以打印數(shù)組請(qǐng)用Arrays.toString()
22.ArrayList管理著一個(gè)內(nèi)部數(shù)組沐旨,當(dāng)數(shù)組的空間用完之后,ArrayList將自動(dòng)創(chuàng)建一個(gè)更大的數(shù)組榨婆,并將所有的對(duì)象拷貝到新的數(shù)組中
23.數(shù)組大小和數(shù)組列表(ArrayList)容量的區(qū)別new int[100]表示創(chuàng)建了一個(gè)擁有100個(gè)整形的存儲(chǔ)空間(length為100)磁携,
new ArrayList<String>(100)表示擁有存儲(chǔ)100個(gè)String的潛力,實(shí)際上剛創(chuàng)建的時(shí)候良风,里面一個(gè)元素也沒(méi)有(size為0)谊迄,一旦確定了ArrayList的size不會(huì)再改變之后,調(diào)用trimToSize方法可以調(diào)整存儲(chǔ)區(qū)域的大小為實(shí)際所需要的大小烟央,gc將回收多余的存儲(chǔ)空間统诺,ArrayList并不是java程序設(shè)計(jì)語(yǔ)言的一部分,只是一個(gè)由某些人編寫(xiě)的實(shí)用類(lèi)疑俭,并且放在了標(biāo)準(zhǔn)庫(kù)中
24.ArrayList轉(zhuǎn)數(shù)組粮呢,list.toArray(a),將list中的元素拷貝到數(shù)組a中
數(shù)組轉(zhuǎn)列表:java中數(shù)組轉(zhuǎn)list使用Arrays.asList(T... a)方法钞艇。不能把基本數(shù)據(jù)類(lèi)型的數(shù)組轉(zhuǎn)化為列表
仔細(xì)觀察可以發(fā)現(xiàn)asList接受的參數(shù)是一個(gè)泛型的變長(zhǎng)參數(shù)啄寡,而基本數(shù)據(jù)類(lèi)型是無(wú)法泛型化的。asList方法返回的是數(shù)組的一個(gè)視圖哩照,視圖意味著挺物,對(duì)數(shù)組的操作都會(huì)反映在list上,而且這個(gè)list是定長(zhǎng)的葡秒,不支持add姻乓、remove等改變長(zhǎng)度的方法
ArrayList的set方法需要特別注意,一定是已經(jīng)存在的元素才可以被修改眯牧,不存在的不能用set
ArrayList<String> list = new ArrayList<>(10);
list.set(0,"hello");//error蹋岩,list目前還沒(méi)有元素。
25.對(duì)象包裝器(wrapper)
? ? Integer学少,Long剪个,Double,F(xiàn)loat版确,Short扣囊,Byte(前6個(gè)繼承了Number)乎折,Character,Boolean侵歇,它們都是final修飾的類(lèi)骂澄,不能被繼承,而且都是不可變的類(lèi)惕虑,一旦構(gòu)造了包裝器坟冲,就不允許改變包裝在里面的值(注意final類(lèi)和不可變類(lèi)意思不一樣),基本類(lèi)型和包裝類(lèi)對(duì)象之間的轉(zhuǎn)換
Integer a = Integer.valueOf(3);
int b = a.intValue();
int? c = Integer.parseInt("34");
Integer a = 100;
Integer b = 100;
Integer c = new Integer(100);
Integer d = new Integer(100);
System.out.println(a==b);//true溃蔫,在[-128,127]之間為共享健提,超出這個(gè)區(qū)間不共享
System.out.println(c==d);//false,new出來(lái)的是新的對(duì)象伟叛,肯定地址不一樣
26.枚舉類(lèi)型
在比較兩個(gè)枚舉類(lèi)型的值是否相等時(shí)私痹,直接使用==(卷一p191)
27.Class類(lèi)
每個(gè)Class類(lèi)的對(duì)象表示一種類(lèi)型,這個(gè)類(lèi)型可以是類(lèi)统刮,也可以是基本數(shù)據(jù)類(lèi)型(如可以int.class)
獲取Class類(lèi)的對(duì)象的三種方式:
A? a = new A();? ? Class c1 = a.getClass();
Class c2 = Class.forName("packageName.A")
Class c3 = A.class;
注意int.class和Integer.class是不一樣的
Class類(lèi)有個(gè)newInstance方法Object newInstance()紊遵,返回類(lèi)型是Object
A.class.newInstance()將調(diào)用A的無(wú)參數(shù)構(gòu)造函數(shù)來(lái)構(gòu)造一個(gè)A的對(duì)象,如果A沒(méi)有無(wú)參數(shù)的構(gòu)造函數(shù)就會(huì)拋出異常网沾,請(qǐng)用Class的另外一個(gè)帶參數(shù)的函數(shù)
28.一些接口:
Throwable
Comparable
Cloneable(標(biāo)記接口癞蚕,沒(méi)有方法蕊爵,只是起到標(biāo)記作用)
29.反射
? ? java.lang.Class
? ? java.lang.reflect.Filed:getName辉哥,getModifiers,getType攒射,get醋旦,set
? ? java.lang.reflect.Method:getName,getModifiers会放,getReturnType饲齐,getParameterType,invoke
? ? java.lang.reflect.Constructor:getName咧最,getModifiers捂人,getParameterType
? ? java.lang.reflect.Modifier:toString,isXXX
30.接口
接口中的所有方法自動(dòng)屬于public abstract矢沿,因此聲明方法時(shí)不必提供關(guān)鍵字pubic滥搭,
接口中可以定義常量,而且都自動(dòng)屬于public static final
接口不能實(shí)例化對(duì)象捣鲸,可以聲明接口變量瑟匆,不能在接口中實(shí)現(xiàn)方法,實(shí)現(xiàn)類(lèi)要實(shí)現(xiàn)接口的所有方法栽惶,而且要聲明為public
31.Arrays的sort方法可以對(duì)對(duì)象數(shù)組進(jìn)行排序愁溜,但前提是這個(gè)對(duì)象所屬的類(lèi)實(shí)現(xiàn)了Comparable接口
32.一些API
? ? Double.compare(a,b)//比較a疾嗅,b,a>b返回正數(shù)...
? ? 相減技巧并不適用于浮點(diǎn)型冕象,當(dāng)浮點(diǎn)型a代承,b很接近時(shí),a-b的結(jié)果經(jīng)過(guò)四舍五入后可能為0渐扮,所以這時(shí)候Double.compare就很有用了次泽,另外就算是整數(shù)相減,也需要考慮到溢出的情況
數(shù)組有個(gè)克隆的方法
32.對(duì)象克孪(淺拷貝和深拷貝)
如果要拷貝的數(shù)據(jù)域是基本類(lèi)型的那沒(méi)問(wèn)題意荤,如果不是基本類(lèi)型,那就有問(wèn)題(不可變類(lèi)除外)
實(shí)現(xiàn)Cloneable接口只锻,將clone方法聲明為public(在Object中是聲明為protected)玖像,調(diào)用默認(rèn)的clone方法,對(duì)需要調(diào)整的地方進(jìn)行調(diào)整(卷一p223-225)
33.一些類(lèi)和接口
定時(shí)器類(lèi)Timer齐饮,ActionListener接口(actionPerformed(ActionEvent enent))
34.一些特殊的東西
java編譯后的文件名字帶有$接數(shù)字的就是匿名內(nèi)部類(lèi)的編譯結(jié)果捐寥,接名字的就是內(nèi)部類(lèi)的編譯結(jié)果
例如:TestFrame$1.class是匿名內(nèi)部類(lèi)的編譯結(jié)果,TestFrame$MyJob.class則是內(nèi)部類(lèi)MyJob編譯后得到的.
35.內(nèi)部類(lèi):內(nèi)部類(lèi)可以訪問(wèn)外部類(lèi)的數(shù)據(jù)域祖驱,因?yàn)閮?nèi)部類(lèi)包含了一個(gè)對(duì)外部類(lèi)的引用“外部類(lèi).this”握恳;外部類(lèi)定義了一個(gè)內(nèi)部類(lèi),并不意味著每個(gè)外部類(lèi)對(duì)象都有一個(gè)內(nèi)部類(lèi)對(duì)象
根據(jù)位置不同分為下面幾種情況(內(nèi)部類(lèi)包含了一個(gè)對(duì)外部類(lèi)的引用“外部類(lèi).this”):
1. (普通)成員內(nèi)部類(lèi)捺僻。類(lèi)似于外部類(lèi)的數(shù)據(jù)域/方法的位置乡洼,可以訪問(wèn)外部類(lèi)的所有數(shù)據(jù)域和方法,可以用public匕坯,private修飾束昵;如果是public修飾,在外面可以這樣使用公有內(nèi)部類(lèi)葛峻,假設(shè)A內(nèi)定義了一個(gè)B類(lèi)锹雏,A a = new A(); A.B b = a.new B();
2. 靜態(tài)(成員)內(nèi)部類(lèi)。跟成員內(nèi)部類(lèi)不同的是术奖,有static修飾符礁遵,只能訪問(wèn)外部類(lèi)的靜態(tài)數(shù)據(jù)域和靜態(tài)方法
3.?局部?jī)?nèi)部類(lèi)。定義在外部類(lèi)的方法內(nèi)采记,不可以public佣耐,private修飾,而且只有在該方法內(nèi)可見(jiàn)挺庞,對(duì)外部隱藏起來(lái)晰赞,就算是外部類(lèi)的其他方法也不可見(jiàn)。局部?jī)?nèi)部類(lèi)可以訪問(wèn)外部類(lèi)的所有數(shù)據(jù)域和方法,但是只能訪問(wèn)所在方法中final修飾的局部變量掖鱼,不能訪問(wèn)所在方法中的非final局部變量
4. 匿名內(nèi)部類(lèi)然走。可以理解為臨時(shí)類(lèi),因?yàn)橹皇切枰@樣的類(lèi)創(chuàng)建一次對(duì)象戏挡,所以沒(méi)必要單獨(dú)寫(xiě)一個(gè)類(lèi)芍瑞,目的是即建即用,用完即走褐墅,編譯會(huì)生成`外部類(lèi)$數(shù)字`形式的類(lèi)文件拆檬,new SuperClass(parameters) {....}或者new Interface(){...},接口的時(shí)候沒(méi)有參數(shù)
36.代理
? ? 代理解釋
37.當(dāng)瀏覽器是http時(shí)妥凳,省略的端口號(hào)是80竟贯,https時(shí),省略的端口號(hào)是443