JavaSE複習總結
繼承
繼承:從現有類創建子類,現有類稱爲父類,基類,超類(super)
1.子類繼承父類的所有成員(構造器除外)所有成員包括對象屬性和對象方法(私有的也繼承)
2.子類不能直接訪問父類的私有成員。(可以通過公共的方法進行間接訪問)
3.單繼承(一個子類只能有一個直接父類)
class A {
Type1 field1;
Type2 field2;
}
class B extends A {
Type3 field3;
Type4 field4;
}
class C extends A {
Tupe5 field5;
}
new B();
super關鍵字(可以用於訪問父類的成員,子類的構造方法默認調用父類的構造方法)
利用super關鍵字在構造器中完成對從父類繼承來的私有屬性進行初始化
父類內存空間的標示
構造器:子類的構造器會默認調用父類的無參構造器(利用super關鍵字)
若父類沒有無參構造器,必須通過this調用本類的構造器,或者利用super調用父類的有參構造器,否則編譯出錯
意思說,子類必須調用父類構造器(不管怎樣調,子類構造器中至少有一個構造器直接調用父類構造器,否則形成遞歸) 一句話,任何類都必須有構造器
任何類都必須有對父類構造器的調用
構造器和super關鍵字總結:
構造器: 1.所有類都必須有構造器
2.所有子類構造器都必須有對父類構造器的調用
3.子類構造器第一行會有隱式的父類構造器的直接調用
super:1.可用於訪問父類中的成員屬性,調用父類的成員方法
2.顯式的調用直接父類構造器
3.必須在第一行
class A {
A() {}
}
class B extends A {
Type field1;
B(Type field1) {
super();
this.field1 = field1;
}
}
class C extends B {
C() {
super();
}
}
方法重寫(override)
方法重寫,在子類中根據需求重寫從父類繼承的方法。
@Override 註解 告訴編譯器此處重寫父類方法,請做檢查
方法重寫的條件:
1.方法名,返回類型,參數列表必須完全一樣,才能構成方法重寫
2.覆蓋方法權限>=被覆蓋的方法
子類對象內存中的創建過程:
1.檢查永久區中有沒有繼承體系中的所有類的類模板(方法保存在類模板中,方法只有一份)
2.使用類加載器加載所有涉及的類到永久區中
3.根據類模板中的屬性定義,從最父類—>最子類搜索,在GC區中開闢一塊合適的內存空間
4.對該內存區域清0
5.查看屬性有沒有顯式賦值,若有進行顯式賦值,沒有不執行
6.執行構造器初始化,從最父類—>最子類執行。
7.將對象的首地址賦值給子類對象的引用變量
子類對象中包含的屬性有從父類繼承來的屬性和子類特有的屬性,所以子類對象暗含父類對象
this:誰調用誰就是this
多態
多態—一個對象的多種父類形態
多態:子類對象被賦值給父類引用
本態:子類對象被賦值給本類引用
多態副作用:不可以訪問子類特有的成員
Java程序執行過程有編譯時類型,運行時類型
編譯時類型,編譯器在編譯時只關注引用類型
運行時類型,此時程序怎麼執行主要看對象
虛方法調用:
在多態環境下,調用覆蓋方法
1)編譯時檢查父類類型
2)運行時實際綁定的是子類對象(動態綁定)
多態形成:
子類重寫父類的某一方法,子類對象創建好後,將地址賦給父類引用,因爲父類中有子類重寫的方法,
這樣可以欺騙編譯器通過編譯,然後在執行的時候主要是看對象,此時運行的是子類重寫的方法。(虛方法調用)
多態應用:
1.(多態參數)將子類對象賦值給父類引用,這樣將父類引用作爲參數,就可以傳入繼承體系中的所有子類對象,
在方法中在對子類對象所屬進行判斷(a instanceof A —>對象a是不是類A的對象),進行造型,
(對象還原)然後調用重寫的方法,可以形成多態(不同的子類對象得到不同的結果)(實參可以接收一個家族的任意對象)
public boolean equals(Object obj) {
// 訪問特有成員時
if (obj instanceof 子類類型) {
子類類型 引用 = (子類類型)obj;
引用.特有成員;
}
}
2.創建父類類型數組:可以保存本類和所有子類的對象(多態數組)
Object[] objArr = new Object[10];
Object 類 equals方法 hashCode方法
static
類成員:
屬性
方法
構造器
初始化塊
內部類
static :
可以修飾內部類, 成員變量, 成員方法,代碼塊
成員變量 :
1) 實例變量 對象屬性 必須依賴對象的存在而存在 存儲空間在GC區中 int a;
2) 類變量 類屬性 不必依賴對象的存在而存在, 只依賴於類的存在而存在 存儲空間在永久區中
成員方法 :
1) 實例方法 對象方法 它的調用必須依賴於對象, 存儲空間在永久區中的類模板定義中
2) 類方法 靜態方法 它的調用不依賴對象, 調用只依賴於類, 存儲空間在永久區中的類模板定義中
類模板 :
1) 成員變量和所有方法的定義
2) 類變量的存儲空間
3) 構造器方法
4) 代碼塊
5) 類名, 類所屬的包, 類的父類
一旦被static修飾,意味着成員隸屬於類, 只需要類就可以使用, 但是通過對象仍然也可以, 因爲對象歸屬於類
什麼時候使用static
當你希望一個成員歸所有對象共享(方法的調用與調用者無關)時,就可以聲明這個成員是static的
特點:
隨着類的加載而加載
優先於對象存在
修飾的成員可以被對象共享
類名.static方法/屬性就可以調用(本類中不需要加類名)
非靜態環境下可以訪問靜態方法/成員
在靜態環境下this,super被禁止,也不能直接訪問非靜態成員
單例模式
單例:在程序運行期間只允許有一個對象
兩種模式:
餓漢式:
1.私有化構造器,防止外部隨意創建對象
2.在類內部創建對象(類內部聲明私有的靜態的引用變量,並創建唯一的對象,將地址寫入該引用)
3.給外界提供一個獲取對象的公共方法
懶漢式:
1.私有化構造器,防止外部隨意創建對象
2.類內部聲明一個靜態的私有的引用變量,但是此時不創建對象
3.給外界提供一個獲取對象的公共方法,在該方法內部對引用變量中的值進行判斷,若爲null,創建對象,否則不創建對象
懶漢式,存在線程安全問題
代碼塊
static修飾的代碼塊—->靜態代碼塊
在類被載入時,靜態代碼塊會執行,且執行一次,由JVM自動執行
允許有多個代碼塊,這幾個代碼塊之間順序執行
可以利用靜態代碼塊給靜態成員賦值
沒有被static修飾的代碼塊,動態代碼塊
在對象創建時,無條件執行一次,優先於構造器執行,可以利用動態代碼塊給空final量賦值
final
final關鍵字
可以修飾類, 方法, 屬性, 變量
修飾類表明這個類是終結類(完美類), 不允許被擴展(不允許被繼承)
修飾方法 表明這個方法是最終方法, 不允許被子類擴展(不允許被重寫)
修飾變量 表明這個量是final量, 只允許賦值一次, 再不允許賦值了.
空final量 :
final修飾屬性時沒有直接顯式賦值.
必須保證對其進行一次賦值, 非靜態空final量可以在所有構造器中 或 動態代碼塊中進行賦值
final修飾的變量字母全部大寫
public staic final 全局常量
抽象類
抽象類:對現實世界一種類型的多種事物的統一抽象描述
具體類:對現實世界一種事物的抽象描述
抽象類:屬性
構造器
具體方法
抽象方法(比具體類多了一個抽象方法)
特點:
1.用abstract修飾
2.抽象類不能被實例化
3.抽象方法必須在抽象類中,只有方法簽名沒有方法體。
4.不能用abstract修飾屬性,私有方法,構造器,靜態方法,final方法
抽象類體現的是模板設計,專門用來被繼承
接口
接口:現實世界不同類型事物的共同行爲特徵
關注的是方法
用interface修飾
特點:1.接口中的所有屬性均視爲靜態常量
2.接口中只允許有抽象方法
3.沒有構造器
4.多繼承機制,可以實現多個接口
5.實現接口必須對接口中的所有方法進行實現,否則爲抽象類
6.一個類可以同時繼承父類並實現接口
7.接口和類完全不同,接口之間可以相互繼承
接口體現的是規範/標準
接口應用:
代理模式
爲其他類提供一種代理以控制對這個對象的方法
將實現與管理分開
客戶只需要關心接口,而不用瞭解細節,代理模式將具體實現封裝起來
工廠模式
面向接口編程,將具體實現封裝起來,屏蔽細節
體現了軟編碼的思想,將對象創建延遲到程序執行,這樣在編譯時就不必具備類
將編譯與運行分開
內部類
內部類:定義一個類的內部,相當於外部類的成員
內部類,沒有被static修飾,與對象相關
嵌套類,被static修飾,與類相關,與外部類是平行關係
若外部類想要訪問內部類的屬性,必須創建內部類對象才能訪問
內部類對象創建語法:
外部類類名.內部類類名 引用名 = 外部類對象.new內部類類名();
嵌套類對象創建語法:
外部類類名.內部類類名 引用名 = new 外部類類名.內部類類名();
匿名內部類:在new後面,用其隱含實現一個接口或者實現一個類
語法:new 父類構造器(實參列表) | 實現接口() {匿名內部類的類體部分}
/**
* 接口用於測試匿名內部類
* @author LENOVO
*
*/
public interface ITest {
public void test();
}
/**
* 利用匿名內部類:new 後邊的就是匿名內部類
* 匿名內部類主要用於在創建對象的時候順便實現接口,好直接可以創建對象
* @author LENOVO
*
*/
public class InnerTest {
public static void main(String[] args) {
ITest it = new ITest() {
@Override
public void test() {
System.out.println(“匿名內部類”);
}
};
System.out.println(it);
it.test();
System.out.println(new Object() {
@Override
public String toString() {
return "這是另一個匿名類";
}
});
}
}
枚舉類
枚舉類: 描述對象可數的類
enum關鍵字創建枚舉類
注意:枚舉類對象的屬性不能允許被改動,用private final修飾
必須在枚舉類第一行聲明枚舉類對象
枚舉類的幾個關鍵方法:
values()方法 返回枚舉類型的對象數組(可以用於遍歷所有枚舉值)
valueof(String str) 把一個字符串轉爲對應的枚舉類對象
特點:枚舉中對象全是全局常量
不能創建枚舉類對象,可以通過類名.對象調用
跟switch配合
Annotation
Annotation
可以當作修飾符一樣使用,修飾包,類,構造器,方法,成員變量,參數,局部變量的聲明
@Override 只能用方法覆蓋
@Deprecated 過時的意思
@Suppress Warnings 抑制警告,這個註解還可以接收數據
註解:給運行時看註釋性質內容,可以加在指定元素上
元註解
自定義註解