1. 程式人生 > 其它 >Java 繼承 與 抽象類

Java 繼承 與 抽象類

技術標籤:javajava繼承抽象類

Java 繼承 與 抽象類

繼承

1、一個類 從另一個類中派生而來,就是繼承。
2、繼承也是面嚮物件語言的三大特徵之一。 面向物件的語言都具有三大特徵,分別是 封裝繼承多型

3、什麼時候需要繼承?
建立類時,如果已有的某個類中的成員變數或成員方法與當前類相同,此時就可以考慮採用繼承的方式。

4.繼承時 要使用 extends關鍵字

public class son extends father{
    public static void main(String[] args) {

    }
}

class father
{ }

5.被繼承的類 我們一般稱為 超類(或父類)。; 繼承超類的類 稱為 子類。在Java中允許多重繼承,C繼承 B B 繼承 A ;

6.超類中 非私有成員變數成員方法可以被子類繼承,亦這些成員變數和方法成為了子類的成員變數和方法。如果是私有的成員變數和方法不能被繼承。在子類中也不可以被使用。

public class son extends father{
    public static void main(String[] args) {
        new son();
    }
    public son(){
        super.kiri="牛基"
; System.out.println(super.kiri); } } class father{ private String name; public String kiri="李四"; private void nameti(){ System.out.println("張三"); } }

在這裡插入圖片描述

7.有可能 子類 中定義的成員變數 與超類中的 成員變數同名,此時我們通過子類來使用該成員變數時,使用的是子類中的成員變數

public class son extends father
{ public static void main(String[] args) { new son(); } public son(){ super.kiri="牛基"; nameti(); } @Override public void nameti(){ System.out.println("張三的兒子"); } } class father{ private String name; public String kiri="李四"; public void nameti(){ System.out.println("張三"); } }

在這裡插入圖片描述

8.在成員變數 同名情況下,如果子類要使用父類的同名的成員變數。需要在成員變數前 加super關鍵。此時super表示的就是父類的物件

public class son extends father{
    private String kiri="李四的兒子";
    public static void main(String[] args) {
        new son();
    }
    public son(){
        System.out.println(super.kiri);
    }
    @Override
    public void nameti(){
        System.out.println("張三的兒子");
    }
}

class father{
    private String name;
    public String kiri="李四";
    public void nameti(){
        System.out.println("張三");
    }
}

在這裡插入圖片描述

9.如果子類中具有與父類同名的方法(引數完全相同)。此時會發生方法的覆蓋。這就是方法的重寫。如果設計子類時,如果父類中的某個方法不滿足子類的要求,就可以進行方法的重寫(子類的方法及引數與父類的某個方法及引數完全一致,返回值和修飾符可以不一致)。在子類中呼叫父類中被重寫的方法也要使用super關鍵。

public class son extends father{
    private String kiri="李四的兒子";
    public static void main(String[] args) {
        new son();
    }
    public son(){
        super.nameti();
    }
    @Override
    public void nameti(){
        System.out.println("張三的兒子");
    }
}

class father{
    private String name;
    public String kiri="李四";
    public void nameti(){
        System.out.println("張三");
    }
}

在這裡插入圖片描述

10.在Java中,如果 一個類 繼承了 另一個類,這兩個類就具有了關係,它們具有父類與子類的關係。

11.如果一個子類被例項化,首先要例項化 它的父類的物件,然後用super來引用父類物件並把super交給子類使用。此時super就是一個引用型別的變數,它引用的就是父類的物件,然後再 例項化子類的物件,此時也會給 子類傳遞一個引用型別的變數this,它引用的就是當前子類的物件。

public class son extends father{
    private String kiri="李四的兒子";
    public static void main(String[] args) {
        new son();
    }
    public son(){
//父類沒有無參構造方法時,必須呼叫有參構造方法,且這條語句要在子類構造方法的第一條語句,呼叫
        super("父親的有參構造方法"); 
        System.out.println("son");
    }
    @Override
    public void nameti(){
        System.out.println("張三的兒子");
    }
}

class father{
    private String name;
    public String kiri="李四";
    public void nameti(){
        System.out.println("張三");
    }

   //當寫了構造方法(不管你寫的構造方法是有參的還是無參的)時,預設提供的無參構造方法,將不會被呼叫。
    public father(String name){
        this.name=name;
        System.out.println(name);
    }
}

12.任何類被例項化都必須呼叫構造方法,通過構造方法來初始化成員

13、如果超類沒有無參的構造方法(它一定有帶參的構造方法),子類就必須要有顯示的構造方法,且在構造方法的第一行呼叫超類的構造方法。Super(嘻嘻嘻,xx);之所以這樣,是因為任何類被例項化時都必須對成員變數進行初始化,例項化子類的物件之前必須要例項化超類的物件,以保證超類中的成員變數已經被初始化,如果 超類中有帶參的構造方法,這就說明超類的初始化要通過帶參的構造方法來完成以保證 成員變數能夠接受外部的傳值。

14、在Java中 不允許一次繼承多個類,也就是extends 類名1,類名2…。這種繼承方式稱為多繼承。在C++中允許多繼承。在多繼承的情況下,可能會發生超類的成員變數和成員方法 同名。造成子類的混亂。如果在實際開發中,真的需要進行 多繼承,Java提供了三種解決方案,第一,採用組合的方式(把本就是超類的物件作為子類的一個成員變數)第二種方案就是採用介面第三種方案 就是採用內部類

採用組合來實現繼承的功能,可以減少對類的侵入,這也是當前被多數人推崇的方式。

抽象類

在 設計類時,有的類中的方法沒有辦法確定它的具體行為,此時就可以把該方法宣告為抽象的方法。抽象方法需要使用abstract關鍵字進行宣告。

public class son extends father{

}

abstract class father{

}

如果一個類中有抽象的方法,那麼該類就必須宣告為抽象類

 public class son extends father{


    @Override
    public void nameti() {
        
    }
}

abstract class father{
//abstract 和 public不能省略(但是在介面中可以省略)(介面中對於表達抽象方法)
    abstract public void nameti();
}

1.抽象類 不能被例項化為物件。原因在於,在一個具體的物件上,不能夠存在抽象的 成員

public class son extends father{
    public static void main(String[] args) {
        father yi=new son(); // 但是可以多型 來使用
        yi.nameti();
    }

    @Override
    public void nameti() {
        System.out.println("重寫的");
    }
}

abstract class father{
    abstract public void nameti();
}

在這裡插入圖片描述

2.抽象類只能被繼承,它只能作為超類使用。此時,子類就必須實現抽象類的抽象方法
3.在 實現抽象方法時,方法上面應該加上 @Override 註釋,這樣的編譯器就知道該方法是重寫或實現超類的方法(抽象方法),如果方法被加上了 @Override ,那麼方法的名稱和引數只能與超類的方法保持一致,否則編譯不能通過
4.抽象類也可以有自己的構造(也就是也有自己的構造方法),它只能作為超類使用,被子類繼承,所有與繼承有關的規則,在這種情形都適用。

public class son extends father{
    public static void main(String[] args) {
       new son();
    }
    public son(){
        super("抽象父類構造方法");
        System.out.println("son");
    }

    @Override
    public void nameti() {

    }
}

abstract class father{
    public father(String name){
        System.out.println(name);
    }
    abstract public void nameti();
}

在這裡插入圖片描述