Java 面向?qū)ο蟮南嚓P(guān)語法及其語義(抽象類、接口和多態(tài))

抽象類

概念

在面向?qū)ο蟮母拍钪校械膶ο蠖际峭ㄟ^類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個(gè)類中沒有包含足夠的信息來描繪一個(gè)具體的對象,這樣的類就是抽象類。

抽象類除了不能實(shí)例化對象之外,類的其它功能依然存在,成員變量、成員方法和構(gòu)造方法的訪問方式和普通類一樣。

由于抽象類不能實(shí)例化對象,所以抽象類必須被繼承,才能被使用。也是因?yàn)檫@個(gè)原因,通常在設(shè)計(jì)階段決定要不要設(shè)計(jì)抽象類。

父類包含了子類集合的常見的方法,但是由于父類本身是抽象的,所以不能使用這些方法。

在Java中抽象類表示的是一種繼承關(guān)系,一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口。

舉例

public class Main {

    public static void main(String[] args) {
        Animal a = new Cat("mimi");
        a.printName();
        a.say("喵喵");
    }
}

abstract class Animal {
    public String name;

    public void printName() {
        System.out.println(this.name);
    }

    public abstract void say(String str);
}

class Cat extends Animal {

    public Cat(String name) {
        this.name = name;
    }

    public void say(String str) {
        System.out.println(str);
    }
}

運(yùn)行結(jié)果:


image.png

接口

概念

接口(英文:Interface),在JAVA編程語言中是一個(gè)抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法。

接口并不是類,編寫接口的方式和類很相似,但是它們屬于不同的概念。類描述對象的屬性和方法。接口則包含類要實(shí)現(xiàn)的方法。

除非實(shí)現(xiàn)接口的類是抽象類,否則該類要定義接口中的所有方法。

接口無法被實(shí)例化,但是可以被實(shí)現(xiàn)。一個(gè)實(shí)現(xiàn)接口的類,必須實(shí)現(xiàn)接口內(nèi)所描述的所有方法,否則就必須聲明為抽象類。另外,在 Java 中,接口類型可用來聲明一個(gè)變量,他們可以成為一個(gè)空指針,或是被綁定在一個(gè)以此接口實(shí)現(xiàn)的對象。

舉例

Animal.java

package com.company;

public interface Animal {
    public static String name="xxx";

    public void eat();

    public void say(String str);
}

main.java

package com.company;

public class Main {

    public static void main(String[] args) {
    Cat a=new Cat();
    a.eat();
    a.say("喵喵");
    }
}

class Cat implements Animal{
    public void eat(){
        System.out.println("貓吃魚");
    }

    public void say(String str){
        System.out.println(str);
    }
}

運(yùn)行結(jié)果:


image.png

多態(tài)

概念

多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。

當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯(cuò)誤;如果有,再去調(diào)用子類的同名方法。

多態(tài)的好處:可以使程序有良好的擴(kuò)展,并可以對所有類的對象進(jìn)行通用處理。

舉例

public class Main {

    public static void main(String[] args) {
        show(new Cat());
        show(new Dog());
    }

    public static void show(Animal a) {
        a.eat();
        if (a instanceof Cat) {
            ((Cat) a).work();
        } else if (a instanceof Dog) {
            ((Dog) a).work();
        }
    }
}

class Animal {
    public void eat() {
        System.out.println("吃肉");
    }
}

class Cat extends Animal {
    public void eat() {
        System.out.println("我是貓,吃魚");
    }

    public void work() {
        System.out.println("我是貓,抓老鼠");
    }
}

class Dog extends Animal {
    public void eat() {
        System.out.println("我是狗,吃骨頭");
    }

    public void work() {
        System.out.println("我是狗,看家");
    }
}

運(yùn)行結(jié)果:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容