1. 程式人生 > >抽象類&介面&繼承

抽象類&介面&繼承

一.抽象類
1.抽象類:
定義:只約定類所具有的抽象行為,沒有具體實現相應的功能的物件
使用原則:
(1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public;
(2)抽象類不能直接例項化,需要依靠子類採用向上轉型的方式處理;
(3)抽象類必須有子類,使用extends繼承,一個子類只能繼承一個抽象類;
(4)子類(如果不是抽象類)則必須重寫抽象類之中的全部抽象方法(如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。

abstract class A{//定義一個抽象類

    public void fun(){//普通方法
        System.out.println("存在方法體的方法");
    }

    public abstract void print();//抽象方法,沒有方法體,有abstract關鍵字做修飾

}
//單繼承
class B extends A{//B類是抽象類的子類,是一個普通類

    @Override
    public void print() {//強制要求覆寫
        System.out.println("Hello World !");
    }

}
public class TestDemo {

    public static void main(String[] args) {
        A a = new B();//向上轉型

        a.fun();//被子類所覆寫的過的方法
    }
}

2.抽象方法:
抽象方法,是指沒有方法體的方法,
同時抽象方法還必須使用關鍵字abstract做修飾。
二.介面
定義:介面(Interface),是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
這就是介面(與抽象類區分開):一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個抽象類。只會定義為一個介面,所以介面嚴格的來講屬於一個特殊的類,而這個類裡面只有抽象方法和全域性常量,就連構造方法也沒有。
使用原則:
(1)介面必須要有子類,但此時一個子類可以使用implements關鍵字實現多個介面;
(2)介面的子類,必須要重寫寫介面中的全部抽象方法;
(3)介面的物件可以利用子類物件進行例項化。

interface A{//定義一個介面A
                   String MSG = "hello";//全域性常量

    public abstract void print();//抽象方法
}

interface B{//定義一個介面B

    public abstract void get();
}

abstract class C{//定義一個抽象類C
    public abstract void change();
}

class X extends C implements A,B{//X類繼承C類,並實現了A和B兩個介面

    @Override
    public void print() {
        System.out.println("介面A的抽象方法print()");
    }

    @Override
    public void get() {
        System.out.println("介面B的抽象方法get()");
    }

    @Override
    public void change() {
        System.out.println("抽象類C的抽象方法change()");
 }}

三.繼承
定義:根據已有類派生出新類的過程
重寫使用原則
(1)只能是例項方法;不能是類方法:使用static修飾(靜態方法)
(2)方法名相同;
(3)引數列表相同;父類 擦除 後與子類相同。
(4)返回值型別相同;子類可以是父類方法的子型別。
(5)訪問許可權 子類 不能比 父類更嚴格;不能比父類的低。
(6)異常處理 子類 不能比 父類範圍更大。

    1.子類 修改 父類的功能;
    2.子類 擴充套件 了父類的功能。
//簡單的構造方法的應用就是這個模板了 
class C {
    String name;//首先要有這個屬性,才能有構造~
    public C(String name){
        this.name = name;
    }
}
class B extends C{

private int age;
    public B(String name) {
        super(name);
    }

    public B(String name,int age){//構造器可以過載,不能重寫  所以方法名必須一樣,引數可以改變
        super(name);
        this.age = age;
    }

    @Override
    public String toString() {
        return "forever"+this.age +" "+this.name+" is my favourite";
    }
}
public class A{
    public static void main(String[] args) {
        B b = new B("WRR",18);
        System.out.println(b);
    }
}