陣列,繼承,過載,多型,抽象,介面,GUI,內部類
設計層面的六大原則:
單一職責原則:
一個類只做一件事情,一個方法只做一件事,降低程式碼冗餘,提高程式碼複用性。
不要把無關的事情放到方法中來完成。每個方法不要超過20行,10行為最佳。
最少知道原則:
儘量少公開方法或者屬性,對外只公佈介面。
里氏替換原則:
當基類被派生類替換時,功能不發生改變,所以在使用繼承的時候,儘量不要發生重寫。
用基類定義,用派生類例項化,利用派生類的例項替換基類。
介面隔離原則:
在不違背單一職責原則的情況下,確保一個介面只做一件事情,不要把無關的介面處理通過不同的引數,融入同一個介面。
依賴倒置原則:
高層模組(呼叫)不依賴底層(被呼叫)模組,依賴於抽象而不是具體。
開閉原則:(開放的介面越少越好)
通過訪問修飾符進行訪問控制,只開放必要的介面(方法,函式,行為,動作)給其他類呼叫,封裝起來。
把改動比較頻繁的介面,設為私有,開放出去一個相對穩定的介面。
對外提供查詢,對內不提供修改;對外公佈介面,對內隱藏具體方法實現。
Java註釋
1./** */-類註釋,可以通過javadoc來編譯生成html檔案
2./* */-多行註釋,不可編譯。
3.//-單行註釋,不可編譯。
java陣列
陣列的定義:
int[] array={1};
int[] newArray= new int[10];
String[] sArray= new String[6];
For-each語句 for型別與需要遍歷佇列一致的型別 變數名:佇列名
for(string s :sArray){
System.out.println(s);
}
陣列列印
System.out.println(array);//這樣的寫法是錯誤的!
System.out.println(Arrays.toString(array));//正確寫法!
資料轉換可使用Integer方法
int price = 200 * Integer.parseInt(pCount);(將其他資料型別轉換為整型資料型別,使用integer方法下面的一些方法。)
If語句裡面的判斷兩個等號是全等(棧和堆都相等),java裡面可以使用.eauals()這個方法,判斷資料是否相等。
三元表示式:
在表示式boolean-exp ? value0 : value1 中,如果“布林表示式”的結果為true,就計算“value0”,而且這個計算結果也就是操作符最終產生的值。如果“布林表示式”的結果為false,就計算“value1”,同樣,它的結果也就成為了操作符最終產生的值。
int a=1;
int b=2;
int c= a>b?1:0;
Java面向物件程式語言設計
面相物件三個特點:
繼承:傳遞性,可覆蓋性,里氏替換原則,單一繼承。
封裝(開啟應用的介面,關閉細節的實現):屬性,行為,訪問修飾符,失血模型,開閉原則,單一職責。
多型:抽象類,介面,過載(靜態多型性),動態多型性)(father f=new son();)
類與物件:
面向物件程式設計(object-oriented programming)
從類到物件:
1. 使用new關鍵字產生一個類的例項
2. 操作的全是物件。
從類到物件會經過4個步驟:
1. 載入
2. 連線
3. 初始化
4. 例項化
從類成為物件有幾種方式:
a) 例項化—強制分配物件(消耗堆記憶體空間,例項的變數名消耗的棧記憶體空間has值,該值是地址,指向對應的堆。)
b) 反射
c) 反序列化
d) 克隆---產生一個新物件,與當前物件一模一樣。
失血模型:只有屬性,沒有行為的類。(資料類)
富血模型:有屬性和行為的類。
方法呼叫:
本類:
靜態呼叫非靜態通過物件直接呼叫。
其他情況都可以直接呼叫,或者使用this關鍵字呼叫。
不同類:
任何地方呼叫靜態程式碼塊可以直接通過類名,也可以通過物件呼叫。
其他的情況都需要通過物件呼叫。
Overload-過載
對於同類中的同名方法只要構成引數列表不一致(引數的數量、型別、不同型別的引數順序的不一致),即形成過載。(只與引數列表有關,與返回值無關)
建構函式(又名構造器,建構函式,constructer):
是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的一個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。
書寫方式:(public+類名(引數列表){})。
每一個建構函式預設存在一個無參建構函式。
構造方法中呼叫其他重構的構造方法必須在第一行。
**程式碼塊:沒有方法名,沒有引數,在類例項化 的時候載入使用。(儘量使用構造方法,代替程式碼塊);
繼承:
繼承就是子類(派生類)繼承父類(超類,基類)的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
繼承的關鍵字:
1. 在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的;
2. This指代當前類例項。
3. Super-指的是當前類的直接父類的例項。
4. Super();指的是呼叫父類的無參構造。
類的繼承格式:
class 父類 {
}
class 子類 extends 父類 {
}
在繼承關係當中,非私有的方法和屬性會被子類繼承,但是私有的不可以被子類繼承。
繼承的特點:
1. 對於子類來說,子類擁有父類的所有非私有方法與屬性,即包括(public,protected,default),修飾的所有方法和屬性,排除不同包的情況下一些特殊情況。
2. Java僅支援單根繼承,意味著子類只有一個直接父類。
3. 在繼承關係中,如果需要例項化子類,則需要例項化直接父類,也就是說需要例項化所有跟父類有繼承關係的類。
4. java所有類都繼承了object類。(泛型)
5. 執行順序:父類建構函式-子類建構函式-產生子類-產生子類的方法。
繼承的優點:
1. 減少重複程式碼,降低程式碼冗餘。
2. 如果父類已經有一些已有的方法和屬性,那麼子類繼承父類時,可以直接呼叫。
3. 子類可以有自己獨立的特殊方法,方便功能的擴充套件。
4. 方便功能的擴充套件。
重寫:(override)
1. 為了實現子類方法時候,產生不同的效果。
2. 重寫存在於繼承關係當中。
3. 一定是子類重寫父類的方法。
4. 重寫的方法一定是和父類中被重寫的方法結構一致(包括方法名和引數型別,引數數量)。
5. 訪問許可權只能擴大,不能縮小,即如果父類的方法是受保護的(protected),那麼子類重寫的方法可以是受保護的(protected),也可以是共有的(public)。
繼承中注意事項:
成員變數的訪問遵循:就近原則。
this訪問本來的成員
super訪問父類的成員
一個類的靜態程式碼塊,構造程式碼塊,構造方法的執行流程
靜態程式碼塊==》構造程式碼塊==》構造方法
靜態內容是隨著類的載入而載入,靜態程式碼塊的內容會優先執行。
類的初始化過程:
成員變數初始化==》預設初始化==》顯示初始化==》構造方法初始化
子類父類初始化:(分層初始化)
先進行父類初始化,然後進行子類初始化。
Java 多型
多型的優點:
- 1. 消除型別之間的耦合關係
- 2. 可替換性
- 3. 可擴充性
- 4. 介面性
- 5. 靈活性
- 6. 簡化性
多型的弊端:
不能使用子類特有功能。
解決方案:
建立子類物件的呼叫方法即可。(但是太佔記憶體)
把父類的引用強制轉換為子類的引用。(向下轉型)。
多型存在的三個必要條件
- 繼承
- 要有方法的重寫。(其實沒有也可以,但是如果沒有這個就沒有意義!)
- 父類引用指向子類物件。
多型中成員的訪問特點:
f f=new s();
成員變數:
編譯看左邊,執行看左邊。
構造方法:
建立子類物件的時候,訪問父類的構造方法,對父類的資料進行初始化。
成員方法
編譯看左邊,執行看右邊。
靜態方法:
編譯看左邊,執行看左邊。
(靜態和類相關,算不上重寫,所以,訪問還是左邊的)
由於成員方法存在方法重寫,所以它執行看右邊。
多型中轉型問題:
向上轉型:從子到父,父類的引用只想子類的物件。
向下轉型:從父到子,父類的引用轉為子類的物件。
比如:
Parent p =new Child();
當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去呼叫子類的同名方法。
多型的好處:可以使程式有良好的擴充套件,並可以對所有類的物件進行通用處理。
抽象與介面
抽象:
1. 抽象類的定義:所有使用關鍵字abstract的類都是抽象類。
2. 關於抽象類:
a) 抽象類中不一定有抽象方法 ,但是有抽象方法的類一定是抽象類。
b) 抽象類存在意義,用於被繼承。
c) 抽象類有建構函式(用於子類訪問父類資料的初始化),但不可以被直接例項化,抽象可以通過子類動態繫結例項化。
d) 抽象類中的抽象方法只是宣告,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。
e)抽象子類:
如果不想重寫抽象方法,該子類是一個抽象類。
如果重寫所有的抽象方法,這個時候子類是一個具體的類。
3. 抽象類的優點:
a) 從抽象方法來看,抽象方法要求必須被子類重寫(規範子類行為)。
b) 從非抽象方法上看,提取子類共有行為。
介面:
1. 介面的定義:
a) 介面是一個特殊的抽象類,以interface修飾。
b) 當一個抽象類中全部都是抽象函式時,我們叫介面。
2. 介面的作用:
a) 規範實現類行為
3. 介面的定義規則:
a) Public interface 介面名();
b) 使用方式:在類名後使用implements關鍵字後加介面名,如:
i. Public class A implements interB{};
4. 介面的使用
a) 介面的實現要麼是抽象類,要麼是普通類,普通類要求重寫裡面的所有的方法。
b) 介面可以多重繼承。
c) 介面可以多重實現。
5. 介面的成員特點:
成員變數:只能是常量,並且是靜態的。預設修飾符:public static final
構造方法:介面沒有構造方法。
成員變數:只能是抽象方法。預設修飾符 :public abstract。
類與介面之間的關係:
類與類:繼承關係,只能單繼承,可以多層繼承。
類與介面:實現關係,可以單實現,也可以多實現。
介面與介面:繼承關係,可以單繼承,也可以多繼承。
抽象類和介面的區別:
成員區別:
抽象類:
成員變數:變數和常量都可以。
構造方法:有
成員方法:可以抽象,也可以非抽象。
介面:
成員變數:只能是靜態常量。
成員方法:只可以抽象。
關係區別:同類與介面關係。
設計理念的區別:
抽象類:被繼承體現的是:“is a”的關係。定義的是該繼承體系的共性功能。
介面:被實現體現的是:“like a”的關係。定義的是該繼承體系的擴充套件功能。
內部類:
成員內部類修飾符:
private 為了保證資料的安全性
static 為了方便訪問資料
注意:靜態內部類訪問的外部類資料必須使用靜態修飾。
注意:內部類和外部類沒有繼承關係。
通過外部類名限定this物件。
區域性內部類:
可以直接訪問外部類成員
在區域性位置,可以建立內部類物件,通過物件呼叫內部類方法,來使用區域性內部類的功能。
面試題:區域性內部類訪問區域性變數必須使用final修飾,這是為什麼呢?
區域性變數是隨著方法的呼叫而呼叫,隨著方法的呼叫完畢而消失。
而堆記憶體的內容並不會立即消失。所以,我們加final修飾。
加入final修飾後,這個變數就成了常量,既然是常量,
你消失了,我在記憶體中儲存的是後面的值,所以,我還有資料在使用。
匿名內部類:就是內部類的簡化寫法。
前提:
存在一個類或者介面(這裡的類可以是具體類也可以是抽象類)
格式:
new 類名或者介面名(){
重寫方法;
}
匿名內部類本質是什麼呢?
是一個繼承了該類或者實現了該介面的子類匿名物件。(可以通過多型的方式呼叫內部類裡面的方法)
JAVA GUI:
GUI:使用者圖形介面:graphic User Interface
java有兩套gui解決方案:swing, awt
swing:完全基於純Java程式碼實現,可以在不同的作業系統中執行。
awt:基於作業系統的圖形介面,不具備有效移植性。