知識點
1、繼承
作用:提高代碼的重用性,繼承之后子類可以繼承父類中的屬性和方法
減少重復代碼
條件:子類和父類要滿足is a的邏輯關系,才能使用繼承。
如:蘋果 is a水果
語法:使用extends 連接子類和父類。子類 extends 父類
Java是單繼承,一個類只能繼承一個父類。
子類不能繼承父類私有的屬性,但是可以繼承父類屬性的GET/SET方法
super關鍵字:代表父類對象,可以調用父類的屬性,父類的方法,
子類對象在創建的時候,默認調用父類的無參構造方法。
二、abstract關鍵字 抽象
abstract可以修飾類和方法
1.抽象類
不能被實例化
2.abstract也可用於方法——抽象方法
抽象方法沒有方法體
抽象方法必須在抽象類里
抽象方法必須在子類中被實現,除非子類是抽象類
對應驗證訪問修飾符總結的代碼:
NUM.1 同包驗證:
1 package a; 2 public class A { 3 private String a="1"; 4 String b="2"; 5 protected String c="3"; 6 public String d="4"; 7 }
1 package a; 2 public class B { 3 public static void main(String[]args){ 4 A a=new A(); 5 System.out.println(a.b);//可以調用除用private修飾的之外所有的變量 6 } 7 }
NUM.2 不同包驗證:
1 package b; 2 /** 3 * 在這里要先進行導包,如果不這樣, 4 * 下面要想new A()就不行,new c()的意義在於建立一個子類方法, 5 * 從而觀察經private修飾過后的變量是否能在其子類中調用 6 */ 7 import a.A; 8 public class C extends A{ 9 public static void main(String[]args){ 10 A a=new A(); 11 C c=new C(); 12 //c作為子類是可以調用以private訪問修飾符修飾的c 13 //以及用public修飾的d 14 System.out.println(c.c); 15 System.out.println(c.d); 16 //而a作為new的父類,則因在不同包的原因而只能調用public修飾的d 17 System.out.println(a.d); 18 } 19 }
寫到這里,我突然想到java默認的調用方法是用無參的方法,如果有在調用時設定了參數就會使用有參構造方法,
此時不由想到父類和子類的代碼塊調用,於是我設計了以下代碼去進行測試
1 package day20190227; 2 public class Pet { 3 private String name; 4 private int health; 5 private int love; 6 public Pet(){ 7 System.out.println("父類的無參構造方法調用"); 8 } 9 public Pet(String name,int health,int love){ 10 System.out.println("父類的有參構造方法調用"); 11 this.name=name; 12 this.health=health; 13 this.love=love; 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 public int getHealth() { 22 return health; 23 } 24 public void setHealth(int health) { 25 this.health = health; 26 } 27 public int getLove() { 28 return love; 29 } 30 public void setLove(int love) { 31 this.love = love; 32 } 33 //輸出寵物信息 34 public String printInfo(){ 35 return "我的名字叫"+name+",健康值為"+health+",親密度為"+love; 36 } 37 }
1 package day20190227; 2 /** 3 * 狗類,繼承Pet類 4 * @author Administrator 5 * 6 */ 7 public class Dog extends Pet { 8 private String strain; 9 public Dog(){ 10 System.out.println("狗類無參構造方法調用"); 11 } 12 public Dog(String name,int health,int love,String strain) { 13 //super.printInfo();調用父類的方法 14 //super.name;調用父類的屬性 15 super(name,health,love);//調用父類構造方法,必須在第一行 16 System.out.println("狗類有參構造方法調用"); 17 this.strain = strain; 18 } 19 public String getStrain() { 20 return strain; 21 } 22 public void setStrain(String strain) { 23 this.strain = strain; 24 } 25 }
在設定好父類和子類的無參構造方法和有參構造方法后,我在其中分別加入了一段說明語句,而后再重新編輯了一個TestDogCon類用於測試;
1 package day20190227; 2 /** 3 * 有參&無參調用測試 4 * @author Administrator 5 * 6 */ 7 public class TestDogCon { 8 public static void main(String[] args) { 9 Dog dog=new Dog("小華",90,90,"拉布拉多犬"); 10 } 11 }
經測試發現當dog設定了數據時,顯示的都是
而當將new Dog()中的數據刪去后,顯示的則是
總結:在創建子類的對象時,Java虛擬機首先執行父類的構造方法,然后再執行子類的構造方法。
在多級繼承的情況下,將從繼承樹的最上層的父類開始,依次執行各個類的構造方法,這可以保證子類對象從所有直接或間接父類中繼承的實例變量都被正確的初始化。