標籤:崩潰 顯示 正是 參數 類方法 之間 pre 報錯 其他
super關鍵字
一、概念引入。
1.假如你在某個公司工作,這個公司中經理的待遇與普通員工的待遇存在一些差異。不過,他們之間也存在很多相同的地方,例如,他們都能領取薪水。只是普通員工在完成本職任務以後僅領取薪水,而經理在完成了預期的業績之後還能領到獎金。下面用部分代碼錶示這段資訊。
1 public class Manager extends Employee{2 //這裡增加一個用於儲存獎金資訊的域,以及設定這個域的新方法3 private double bonus;4 public void setBonus(double bonus){5 this.bonus=bonus;6 }7 }
2.覆蓋方法。
由於超類中的有些方法對子類Manager並不一定適用。Manager類中的getSalary方法應該返回的是薪水與獎金的總和。為此,需要提供一個新的方法來覆蓋父類中的這個方法:
1 public class Manager extends Employee{2 //******3 public double getSalary(){4 //****** 5 }6 }
假如要實現這個方法似乎只要返回salary和bonus域的總和就可以了:
1 public class Manager extends Employee{2 //******3 public double getSalary(){4 return salary+bonus;5 }6 }
然而,這個方法並不能運行。因為Manager類的getSalary方法不能夠直接存取超類的私人域。也就是說,儘管每個Manager對象都擁有一個名為salary的域,但在Manager類的getSalary方法中並不能夠直接存取salary域。只有Employee類的方法才能夠訪問私人部分。如果Manager類的方法一定要訪問私人域,就必須藉助與公有的介面,,Employee類中的共有方法getSalary正是這樣一個介面。
1 public class Manager extends Employee{2 //******3 public double getSalary(){4 double baseSalary=getSalary();5 return basesalary+bonus;6 }7 }
但是這樣的代碼會導致無限次地調用自己,知道程式崩潰。
總結:我們希望調用超類Employee中的getSalary方法,而不是當前類的這個方法。為此,可以使用特定的關鍵字super解決這個問題。
二、super作用簡單介紹。
1.super()從子類中調用父類的構造方法。
2.在子類中訪問父類被屏蔽的方法或屬性。
結合第一點Employee類中的getSalary方法。下面是Manager類中getSalary方法的正確書寫格式:
1 public class Manager extends Employee{2 //******3 public double getSalary(){4 double baseSalary=super.getSalary();5 return basesalary+bonus;6 }7 }
子類中可以增加減域或覆蓋超類的方法,然而絕對不能刪除繼承的任何域和方法。
三、請允許我又扯回構造器。
1 public class Manager extends Employee{ 2 //****** 3 private double bonus; 4 public double getSalary(){ 5 double baseSalary=super.getSalary(); 6 return basesalary+bonus; 7 } 8 public Manager(String name,double salary,int year,int month,int day){ 9 super(name,salary,year,month,day);10 bonus=0;11 }12 }
由於Manager類的構造器不能訪問Employee類的私人域,所以必須利用Employee類的構造器對這部分進行初始化,我們可以通過super實現對超類的調用。使用super調用構造器的語句必須是子類構造器的第一條語句。
如果子類的構造器沒有顯示地調用超類的構造器,則將自動地調用超類預設(沒有參數)的構造器。如果超類沒有不帶參的構造器,並且在子類的構造器中又沒有顯示地調用超類地其他構造器,則java編譯會報錯。
四、super與this的比較。
有些人認為super與this引用是類似的概念,實際上,這樣比較並不恰當。這是因為super不是一個對象的引用,不能將super賦給另一個物件變數,他只是一個指示編譯器調用超類方法的特殊關鍵字。
關鍵字this有兩個用途:一是調用隱式參數,二是調用該類其他的構造器(like this,【this("李四",18)】)。
關鍵字super也有兩個用途:一是調用超類的方法,二是調用超類的構造器。
在調用構造器的時候,這兩個關鍵字的使用方式很相似。調用構造器的語句只能作為另一個構造器的第一條語句出現。構造參數既可以傳遞給本類的其他構造器,也可以傳遞給超類的構造器。
五、注意點。
1.super()從子類中調用父類的構造方法,this()在同一類內調用其它構造方法。
2.this()和super()不能同時出現在一個建構函式裡面。
3.super()和this()均需放在構造方法內第一行。
4.this()和super()都指的是對象,所以,均不可以在static環境中使用。
java隨筆:super關鍵字