java的抽象、多態

來源:互聯網
上載者:User

標籤:提升   重載   執行個體化   static   rgs   相關   開發   nbsp   ati   

 1.Java抽象類別

1.抽象類別的相關概念

如果一個類中沒有包含足夠的資訊來描繪一個具體的對象,這樣的類就是抽象類別。

如形狀類是抽象的類,圓、三角形等是具體類。

 

用abstract修飾的類就是抽象類別。如果某個類中包含有抽象方法,那麼該類就必須定義成抽象類別。但是抽象類別中不一定有抽象方法。

 

2.用abstract修飾的類就是抽象類別。如果某個類中包含有抽象方法,那麼該類就必須定義成抽象類別。

抽象類別可以有成員屬性和非抽象的成員方法。

抽象類別不能被執行個體化,但可以有建構函式。

抽象類別只能用作基類,表示的是一種繼承關係。繼承抽象類別的非抽象類別必須實現其中的所有抽象方法,而已實現方法的參數、傳回值要和抽象類別中的方法一樣。否則,該類也必須聲明為抽象類別。

 

3.使用關鍵字abstract定義抽象類別,一般文法:

[存取權限] abstract class 類名 {成員列表}

 

4.抽象類別的注意事項

抽象類別可以有構造方法,但不能直接執行個體化,只能用來繼承;

抽象類別的派生子類應該提供對其所有抽象方法的具體實現;如果抽象類別的派生子類沒有實現其中的所有抽象方法,那麼該派生子類仍然是抽象類別,只能用於繼承,而不能執行個體化;

抽象類別中也可以包含有非抽象的方法,子類中重寫非抽象方法時傳回值和參數必須與父類一致;

構造方法和靜態方法不可以修飾為abstract。

 

 

2.Java抽象方法

1.抽象方法的相關概念

在某些情況下,類無法(或者沒有必要)提供方法的具體實現,可以將此方法聲明成抽象方法;

在類中沒有方法體的方法,就是抽象方法;

含有抽象方法的類,一定是抽象類別。

 

2.使用關鍵字abstract聲明抽象方法,一般文法:

[存取權限] abstract 傳回值類型 方法名稱(參數列表);

 

3.抽象的作用

1.在物件導向領域,抽象類別主要用來進行類型隱藏;也就是使用抽象的類型來編程,但是具體運行時就可以使用具體類型。

 

利用抽象的概念,能夠在開發項目中建立擴充性很好的架構,最佳化程式。

 

抽象類別,抽象方法,在軟體開發過程中都是設計層面的概念。也就是說,設計人員會設計出抽象類別,抽象方法,程式員都是來繼承這些抽象類別並覆蓋抽象方法,實現具體功能。

 

4.多態性

1.多態性是物件導向的三大特徵之一

多態的含義是:對外一種表現形式,內在有多種具體實現。

Java中多態的具體體現

方法重載

方法覆蓋

多態參數(新內容,重點、痛點)

 

5.運行期類型與編譯期類型

1.第一種情況:編譯期類型和運行期類型相同

    A  a = new A();

     a.show();

聲明A的時候,使用到的類型A表示對象的類型,被稱為編譯期類型,在編譯期,虛擬機器認為a的類型是A,對於a所使用的屬性和方法的有效性將到類A中去驗證。

構造方法A()中的A是運行期類型,在運行期,將執行運行期類型中的方法。

 

2.第二種情況:當有繼承關係時,可能發生編譯期類型和運行期類型不同的情況,即編譯期類型是父類類型,運行期類型是子類類型。

//A類是B類的父類                              

A  ab = new B();

ab.show();

對象ab的編譯期類型為父類A類,運行期類型為子類B類。

如果一個引用的編譯期類型和運行期類型不同,那麼一定是編譯期類型與運行期類型有父類子類別關係。

ab對象使用的方法,在編譯期到類A中去校正,而運行則執行B類的方法

如果一個對象的編譯期類型是父類,運行期類型是子類,可以對該對象進行強制類型轉換,將其編譯器類型轉換為與運行期類型相同的類型,即:B b=(B)ab;

6.父類引用指向子類對象

1.當編譯器類型是父類,運行期類型是子類時,被稱為父類引用指向子類對象

public  class Father {

void  study() {

this.strXchinaese="小學語文";

System.out.println("我在學"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

 

對象Father可以調用Son類中的所有方法,fa只能調用Father中定義的方法,

Son擴充的新方法不能調用。

 

7.多態環境下對屬性和方法的調用

1.多態環境下對成員方法的調用

public  class Father {

void  study() {

this.strXchinaese="小學語文";

System.out.println("我在學"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

簡單的說:編譯看左邊,運行看右邊。

 

2.多態環境下對靜態成員方法的調用public  class Father {

static void  study() {

this.strXchinaese="小學語文";

System.out.println("我在學"+this.strXchinaese);

}

}

public class Son extends Father {

static void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

簡單的說:編譯和運行都看左邊。

3.多態環境下對成員變數的調用

public  class Father {

    int a=100;

void  study() {

this.strXchinaese="小學語文";

System.out.println("我在學"+this.strXchinaese);

}

}

public class Son extends Father {

    int a=200;

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

簡單的說:編譯和運行都看等號左邊。

    注意:變數不存在被子類覆寫這一說法,只有方法存在覆寫

 

8.多態參數

1.方法參數具有多態性

public class Animal {

void eat() {

System.out.println("動物吃食物");

}

}

public class Cat extends Animal{

 

void eat() {

System.out.println("貓吃貓糧");

}

}

public class Dog extends Animal{

 

void eat() {

System.out.println("狗吃肉");

}

}

public class Main1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

//Animal animal = new Animal();

Cat cat=new Cat();

Dog dog=new Dog();

/*cat.eat();

dog.eat();*/

method(dog);

method(cat);

}

static void method(Animal animal) {

animal.eat();

}

}

方法多重參數變形性的好處:提高代碼的擴充性

 

 

9.多態環境下對象造型

1.向上造型 –又稱自動型別提升

public  class Father {

void  study() {

this.strXchinaese="小學語文";

System.out.println("我在學"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Father fa=new Son("456");

fa.study();

}

}

只能使用父類中的方法

 

2.向下造型 –又稱向下轉型

public  class Father {

void  study() {

this.strXchinaese="小學語文";

System.out.println("我在學"+this.strXchinaese);

}

}

public class Son extends Father {

void study() {

}

}

public class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

Son son=new Father("456");

son.study();

}

}

子父類中的方法都可以使用

 

 

10.instanceof 操作符

1.instanceof 用法

result = 對象名稱 instanceof  類型

參數:

result:布爾類型。

對象名稱:必選項,任意對象運算式。

類型:必選項,任意已定義的類,可以是API中的類,可以是自訂的類。

 

說明:

如果對象是這個類型的一個執行個體,則 instanceof 運算子返回 true。如果對象不是指定類的一個執行個體,或者對象是 null,則返回 false

instanceof 運算子是用來在運行時指出對象是否是特定類的一個執行個體

 

 

public class Animal {

 

void eat() {

System.out.println("動物吃食物");

}

}

public class Cat extends Animal{

 

void eat() {

System.out.println("貓吃貓糧");

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//Animal animal = new Animal();

Cat cat=new Cat();

Dog dog=new Dog();

/*cat.eat();

dog.eat();*/

method(dog);

method(cat);

}

 

static void method(Animal animal) {

if(animal instanceof Cat) {

Cat c= (Cat)animal;

c.eat();

}

 

}

 

java的抽象、多態

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.