java隨筆:super關鍵字

來源:互聯網
上載者:User

標籤:崩潰   顯示   正是   參數   類方法   之間   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關鍵字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.