一.繼承
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 }
子類:

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 }
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 }
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
六.final關鍵字
final class:該類沒有子類(public final class;final public class);
final 方法:該方法不允許被子類重寫,但是可以被子類正常繼承使用;
final 方法內局部變量:只要在具體被使用之前進行賦值即可,一旦賦值,不能進行修改;
final 類中成員屬性:賦值場景:1.定義直接初始化;2.構造方法;3.構造代碼塊;
構造方法不允許用final修飾。
注:
基本數據類型的變量:初始賦值后不能被修改
引用數據類型:初始化之后不能在指向另一個對象,但對象的內容是可以變的;
final可以和static配合使用(方法,變量):通過final修飾可以提高性能,但會減低擴展性
七.注解介紹