天天看點

淺談Java三大特性之繼承

前言

簡單用僞代碼去介紹一些

父類與子類的構造函數問題

others

前言

類的繼承性是面向對象語言的基本特性,多态性前提是繼承性。Java 支援繼承性和多态性。——Java從小白到大牛

繼承:三大特性之一,關鍵詞:extends

簡單用僞代碼去介紹一些

  • 假設需要定義個student類
public class Student{
    private String name;//名字 
    private int age;//年齡
    private int sex;//性别
}
class Student{
    private String name;//名字 
    private int age;//年齡
    private int sex;//性别
}
           
  • 再來個需求,需要定義一個學生Andy,不用繼承時候,需要一個個去定義;
public class Andy{
    private String name;
    private int age;
    private int sex;
    private String country;//新增一個國家資訊
}
class Andy{
    private String name;
    private int age;
    private int sex;
    private String country;//新增一個國家資訊
}
           
  • 從上面看兩者有着很多的相似的重複定義的東西,如果使用繼承去寫這段代碼就可以如下:
public class Andy extends student{
    private String country
}
class Andy extends student{
    private String country
}
           
是以從上面可以看出類的繼承大緻用途,Andy類已經繼承了Student類,上面的父類便是student,extends後面跟着的。繼承的時候,要明确指出,要不然就是在Java标準根類Object進行繼承。                再者,在繼承的過程中,除了你可以在新的類中去添加東西,也不一定非得使用基類的方法屬性等。
      
  • 還可以有多層繼承關系(下面的輸出是随便定義的僞代碼,可以是直接輸出某一些語句,友善運作檢視)
class Art{
Art(){輸出1}
}
class Music extends Art{
Music(輸出2)
}
class Dance extends music{
public Dance(){輸出3}
public static void main(String args[]){
dance x = new dance();
}
}
//輸出的順序是1 2 3
Art{
Art(){輸出1}
}
class Music extends Art{
Music(輸出2)
}
class Dance extends music{
public Dance(){輸出3}
public static void main(String args[]){
dance x = new dance();
}
}
//輸出的順序是1 2 3
           

父類與子類的構造函數問題

  • 若不在類中定義構造函數,會預設生成一個無參的函數構造器,如果有了就不會。(構造器即構造函數,與類同名,在初始化的時候就被調用,,預設的構造函數是不帶任何參數的)
class Art{

}
//等同于下面
class Art{
	public Art(){
	//
	}
}

           
  • super關鍵字

Java用super表示超類的醫生,目前類是從超類繼承來的。

class Game{
    int h;
    Game(int i){//構造函數
        System.out.println("this is a game!");
    }
    public static void printg(int d){//普通函數
        System.out.println("12");
    }
}
class ballGame extends Game{
​
    ballGame(int i){
        super(i);//調用父類的構造器,漏了這句就會報錯,顯示there is no default constructor available
        System.out.println("ballGame is coming!");
        super.h = 3;//通路父類的屬性
    }
}
Game{
    int h;
    Game(int i){//構造函數
        System.out.println("this is a game!");
    }
    public static void printg(int d){//普通函數
        System.out.println("12");
    }
}
class ballGame extends Game{
​
    ballGame(int i){
        super(i);//調用父類的構造器,漏了這句就會報錯,顯示there is no default constructor available
        System.out.println("ballGame is coming!");
        super.h = 3;//通路父類的屬性
    }
}
           

super可以用于通路父類定義的屬性,用于調用父類中的成員方法,super代表父類的記憶體空間。可以通路父類的父類

class Game{
    int h;
    Game(int i){//構造函數
        System.out.println(i);//輸出
        System.out.println("第一層");
    }
    public static void printg(int d){//普通函數
        System.out.println("1");
    }
}
class ballGame extends Game{
    ballGame(int i){
        super(i);//調用父類的構造器
        System.out.println("第二層");
        super.h = 2;//通路父類的屬性
    }
}
​
public class jichengSuper extends ballGame{
    jichengSuper(int b) {
        super(b);//調用的是上面父類的構造函數,将輸出3
        int a = super.h ;//将第二層裡的3指派給a
        System.out.println(a);//列印
    }
    public static void  main(String args[]){
        new jichengSuper(3);//這裡的3将代進去上面的構造函數jichengSuper中
        System.out.print("最後一層");
    }
​
}
/**
 *output:
 3
第一層
第二層
2
最後一層
 */
​
           
​
​      
  • 接口在實作的時候,在類中一定要實作接口的抽象方法
  • 而繼承不用,想要用哪個再用

others

可以有多個接口但是隻能有一個繼承。一般情況下,一個子類隻能繼承一個父類,這稱為“單繼承”,但有的情況下一個子類可以有多個不同的父類,這稱為“多重繼承”。在Java中,類的繼承隻能是單繼承,而多重繼承可以通過實作多個接口實作。