最近學習繼承,從書中看到子類繼承父類,子類擁有父類所有的屬性和方法,於是使用程序去驗證,發現父類的私有屬性和私有方法,子類是不能訪問的,當然一些父類的私有屬性可能可以通過相應的方法訪問到,但是私有的方法似乎不能簡單的訪問,這里暫不考慮Java反射機制,於是我分析,子類不能繼承父類私有的屬性及方法,但是分析了內存后,我發現我是錯的,在一個子類被創建的時候,首先會在內存中創建一個父類對象,然后在父類對象外部放上子類獨有的屬性,兩者合起來形成一個子類的對象。所以所謂的繼承使子類擁有父類所有的屬性和方法其實可以這樣理解,子類對象確實擁有父類對象中所有的屬性和方法,但是父類對象中的私有屬性和方法,子類是無法訪問到的,只是擁有,但不能使用。就像有些東西你可能擁有,但是你並不能使用。所以子類對象是絕對大於父類對象的,所謂的子類對象只能繼承父類非私有的屬性及方法的說法是錯誤的。可以繼承,只是無法訪問到而已。
當子類覆蓋父類的成員變量時,父類方法使用的是父類的成員變量,子類方法使用的是子類的成員變量
(1)子類覆蓋父類的方法,必須有同樣的參數返回類型,否則編譯不能通過
(2)子類覆蓋父類的方法,在jdk1.5后,參數返回類可以是父類方法返回類的子類
(3)子類覆蓋父類方法,可以修改方法作用域修飾符,但只能把方法的作用域放大,而不能把public修改為private
(4)子類方法能夠訪問父類的protected作用域成員,不能夠訪問默認的作用域成員
(5)子類的靜態方法不能隱藏同名的父類實例方法
不能繼承,子類只能在父類中寫一個public的getXXX的方法來獲取父類中的private屬性,子類就調用父類的getXXX來獲取private屬性
父類中的公有方法和域(屬性),在類繼承中將會被子類繼承,但是私有的將不能被繼承。
那么在繼承中子類如何才能繼承到父類的私有域呢?
答案是:在子類的構造方法中通過super()方法調用父類的構造方法。
也就是,在構造子類的同時,為子類構造出跟父類相同的域。如此就在子類的對象中,也擁有了父類聲明的域了。
並且我們也應該這樣做。
- public class Person{
- private String name;
- public Person(String name){
- this.name = name;
- }
- public void setName(String name){
- this.name = name;
- }
- public String getName(){
- return name;
- }
- }
- public class Student extends Person{
- public Student(String name){
- super(name);
- }
- }
- public class TestStudent{
- public static void main(String[] args){
- Student mStudent = new Student("abc");
- String mName = mStudent.getName();
- System.out.println("Name is : " + mName);
- mStudent.setName("efg");
- mName = mStudent.getName();
- System.out.println("Name is : " + mName);
- }
- }
打印結果為:
Name is : abc
Name is efg
