Java繼承


一.繼承

  1.簡介:

 

  特點:利於代碼復用;縮短開發周期。注:子類不能直接訪問父類的私有屬性

滿足“A is a B”的關系就可以形成繼承關系

  例:

    父類:

 1 package com.swpu.animals;
 2 
 3 public class Animal {
 4     //屬性
 5     private String name;
 6     private int month;
 7     private String species;
 8     public String getName() {
 9         return name;
10     }
11     public void setName(String name) {
12         this.name = name;
13     }
14     public int getMonth() {
15         return month;
16     }
17     public void setMonth(int month) {
18         this.month = month;
19     }
20     public String getSpecies() {
21         return species;
22     }
23     public void setSpecies(String species) {
24         this.species = species;
25     }
26     
27     public void eat(){
28         System.out.println("吃東西了");
29     }
30 
31 }
View Code

     子類:

 1 package com.swpu.animals;
 2 
 3 public class Dog extends Animal {
 4     private int weight;
 5     public void setWeight(int weight){
 6         this.weight=weight;
 7     }
 8     public int getWeight(){
 9         return this.weight;
10     }
11     public void run(){
12         System.out.println("我是名叫"+this.getName()+"的"+this.getSpecies()+"在奔跑");
13     }
14 
15 }
View Code

   2.方法重寫:

      語法規則:返回值類型,方法名,參數類型、順序、個數都要和父類繼承的方法相同。

      注:方法重寫必須要在有繼承關系的子類中;

        方法名相同,參數列表相同(參數順序,個數,類型),方法返回值相同(可以允許是子類類型【向下兼容】);

        方法的訪問修飾符是可以允許有變化的,但是訪問范圍要大於等於父類的訪問范圍;

        方法的重寫與方法的參數名無關;

        在Java中僅限方法重寫,無屬性重寫,但是在子類中,可以定義與父類重名的屬性的。

      子類重寫了父類的方法后,子類對象調用的是重寫后的方法。

二.訪問修飾符的分類與作用

  private:只允許在本類中進行訪問;

  public:允許在任意位置訪問;

  protected:允許在當前類,同包子類/非子類,跨包子類訪問,跨包非子類不允許;

  默認:允許在當前類,同包子類/非子類;跨包子類/非子類不允許調用

 三.super關鍵字:父類對象的引用

  注:Python中super()是一個函數,並不是直接調用父類,而是根據MRO算法的調用順序。

    對比Python的繼承初始化順序(未調用super):父類的靜態成員——>子類靜態成員——>子類構造(實例化不會調用父類構造,調用super函數會遵照MRO【Pythoh3后是C3】算法的順序調用)【注:如果是多繼承則按照每個繼承從父類往低層的順序】

 

  1.Java中的super:

    訪問父類成員方法:super.print();

    訪問父類屬性:super.name;

    訪問父類構造方法:super()

    Java中利用super關鍵字調用父類的方法和屬性

    父類的構造方法不允許被繼承,不允許被重寫,但是會影響子類對象的實例化(子類構造默認調用的是父類的無參構造

  2.繼承的初始化順序:

    父類的靜態成員(多個父類,從最頂層父類按順序執行【注訪問修飾符不影響成員的加載順序,跟書寫位置有關】)——>子類靜態成員——>父類對象構造——>子類對象構造

    注:子類構造默認調用的是父類的無參構造,可以通過super()調用父類允許被訪問的其他構造方法【必須放在子類有效構造方法的第一行】

    

 

  注意:

三.super和this對比

  注:構造方法調用時,super和this不能同時出現(都要在第一行)

四.方法重寫和方法重載的對比

 五.Object類

  1.Object中常用的方法:

    1.1equals方法:

      equals():直接繼承Object中的equals()方法時,比較的是兩個引用是否指向的是同一個對象(相當於Python中的is);

      子類可以通過重寫equals方法的形式,改變比較的內容;

      如果是String中的equals(重寫了Object中的equals,判斷的是兩個值是否相等)

    重寫equals:

 1 package com.swpu.test;
 2 import com.swpu.animals.Animal;
 3 
 4 public class Test3 {
 5     public static void main(String[] args){
 6     Animal one=new Animal("哈哈",20);
 7     Animal two=new Animal("哈哈",20);
 8     boolean flag=one.equals(two);
 9     //==判斷的是是否是同一空間
10     System.out.println("one 和  two的引用比較:"+flag);
11     System.out.println("one 和two 的引用比較:"+(one==two)); 
12     String str1=new String("hello");
13     String str2=new String("hello");
14     boolean flag2=str1.equals(str2);
15     System.out.println("str1 和  str2的引用比較:"+flag2);
16     System.out.println("str1 和str2 的引用比較:"+(str1==str2)); 
17     /**
18      * 輸出:
19      *  one 和  two的引用比較:false
20         one 和two 的值比較:false
21         str1 和  str2的引用比較:true
22         str1 和str2 的值比較:false
23      */
24 
25     }
26     
27 
28 }
View Code

     1.2toString方法:

      輸出對象時,默認自動調用toString方法,相當於Python的__repr__或__str__魔法函數;

      繼承Object中的toString方法時,輸出對象的字符串表現形式為:類型信息+@+地址信息(通過hash計算)【如:com.swpu.animals.Animal@15db9742】

    重寫toString方法: 

1 //重寫toString方法
2     public String toString(){
3         return "姓名:"+this.getName()+"月份:"+this.getMonth();
4     }
5     
View Code

 六.final關鍵字

  final class:該類沒有子類(public final class;final public class);

  final 方法:該方法不允許被子類重寫,但是可以被子類正常繼承使用;

  final 方法內局部變量:只要在具體被使用之前進行賦值即可,一旦賦值,不能進行修改;

  final 類中成員屬性:賦值場景:1.定義直接初始化;2.構造方法;3.構造代碼塊;

  構造方法不允許用final修飾。

  注:

    基本數據類型的變量:初始賦值后不能被修改

    引用數據類型:初始化之后不能在指向另一個對象,但對象的內容是可以變的;

    final可以和static配合使用(方法,變量):通過final修飾可以提高性能,但會減低擴展性

 七.注解介紹

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM