Java基礎知識整理
-
類與物件
類是一個模板:抽象,物件是一個具體的例項類是一個抽象的概念 狗
物件是一個具體的狗 小明家的旺財
-
方法
定義、呼叫 -
對應的引用
- 引用的型別: 基本型別
- 物件是通過引用來操作的:棧---->堆
-
屬性:欄位Field 成員變數
預設初始化
- 數字
- char
- boolean
- 引用
修飾符 屬性型別 屬性名 = 屬性值
-
物件的建立和使用
- 必須使用new 關鍵字創造物件,構造器
- 物件的屬性
- 物件的方法
-
類:
- 靜態的屬性 屬性
- 動態的行為 方法
封裝、繼承、多型
封裝
- 該露的露
- 程式設計追求“高內聚,低耦合”。高內聚就是類內部資料操作細節自己完成,不允許外部干涉;低耦合:盡暴露少量的方法給外部使用。
- 封裝(資料的隱藏)
- 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這成為資訊隱藏。
屬性私有:set/get
繼承
- 繼承的本質是對某一批類的抽象,
- super
- super呼叫父類的構造方法,必須在構造方法的第一個
- super必須只能出現在子類的方法或者是構造方法
- super和this不能同時呼叫方法
對比 | 代表的物件不同 | 前提 | 構造方法 |
---|---|---|---|
this | 本身呼叫這個物件 | 沒用繼承也可以使用 | 本類的構造 |
super | 代表父類物件的應用 | 只能在繼承條件下才可以使用 | 父類的構造 |
方法重寫
重寫都是方法的重寫的,和屬性無關
需要有繼承關係,子類重寫父類的方法!
- 方法名必須相同
- 引數列表必須相同
- 修飾符:範圍可以擴大
- 丟擲的異常:範圍,可以被縮小,但不能擴大
重寫,子類的方法必須跟父類必要一致:方法體不同
為什麼需要重寫:
-
父類的功能,子類不一定需要,或者不一定滿足!
Alt+Insert :override
多型
-
多型是方法的多型,屬性沒有多型
-
父類和子類,有聯絡 型別轉換異常! ClassCastException !
-
存在條件:繼承關係,方法需要重寫,父類引用指向子類物件!Father f1 = new Son();
無法被重寫的
- static 方法,屬於類,它不屬於例項
- final 常量
- private 方法
型別轉化
- 父類引用指向子類的物件
- 把子類轉換為父類,向上轉型
- 把父類轉換為子類,向下轉型:強制轉換
- 方便方法的呼叫,減少重複的程式碼
抽象類
- 不能new這個抽象類,只能靠子類去實現它:約束
- 抽象類中可以寫普通方法
- 抽象方法必須在抽象類中
抽象類不可以單繼承,只能用介面
介面
作用
- 約束
- 定義一些方法,讓不同的人實現
- public abstract
- public static final
- 介面不能被例項化,介面中沒有構造方法
- implements可以實現多個介面
- 必須重寫介面中的方法
implements 類可以實現介面 implements 介面
實現了介面中的類,就需要重寫介面中的方法
利用介面實現多繼承
異常處理機制
try
catch
finally
工廠模式
簡易工廠模式
該模式對物件建立管理方式最為簡單,因為其僅僅簡單的對不同類物件的建立進行了一層薄薄的封裝。該模式通過向工廠傳遞型別來指定要建立的物件,其UML類圖如下:
下面我們使用手機生產來講解該模式:
public interface Phone { void make(); }
public class MiPhone implements Phone { public MiPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make xiaomi phone!"); } }
public class IPhone implements Phone { public IPhone() { this.make(); } @Override public void make() { // TODO Auto-generated method stub System.out.println("make iphone!"); } }
public class PhoneFactory { public Phone makePhone(String phoneType) { if(phoneType.equalsIgnoreCase("MiPhone")){ return new MiPhone(); } else if(phoneType.equalsIgnoreCase("iPhone")) { return new IPhone(); } return null; } }
public class Demo { public static void main(String[] arg) { PhoneFactory factory = new PhoneFactory(); Phone miPhone = factory.makePhone("MiPhone"); // make xiaomi phone! IPhone iPhone = (IPhone)factory.makePhone("iPhone"); // make iphone! } }
工廠方法模式
和簡單工廠模式中工廠負責生產所有產品相比,工廠方法模式將生成具體產品的任務分發給具體的產品工廠,其UML類圖如下:
也就是定義一個抽象工廠,其定義了產品的生產介面,但不負責具體的產品,將生產任務交給不同的派生類工廠。這樣不用通過指定型別來建立物件了。
接下來繼續使用生產手機的例子來講解該模式。
其中和產品相關的Phone類、MiPhone類和IPhone類的定義不變。
AbstractFactory類:生產不同產品的工廠的抽象類
public interface AbstractFactory { Phone makePhone(); }
XiaoMiFactory類:生產小米手機的工廠(ConcreteFactory1)
public class XiaoMiFactory implements AbstractFactory{ @Override public Phone makePhone() { return new MiPhone(); } }
AppleFactory類:生產蘋果手機的工廠(ConcreteFactory2)
public class AppleFactory implements AbstractFactory { @Override public Phone makePhone() { return new IPhone(); } }
演示:
public class Demo { public static void main(String[] arg) { AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makePhone(); // make xiaomi phone! appleFactory.makePhone(); // make iphone! }}
GUI
邊界佈局(BorderLayout)
邊界佈局管理器把容器的的佈局分為五個位置:CENTER、EAST、WEST、NORTH、SOUTH。依次對應為:上北(NORTH)、下南(SOUTH)、左西(WEST)、右東(EAST),中(CENTER),如下圖所示。
特徵:
l 可以把元件放在這五個位置的任意一個,如果未指定位置,則預設的位置是CENTER。
l 南、北位置控制元件各佔據一行,控制元件寬度將自動佈滿整行。東、西和中間位置佔據一行;若東、西、南、北位置無控制元件,則中間控制元件將自動佈滿整個螢幕。若東、西、南、北位置中無論哪個位置沒有控制元件,則中間位置控制元件將自動佔據沒有控制元件的位置。
l 它是視窗、框架的內容窗格和對話方塊等的預設佈局。
1、 常見的構建函式和方法
構造方法摘要
BorderLayout(): 構造一個元件之間沒有間距(預設間距為0畫素)的新邊框佈局。
BorderLayout(int hgap, int vgap) : 構造一個具有指定元件(hgap為橫向間距,vgap為縱向間距)間距的邊框佈局。
方法摘要
int
getHgap() : 返回元件之間的水平間距。
int
getVgap() : 返回元件之間的垂直間距。
void
removeLayoutComponent(Component comp): 從此邊框佈局中移除指定元件。
void
setHgap(int hgap): 設定元件之間的水平間距。
void
setVgap(int vgap) : 設定元件之間的垂直間距。
網格佈局
網格佈局特點:
l 使容器中的各元件呈M行×N列的網格狀分佈。
l 網格每列寬度相同,等於容器的寬度除以網格的列數。
l 網格每行高度相同,等於容器的高度除以網格的行數。
l 各元件的排列方式為:從上到下,從左到右。
l 元件放入容器的次序決定了它在容器中的位置。
l 容器大小改變時,元件的相對位置不變,大小會改變。
l 設定網格佈局行數和列數時,行數或者列數可以有一個為零。若rows為0,cols為3,則列數固定為3,行數不限,每行只能放3個控制元件或容器。若cols為0,rows為3,則行數固定為3,列數不限,且每行必定有控制元件,若元件個數不能整除行數,則除去最後一行外的所有行元件個數為:Math.ceil(元件個數/rows)。
Math.ceil(double x):傳回不小於x的最小整數值。比如行數為3,元件數為13個,則Math.ceil(13/3)=5,即第一行,第二行元件數各為5個,剩下的元件放在最後一行。
l 若元件數超過網格設定的個數,則佈局管理器會自動增加網格個數,原則是保持行數不變。
構造方法摘要 GridLayout(): 建立具有預設值的網格佈局,即每個元件佔據一行一列。 GridLayout(int rows, int cols) :建立具有指定行數和列數的網格佈局。Rows為行數,cols為列數。 GridLayout(int rows, int cols, int hgap, int vgap) :建立具有指定行數、列數以及元件水平、縱向一定間距的網格佈局。