
一.繼承
A:子類只能繼承父類所有非私有的成員(成員方法和成員變量)
B:子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構造方法。
二.繼承中構造方法的關系
A:子類中所有的構造方法默認都會訪問父類中空參數的構造方法
B:為什么呢?
因為子類會繼承父類中的數據,可能還會使用父類的數據。
所以,子類初始化之前,一定要先完成父類數據的初始化。
注意:子類每一個構造方法的第一條語句默認都是:super();
三.重載和重寫
方法重寫:子類中出現了和父類中方法聲明一模一樣的方法。
方法重載:本類中出現的方法名一樣,參數列表不同的方法。與返回值無關。
四.代碼塊
一個類的靜態代碼塊,構造代碼塊,構造方法的執行流程:
靜態代碼塊(一次) > 構造代碼塊(構造一次走一次) > 構造方法(調用一次走一次)
五.多態
多態中的成員訪問特點:
A:成員變量
編譯看左邊,運行看左邊。
B:構造方法
創建子類對象的時候,訪問父類的構造方法,對父類的數據進行初始化。
C:成員方法
編譯看左邊,運行看右邊。
D:靜態方法
編譯看左邊,運行看左邊。
(靜態和類相關,算不上重寫,所以,訪問還是左邊的)
**成員變量僅僅是該事物的外在(父類)特征描述,而成員方法是該事物的內在(子類)功能描述**
**由于成員方法存在方法重寫,所以它運行看右邊。**
巧妙理解:
父親雇了兒子去干活,(多態方式創建對象)
要用的工具和資源是父親的,(工具和資源表示父類的成員變量,所以訪問成員變量時是訪問的父類成員變量)
干什么活是父親決定的,(干活表示成員方法,子類新增的成員方法父類不可以訪問)
而干活方式是兒子自己的,與父親的方式無關,(干活指成員方法,子類重寫了父類的成員方法,所以運行看子類的成員方法)
六.接口
成員變量;只能是常量,并且是靜態的。
常量:1.因為接口是不能實例化的也就是不能被初始化,所以必須是常量
2.不能實例化,所有實現類都共有一份,避免別的實現類修改這個值
靜態:1.接口沒有對象,所以要用類名來訪問,那就是靜態嘍;當多實現時同名的變量名也避免了歧義
2.不能實例化,所有實現類都共有一份
默認修飾符:public static final
建議:自己手動給出。
構造方法:接口沒有構造方法。(不能實例化)
成員方法:只能是抽象方法。
默認修飾符:public abstract
建議:自己手動給出。
七.抽象類和接口的區別:
A:成員區別
抽象類:
成員變量:可以變量,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:只可以常量
構造方法:無
成員方法:只可以抽象
B:關系區別
類與類
繼承,單繼承
類與接口
實現,單實現,多實現
接口與接口
繼承,單繼承,多繼承
C:設計理念區別
抽象類 被繼承體現的是:”is a”的關系。抽象類中定義的是該繼承體系的共性功能。
接口 被實現體現的是:”like a”的關系。接口中定義的是該繼承體系的擴展功能。
抽象的概念是將不可變的提取出來封裝到一起,將可變的東西放到現實中去。
接口的設計理念是高層抽象,全部不可變。
八.toString
* public String toString():返回該對象的字符串表示。
* this.toString() = this.getClass().getName()+'@'+Integer.toHexString(this.hashCode());
* 例如:cn.itcast_02.Student@42552c
九.異常
1:如果catch里面有return語句,請問finally里面的代碼還會執行嗎?
如果會,請問是在return前,還是return后。
會。前。準確的說,應該是在中間。
2.throw是業務型異常。throws是方法聲明異常。try是捕獲異常。
3:try...catch...finally的格式變形
A:try...catch...finally
B:try...catch
C:try...catch...catch...
D:try...catch...catch...finally
E:try...finally
這種做法的目前是為了釋放資源。
4. 異常注意事項:
A:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
B:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
C:如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那么子類只能try,不能throws
十.String
1.不可變性:改變其值時,只是改變了字符串常量池中的指向,實際的值是沒有變化的。
2. 前者創建一個對象,后者創建兩個對象
new String會現在常量池中查看有沒有這個字符串長量,有的話復制到堆內存中,沒有就在常量池中創建并復制堆內存
3. 字符串如果是變量相加:先開空間在拼接
字符串如果常量相加:是先加在常量池里找,如果有就直接返回,沒有就創建
十一.常用類
1.StringBuffer:線程安全的可變字符串、StringBuilder:線程不安全的可變字符串
2. * int -- String:String.valueOf(number); * String -- int:Integer.parseInt(s)
3.Math:int number = (int) (Math.random() * (end - start + 1)) + start;//生成一個在任意范圍的隨機數
4.Random類:
public Random():沒有給種子,用的是默認種子,是當前時間的毫秒值
public Random(long seed):給出指定的種子,給定種子后,每次得到的隨機數是相同的。
public int nextInt():返回的是int范圍內的隨機數
public int nextInt(int n):返回的是[0,n)范圍的內隨機數
十二.泛型和集合類
1.泛型使用:
1.泛型定義在類名上:public class ObjectTool {}
2.泛型定義在方法上:public void show(T t) {}
3.泛型定義在接口上:public interface Inter {}public class InterImpl implements Inter {}
4.通配符:
* ?:任意類型,如果沒有明確,那么就是Object以及任意的Java類了:>
* ? extends E:向下限定,E及其子類: extends Animal>
* ? super E:向上限定,E極其父類: super Animal>
2.ConcurrentModificationException:當方法檢測到對象的并發修改,但不允許這種修改時,拋出此異常。
產生的原因:
迭代器是依賴于集合而存在的,在判斷成功后,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫并發修改異常。
其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
解決辦法:
A:迭代器迭代元素,迭代器修改元素
元素是跟在剛才迭代的元素后面的。
B:集合遍歷元素,集合修改元素(普通for)
元素在最后添加的。
3. JDK5的新特性:自動拆裝箱,泛型,增強for,靜態導入,可變參數,枚舉
4.List集合的排序方式:
Collections提供兩種排序方法:
1.Collections.sort(List list);
此方法需要泛型T這個Bean實現Comparable接口,并且實現compareTo()方法排序;
2.Collections.sort(List list, Comparator super T> c);
此方法,在泛型T這個Bean沒有實現Comparable接口的時候,多個一個參數,是一個接口我們需要實現其compare()方法排序;
5.HashSet:存儲字符串并遍歷--問題:為什么存儲字符串的時候,字符串內容相同的只存儲了一個呢?
* 通過查看add方法的源碼,我們知道這個方法底層依賴 兩個方法:hashCode()和equals()。
* 步驟:
* 首先比較哈希值(重寫后哈希值是通過屬性計算出來的和屬性有關)
* 如果相同,繼續走,比較地址值或者走equals()
* 如果不同,就直接添加到集合中
* 按照方法的步驟來說:
* 先看hashCode()值是否相同
* 相同:繼續走equals()方法
* 返回true:說明元素重復,就不添加
* 返回false:說明元素不重復,就添加到集合
* 不同:就直接把元素添加到集合
* 如果類沒有重寫這兩個方法,默認使用的Object()。一般來說不同相同。
* 而String類重寫了hashCode()和equals()方法,所以,它就可以把內容相同的字符串去掉。只留下一個。
注意:
1.equal()相等的兩個對象他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。
2.hashCode()相等的兩個對象他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。
所有對于需要大量并且快速的對比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equal(),如果equal()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性!
3.當自定義類沒有重寫hashCode和equals方法時,默認走的是Object的hashCode和equals方法,這時他的hashCode的值是不一樣的。
6.TreeSet排序方式:
A:自然排序(元素具備比較性)
讓元素所屬的類實現自然排序接口 Comparable
B:比較器排序(集合具備比較性)
讓集合的構造方法接收一個比較器接口的子類對象 Comparator
