天天看點

【Java】Java複習筆記-第二部分

類和對象

  • 類:主觀抽象,是對象的模闆,可以執行個體化對象

  習慣上類的定義格式:

package xxx;    
import xxx;    
public class Xxxx
{
    屬性 ······;

    構造器 ······;

    方法 ······;
}      

View Code

 定義屬性:執行個體變量

  1. 格式:[ 修飾符 ] 類型 變量名 [ = ? ]
  2. 執行個體變量定義在類中但在任何方法之外。
  3. 執行個體變量有預設值:各種各樣的0。(同數組)
  4. 執行個體變量的作用域至少在本類内部,受通路控制符的限制。
  5. 在重合作用域,執行個體變量和局部變量允許有命名沖突,“局部優先”。

定義方法:

  • 格式: [ 修飾符 ] 傳回類型 方法名( 參數清單 ) [ throws 異常 ] { ······ }
  1. java中所有參數都是值傳遞。
  2. 當沒有值傳回時,傳回類型必須被定義為void。
  3. 傳回類型必須與方法名相鄰,其他修飾符可以調換位置。

構造器:

  1. 在建立對象的過程中調用的方法。
  2. 構造器沒有傳回類型。
  3. 構造器的名字與類名相同。
  4. 格式為:[ 修飾符 ] 類名( 參數清單 ){ },修飾符可以是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( ··· ),那麼這個構造方法将調用同一類中的其他構造方法。

注意:

  1. 在構造器中this(...)必須放在該構造器的第一行。
  2. this不能出現在靜态方法裡面

類、對象、執行個體三者的關系:

  1. 類:是對象的模闆,可以執行個體化對象
  2. 對象:類的個體
  3. 執行個體:實作的對象
student s;    
s=new student();      

  其中 Student為類,s為對象,new Student()為執行個體,s指派後也是執行個體了。

方法重載:

  1. 方法名相同,參數表不同,不考慮傳回值類型(但最好還是使傳回類型一緻)。
  2. 編譯器根據參數,選擇一個方法,如果沒有完全比對的,對于參數表采用“向上就近比對原則”,但不允許模棱兩可。
  3. 方法重載屏蔽了一個對象的同一類方法由于參數不同所造成的差異。

封裝:

  1. 類的屬性加private修飾符,來限制隻能夠在類的内部進行通路,有效的保護資料。
  2. 對于類中的私有屬性,要對其給出一對方法getXxx(),setXxx()通路私有屬性,保證對私有屬性的操作的安全性。
  3. 方法公開的是方法的聲明,即隻須知道參數和傳回值就可以調用該方法,隐藏方法的實作的細節。
  4. 一個對象和外界的聯系應當通過一個統一的接口,應當公開的公開,應當隐藏的隐藏。

繼承:

  1. 父類到子類是從一般到特殊的關系。
  2. 泛化:将不同子類中的共性抽象成父類的過程。
  3. 特化:在原有父類的基礎上加入一些個性的過程。
  4. 原則:父類放共性,子類放個性。
  5. 繼承的關鍵字:extends
  6. Java隻支援單繼承:一個類最多隻有一個直接的父類。

方法覆寫:

  1. 方法名:相同
  2. 參數表:相同
  3. 通路限制符:相同或者更寬
  4. 傳回值類型:相同或者子類傳回的類型是父類傳回的類型的子類(在JDK5.0以後)
  5. 抛出的異常:不能比父類更寬。

super關鍵字:

  1. super()表示調用父類的構造器
  2. super()也和this()一樣必須放在方法的第一句
  3. super()和this()不能同時出現
  4. super可以屏蔽子類屬性和父類屬性重名時帶來的屬性遮蓋,super. 表示調用父類的方法或屬性
  5. 在子類的構造器中如果沒有指定調用父類的哪一個構造器,那麼就會調用父類的無參構造器,即super()

注意:

  1. 父類的構造器不能被子類繼承
  2. 方法和屬性可以被繼承,權限不限制能否繼承過來,限制的是能否直接通路
  3. 先構造父類,後構造子類,先this後super

多态:

  1. 多态分為兩種:編譯時多态和運作時多态。
  2. 編譯時類型:主觀概念,把它看作什麼。
  3. 運作時類型:客觀概念,實際它是什麼。

  例:Animal a=new Dog();

  指着狗問,這個動物是什麼?

運作時多态的三原則:

  1. 對象類型不變。
  2. 隻能對對象調用編譯時類型中定義的方法。
  3. 在程式的運作時,根據對象的運作時類型,找覆寫後的方法來調用。(運作時動态類型綁定)

強制類型轉換:

  1. 一定沒有新對象生成。(父類的引用指派給子類的引用需要進行強制類型轉換)
  2. 關鍵字:instanceof
  3. 用法:引用 instanceof 類名 判斷這個引用所指向的對象是否屬于這個類。
  4. 用在強制轉換之前,避免類型轉換異常。
if(a instanceof Dog)
{
    Dog d=(Dog)a;
}      

多态的作用:

  • 把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的程式設計,以适應需求的不斷變化。

修飾符static

  1. 把對象相關的變成類相關的,它可以修飾屬性、方法、代碼塊和内部類
  2. static修飾屬性(類變量):
  3. 那麼這個屬性就可以用" 類名.屬性名 "來通路,也就是使這個屬性成為本類的類變量,為本類對象所共享。
  4. 類加載的過程,類本身也是儲存在檔案中(位元組碼檔案儲存着類的資訊)的,java會通過I/O流把類的檔案讀入JVM(java虛拟機),這個過程稱為類的加載。JVM會通過類路徑(CLASSPATH)來找位元組碼檔案。需要的時候才會進行類加載,生成對象時是先加載後構造
  5. 類變量,會在加載時自動初始化,初始化規則和執行個體變量相同。

注意:

  1. 類中的執行個體變量是在建立對象時被初始化的
  2. static修飾的屬性,是在類加載時被建立并進行初始化,類加載的過程隻進行一次,也就是類變量隻會被建立一次。

static修飾方法(靜态方法):

  1. 會使這個方法成為整個類所公有的方法,可以用" 類名.方法名 "通路。
  2. static修飾的方法,不能直接通路本類中的非靜态成員,但本類的非靜态方法可以通路本類的靜态成員。
  3. 在靜态方法中不能出現this關鍵字。
  4. 父類中是靜态方法,子類中不能覆寫為非靜态方法,在符合覆寫規則的前提下,在父子類中,父類中的靜态方法可以被子類中的靜态方法覆寫,但是沒有多态。(在使用對象調用靜态方法時其實是調用編譯時類型的靜态方法)
  5. java中的main方法必須寫成static的原因:在類加載時無法建立對象,而靜态方法可以不通過對象調用,是以在類加載時就可以通過main方法入口來運作程式。

static修飾初始代碼塊:

  1. 這時這個初始代碼塊就叫做靜态初始代碼塊,這個代碼塊隻在類加載時被執行一次。
  2. 可以用靜态初始代碼塊初始化一個類。
  3. 動态初始代碼塊,寫在類體中的“{}”,這個代碼塊是在生成對象時運作,這種代碼塊叫動态初始代碼塊。

單例設計模式:

  1. 一個類隻允許有一個對象,保證所有引用的對象都是同一個對象。
  2. 因為隻允許存在一個對象,則不允許在外面直接new出新的對象,是以應該把構造器設為private,。
  3. 在類内定義一個公開的靜态方法,讓使用者進行調用,通過該方法去獲得一個執行個體。

  例:

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修飾變量:

  1. 被fianl修飾的變量就會變成常量,一旦指派不能改變
  2. 常量可以在初始化時直接指派,也可以在構造方法裡指派,隻能在這兩種方法裡二選一,不能不為常量指派
  3. 常量不會有預設初始值
  4. 鎖定棧,使棧中的資料不可以改變
  5. 靜态常量隻能在初始化時直接指派

final修飾方法:

  • 被final修飾的方法将不能被其子類覆寫,保持方法的穩定不能被覆寫

final修飾類:

  1. 被final修飾的類将不能被繼承
  2. final類中的方法也都是final的

注意:

  • final不能用來修飾構造方法 

通路權限控制

private:

  1. 本類内部可以通路
  2. 不能繼承到子類
  3. default:
  • 本類内部可以通路,同包其他類也可以通路。
  • 同包可繼承

protected:

  1. 本類内部可以通路,不同包的子類也可以通路,同包其他類也可以通路。
  2. 能繼承到子類

public:

  1. 任何地方都可以通路
  2. 能繼承到子類