JavaSE複習總結(三)

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 抑制警告,這個註解還可以接收數據

註解:給運行時看註釋性質內容,可以加在指定元素上

元註解
自定義註解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章