類和對象
- 類:主觀抽象,是對象的模闆,可以執行個體化對象
習慣上類的定義格式:
package xxx;
import xxx;
public class Xxxx
{
屬性 ······;
構造器 ······;
方法 ······;
}
View Code
定義屬性:執行個體變量
- 格式:[ 修飾符 ] 類型 變量名 [ = ? ]
- 執行個體變量定義在類中但在任何方法之外。
- 執行個體變量有預設值:各種各樣的0。(同數組)
- 執行個體變量的作用域至少在本類内部,受通路控制符的限制。
- 在重合作用域,執行個體變量和局部變量允許有命名沖突,“局部優先”。
定義方法:
- 格式: [ 修飾符 ] 傳回類型 方法名( 參數清單 ) [ throws 異常 ] { ······ }
- java中所有參數都是值傳遞。
- 當沒有值傳回時,傳回類型必須被定義為void。
- 傳回類型必須與方法名相鄰,其他修飾符可以調換位置。
構造器:
- 在建立對象的過程中調用的方法。
- 構造器沒有傳回類型。
- 構造器的名字與類名相同。
- 格式為:[ 修飾符 ] 類名( 參數清單 ){ },修飾符可以是private、 protected、 default、private
在一個對象的生成周期中構造器隻用一次,由系統自動調用,不允許手工調用。
程式員沒有提供一個構造器,系統會自動提供一個無參的構造器。
獲得對象的方式:
- 通過new(在堆空間中申請配置設定空間),new 類名(),可以通過這種形式或的一個對象,這時的對象是無法使用,必須把他的位址存放進一個對象變量才能夠使用。
例如 :
Car c=new Car();
注意:
- 最好在寫類時提供一個無參的構造器。
this關鍵字:
- this是個隐式參數,代表目前對象;
publie class Student
{
private String name;
public void setName(String name)
{
this.name=name; //this.name為目前對象的成員變量
}
}
如果某個構造方法的第一個語句具有形式this( ··· ),那麼這個構造方法将調用同一類中的其他構造方法。
注意:
- 在構造器中this(...)必須放在該構造器的第一行。
- this不能出現在靜态方法裡面
類、對象、執行個體三者的關系:
- 類:是對象的模闆,可以執行個體化對象
- 對象:類的個體
- 執行個體:實作的對象
student s;
s=new student();
其中 Student為類,s為對象,new Student()為執行個體,s指派後也是執行個體了。
方法重載:
- 方法名相同,參數表不同,不考慮傳回值類型(但最好還是使傳回類型一緻)。
- 編譯器根據參數,選擇一個方法,如果沒有完全比對的,對于參數表采用“向上就近比對原則”,但不允許模棱兩可。
- 方法重載屏蔽了一個對象的同一類方法由于參數不同所造成的差異。
封裝:
- 類的屬性加private修飾符,來限制隻能夠在類的内部進行通路,有效的保護資料。
- 對于類中的私有屬性,要對其給出一對方法getXxx(),setXxx()通路私有屬性,保證對私有屬性的操作的安全性。
- 方法公開的是方法的聲明,即隻須知道參數和傳回值就可以調用該方法,隐藏方法的實作的細節。
- 一個對象和外界的聯系應當通過一個統一的接口,應當公開的公開,應當隐藏的隐藏。
繼承:
- 父類到子類是從一般到特殊的關系。
- 泛化:将不同子類中的共性抽象成父類的過程。
- 特化:在原有父類的基礎上加入一些個性的過程。
- 原則:父類放共性,子類放個性。
- 繼承的關鍵字:extends
- Java隻支援單繼承:一個類最多隻有一個直接的父類。
方法覆寫:
- 方法名:相同
- 參數表:相同
- 通路限制符:相同或者更寬
- 傳回值類型:相同或者子類傳回的類型是父類傳回的類型的子類(在JDK5.0以後)
- 抛出的異常:不能比父類更寬。
super關鍵字:
- super()表示調用父類的構造器
- super()也和this()一樣必須放在方法的第一句
- super()和this()不能同時出現
- super可以屏蔽子類屬性和父類屬性重名時帶來的屬性遮蓋,super. 表示調用父類的方法或屬性
- 在子類的構造器中如果沒有指定調用父類的哪一個構造器,那麼就會調用父類的無參構造器,即super()
注意:
- 父類的構造器不能被子類繼承
- 方法和屬性可以被繼承,權限不限制能否繼承過來,限制的是能否直接通路
- 先構造父類,後構造子類,先this後super
多态:
- 多态分為兩種:編譯時多态和運作時多态。
- 編譯時類型:主觀概念,把它看作什麼。
- 運作時類型:客觀概念,實際它是什麼。
例:Animal a=new Dog();
指着狗問,這個動物是什麼?
運作時多态的三原則:
- 對象類型不變。
- 隻能對對象調用編譯時類型中定義的方法。
- 在程式的運作時,根據對象的運作時類型,找覆寫後的方法來調用。(運作時動态類型綁定)
強制類型轉換:
- 一定沒有新對象生成。(父類的引用指派給子類的引用需要進行強制類型轉換)
- 關鍵字:instanceof
- 用法:引用 instanceof 類名 判斷這個引用所指向的對象是否屬于這個類。
- 用在強制轉換之前,避免類型轉換異常。
if(a instanceof Dog)
{
Dog d=(Dog)a;
}
多态的作用:
- 把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的程式設計,以适應需求的不斷變化。
修飾符static
- 把對象相關的變成類相關的,它可以修飾屬性、方法、代碼塊和内部類
- static修飾屬性(類變量):
- 那麼這個屬性就可以用" 類名.屬性名 "來通路,也就是使這個屬性成為本類的類變量,為本類對象所共享。
- 類加載的過程,類本身也是儲存在檔案中(位元組碼檔案儲存着類的資訊)的,java會通過I/O流把類的檔案讀入JVM(java虛拟機),這個過程稱為類的加載。JVM會通過類路徑(CLASSPATH)來找位元組碼檔案。需要的時候才會進行類加載,生成對象時是先加載後構造
- 類變量,會在加載時自動初始化,初始化規則和執行個體變量相同。
注意:
- 類中的執行個體變量是在建立對象時被初始化的
- static修飾的屬性,是在類加載時被建立并進行初始化,類加載的過程隻進行一次,也就是類變量隻會被建立一次。
static修飾方法(靜态方法):
- 會使這個方法成為整個類所公有的方法,可以用" 類名.方法名 "通路。
- static修飾的方法,不能直接通路本類中的非靜态成員,但本類的非靜态方法可以通路本類的靜态成員。
- 在靜态方法中不能出現this關鍵字。
- 父類中是靜态方法,子類中不能覆寫為非靜态方法,在符合覆寫規則的前提下,在父子類中,父類中的靜态方法可以被子類中的靜态方法覆寫,但是沒有多态。(在使用對象調用靜态方法時其實是調用編譯時類型的靜态方法)
- java中的main方法必須寫成static的原因:在類加載時無法建立對象,而靜态方法可以不通過對象調用,是以在類加載時就可以通過main方法入口來運作程式。
static修飾初始代碼塊:
- 這時這個初始代碼塊就叫做靜态初始代碼塊,這個代碼塊隻在類加載時被執行一次。
- 可以用靜态初始代碼塊初始化一個類。
- 動态初始代碼塊,寫在類體中的“{}”,這個代碼塊是在生成對象時運作,這種代碼塊叫動态初始代碼塊。
單例設計模式:
- 一個類隻允許有一個對象,保證所有引用的對象都是同一個對象。
- 因為隻允許存在一個對象,則不允許在外面直接new出新的對象,是以應該把構造器設為private,。
- 在類内定義一個公開的靜态方法,讓使用者進行調用,通過該方法去獲得一個執行個體。
例:
public calss Singleton
{
private static Singleton s;
private Singleton(){}
public static Singleton newInstance()
{
if ( s == null)
s = new Singleton();
return s;
}
}
View Code
修飾符final
- 不允許改變,可以修飾變量、方法、類
final修飾變量:
- 被fianl修飾的變量就會變成常量,一旦指派不能改變
- 常量可以在初始化時直接指派,也可以在構造方法裡指派,隻能在這兩種方法裡二選一,不能不為常量指派
- 常量不會有預設初始值
- 鎖定棧,使棧中的資料不可以改變
- 靜态常量隻能在初始化時直接指派
final修飾方法:
- 被final修飾的方法将不能被其子類覆寫,保持方法的穩定不能被覆寫
final修飾類:
- 被final修飾的類将不能被繼承
- final類中的方法也都是final的
注意:
- final不能用來修飾構造方法
通路權限控制
private:
- 本類内部可以通路
- 不能繼承到子類
- default:
- 本類内部可以通路,同包其他類也可以通路。
- 同包可繼承
protected:
- 本類内部可以通路,不同包的子類也可以通路,同包其他類也可以通路。
- 能繼承到子類
public:
- 任何地方都可以通路
- 能繼承到子類