繼承關鍵字:
extends
Java只允許單繼承存在
不可以被繼承的東西:
1.private成員
體現了java的封裝特點,外部類只允許set()get()方法調用,若無set()方法,則類創建的對象, 只會在被創建時用構造方法賦值·,且只可賦值一次(每次用構造方法new出的對象地址均不同)
2.構造方法(構造方法不可以被繼承,只可以用super()調用)
3.子類與父類不在同包,使用默認訪問權限的成員
訪問修飾符總結:
private:只可以在本類調用,外部類訪問需要 get() 方法
默認(friendly):可在本類訪問,可在同包中可以訪問
protected:可在本類訪問,可在同包中可以訪問,可在不同包但為其子類的類中訪問
public:上述均可訪問,可在不同包不為其子類的類中訪問
子類創建對象原理:
子類所有的 構造函數 默認調用
父類的無參構造函數(其實是默認省略掉了一行代碼:super(););省略掉的這行super()代碼可以自行添加到構造函數的第一行(必須是第一行,否則報錯)
若子類調用父類的有參構造寫法為:super( 類型 參數)
父類:person
public class Person { int num = 0; Person(){} Person(int num){ this.num = num; System.out.println("傳入人數"+num+"\t父類人數"+this.num); } public void print(){ System.out.println("執行父類類方法"); } }
子類:student
public class Student extends Person{ int num = 0; String name = null; public Student(){} public Student(int num,String name){ super(num); super.print(); this.name = name; System.out.println("子類人數"+num); System.out.println("父類人數"+super.num); } }
測試類:
public class Test { public static void main(String[] args) { Student student = new Student(99,張三); student.print(); } }
當執行 Student student = new Student(99)時,內部執行順序為:
1.利用父類 int num = 0;開辟空間此時Person.num=0 但傳入的num為99;Person.num與num並不指向一個空間
2.執行父類構造方法this.num = num;此時num為99,但是Person.num一直為0
3.然后執行子類的屬性
4.接着執行子類構造方法
以上過程在子類輸出super.num 均為99
在父類輸出num為99,輸出this.num為99
因為這時子類創建對象開辟的空間是包含父類開辟的空間的
如圖所示:
同時,在初始化該子類對象(student)時,
會同時創建三個對象(創建父類對象與Object對象),在java中所有的類都有一個父類,如果你的類不繼承任何類,java會自動讓它繼承Object類