<tbody id="5vw1z"></tbody>
<rp id="5vw1z"></rp>
  •  

    繼承的概念

    繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。

    繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

    生活中的繼承:

    Java 繼承

    兔子和羊屬于食草動物類,獅子和豹屬于食肉動物類。

    食草動物和食肉動物又是屬于動物類。

    所以繼承需要符合的關系是:is-a,父類更通用,子類更具體。

    雖然食草動物和食肉動物都是屬于動物,但是兩者的屬性和行為上有差別,所以子類會具有父類的一般特性也會具有自身的特性。

    類的繼承格式

    在 Java 中通過 extends 關鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:

    class 父類 {
    }
     
    class 子類 extends 父類 {
    }

    為什么需要繼承

    接下來我們通過實例來說明這個需求。

    開發動物類,其中動物分別為企鵝以及老鼠,要求如下:

    • 企鵝:屬性(姓名,id),方法(吃,睡,自我介紹)
    • 老鼠:屬性(姓名,id),方法(吃,睡,自我介紹)

    企鵝類:

    public class Penguin { 
        private String name; 
        private int id; 
        public Penguin(String myName, int  myid) { 
            name = myName; 
            id = myid; 
        } 
        public void eat(){ 
            System.out.println(name+"正在吃"); 
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction() { 
            System.out.println("大家好!我是"         + id + "號" + name + "."); 
        } 
    }

    老鼠類:

    public class Mouse { 
        private String name; 
        private int id; 
        public Mouse(String myName, int  myid) { 
            name = myName; 
            id = myid; 
        } 
        public void eat(){ 
            System.out.println(name+"正在吃"); 
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction() { 
            System.out.println("大家好!我是"         + id + "號" + name + "."); 
        } 
    }

    從這兩段代碼可以看出來,代碼存在重復了,導致后果就是代碼量大且臃腫,而且維護性不高(維護性主要是后期需要修改的時候,就需要修改很多的代碼,容易出錯),所以要從根本上解決這兩段代碼的問題,就需要繼承,將兩段代碼中相同的部分提取出來組成 一個父類:

    公共父類:

    public class Animal { 
        private String name;  
        private int id; 
        public Animal(String myName, int myid) { 
            name = myName; 
            id = myid;
        } 
        public void eat(){ 
            System.out.println(name+"正在吃"); 
        }
        public void sleep(){
            System.out.println(name+"正在睡");
        }
        public void introduction() { 
            System.out.println("大家好!我是"         + id + "號" + name + "."); 
        } 
    }

    這個Animal類就可以作為一個父類,然后企鵝類和老鼠類繼承這個類之后,就具有父類當中的屬性和方法,子類就不會存在重復的代碼,維護性也提高,代碼也更加簡潔,提高代碼的復用性(復用性主要是可以多次使用,不用再多次寫同樣的代碼) 繼承之后的代碼:

    企鵝類:

    public class Penguin extends Animal { 
        public Penguin(String myName, int myid) { 
            super(myName, myid); 
        } 
    }

    老鼠類:

    public class Mouse extends Animal { 
        public Mouse(String myName, int myid) { 
            super(myName, myid); 
        } 
    }

    繼承類型

    需要注意的是 Java 不支持多繼承,但支持多重繼承。

    繼承類型

    繼承的特性

    • 子類擁有父類非 private 的屬性、方法。
    • 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
    • 子類可以用自己的方式實現父類的方法。
    • Java 的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如 B 類繼承 A 類,C 類繼承 B 類,所以按照關系就是 B 類是 C 類的父類,A 類是 B 類的父類,這是 Java 繼承區別于 C++ 繼承的一個特性。
    • 提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系越緊密,代碼獨立性越差)。

    繼承關鍵字

    繼承可以使用 extendsimplements 這兩個關鍵字來實現繼承,而且所有的類都是繼承于 java.lang.Object,當一個類沒有繼承的兩個關鍵字,則默認繼承object(這個類在?java.lang?包中,所以不需要?import)祖先類。

    extends關鍵字

    在 Java 中,類的繼承是單一繼承,也就是說,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。

    public class Animal { 
        private String name;   
        private int id; 
        public Animal(String myName, String myid) { 
            //初始化屬性值
        } 
        public void eat() {  //吃東西方法的具體實現  } 
        public void sleep() { //睡覺方法的具體實現  } 
    } 
     
    public class Penguin extends Animal{ 
    }

    implements關鍵字

    使用 implements 關鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時繼承多個接口(接口跟接口之間采用逗號分隔)。

    public interface A {
        public void eat();
        public void sleep();
    }
     
    public interface B {
        public void show();
    }
     
    public class C implements A,B {
    }

    super 與 this 關鍵字

    super關鍵字:我們可以通過super關鍵字來實現對父類成員的訪問,用來引用當前對象的父類。

    this關鍵字:指向自己的引用。

    實例

    class Animal {
      void eat() {
        System.out.println("animal : eat");
      }
    }
     
    class Dog extends Animal {
      void eat() {
        System.out.println("dog : eat");
      }
      void eatTest() {
        this.eat();   // this 調用自己的方法
        super.eat();  // super 調用父類方法
      }
    }
     
    public class Test {
      public static void main(String[] args) {
        Animal a = new Animal();
        a.eat();
        Dog d = new Dog();
        d.eatTest();
      }
    }

    輸出結果為:

    animal : eat
    dog : eat
    animal : eat

    final關鍵字

    final 關鍵字聲明類可以把類定義為不能繼承的,即最終類;或者用于修飾方法,該方法不能被子類重寫。

    聲明類:

    final class 類名 {//類體}

    聲明方法:

    修飾符(public/private/default/protected) final 返回值類型 方法名(){//方法體}

    注:實例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 類的方法自動地聲明為 final,但是實例變量并不是 final

    構造器

    子類是不繼承父類的構造器(構造方法或者構造函數)的,它只是調用(隱式或顯式)。如果父類的構造器帶有參數,則必須在子類的構造器中顯式地通過?super?關鍵字調用父類的構造器并配以適當的參數列表。

    如果父類構造器沒有參數,則在子類的構造器中不需要使用?super?關鍵字調用父類構造器,系統會自動調用父類的無參構造器。

    class SuperClass {
      private int n;
      SuperClass(){
        System.out.println("SuperClass()");
      }
      SuperClass(int n) {
        System.out.println("SuperClass(int n)");
        this.n = n;
      }
    }
    // SubClass 類繼承
    class SubClass extends SuperClass{
      private int n;
      
      SubClass(){ // 自動調用父類的無參數構造器
        System.out.println("SubClass");
      }  
      
      public SubClass(int n){ 
        super(300);  // 調用父類中帶有參數的構造器
        System.out.println("SubClass(int n):"+n);
        this.n = n;
      }
    }
    // SubClass2 類繼承
    class SubClass2 extends SuperClass{
      private int n;
      
      SubClass2(){
        super(300);  // 調用父類中帶有參數的構造器
        System.out.println("SubClass2");
      }  
      
      public SubClass2(int n){ // 自動調用父類的無參數構造器
        System.out.println("SubClass2(int n):"+n);
        this.n = n;
      }
    }
    public class TestSuperSub{
      public static void main (String args[]){
        System.out.println("------SubClass 類繼承------");
        SubClass sc1 = new SubClass();
        SubClass sc2 = new SubClass(100); 
        System.out.println("------SubClass2 類繼承------");
        SubClass2 sc3 = new SubClass2();
        SubClass2 sc4 = new SubClass2(200); 
      }
    }

    輸出結果為:

    ------SubClass 類繼承------
    SuperClass()
    SubClass
    SuperClass(int n)
    SubClass(int n):100
    ------SubClass2 類繼承------
    SuperClass(int n)
    SubClass2
    SuperClass()
    SubClass2(int n):200

    「點點贊賞,手留余香」

    0

    給作者打賞,鼓勵TA抓緊創作!

    微信微信 支付寶支付寶

    還沒有人贊賞,快來當第一個贊賞的人吧!

    聲明:
    1. 本站所有文章教程及資源素材均來源于網絡與用戶分享或為本站原創,僅限用于學習和研究。
    2. 如果內容損害你的權益請聯系客服QQ:1642748312給予處理。
    碼云筆記 » 30. Java 中的繼承

    發表回復

    IT互聯網行業相關廣告投放 更專業 更精準

    立即查看 聯系我們
    亚洲 自拍 另类小说综合图区