Override(重寫)是子類與父類的一種多態性體現。
Override容許子類改變父類的一些行爲。
爲何須要Override:當父類不知足子類的一些要求時咱們就須要子類對父類的一些行爲進行重寫。
例如:某公司裏的員工的電話號碼不容許對外公開,而銷售人員(員工)的電話號碼則須要對外公開。
這時咱們就能夠這樣作: ide
- public class Employee {
-
- private String mobile;
-
- public Employee(String mobile) {
- this.mobile = mobile;
- }
-
- protected String showMess(){
- return "電話號碼:"+mobile;
- }
- }
員工類的showMess方法是protected的,因此位於其餘包的對象是訪問不到的。
而後定義一個銷售人員的類(Sales),並繼承Employee類 this
- public class Sales extends Employee{
-
-
- private String msn;
-
- public Sales(String mobile,String msn) {
- super(mobile);
- this.msn = msn;
- }
-
- @Override
- public String showMess() {
- return super.showMess()+"==msn:"+this.msn;
- }
- }
注意這時被覆蓋的showMess方法的訪問級別是public,能夠被任何其餘對象訪問到。
關於Override有幾點要注意的地方:
1.被覆蓋方法的訪問控制級別能夠不同。
例如上例父類的showMess方法的訪問級別爲protected的,而子類覆蓋的showMess方法訪問級別則爲public的。
但子類的訪問級別必需要高於父類被覆蓋方法的訪問級別,若是父類是public的而子類是protected的則是錯誤的。
2.方法被定義爲private或static或final的則不能被覆蓋。
3.方法的返回類型:子類的返回類型能夠是更具體的對象,例如能夠將Employee類的返回類型改成Object也正確。而倒過來則錯誤。
4.在方法調用時先會在子類中找覆蓋的方法,若是子類中沒有則會在父類中去找。 spa
- public class Parent {
-
- private int num(int i,int j){
- return i+j;
- }
-
- public static void main(String[] args) {
- Parent p = new Child();
- System.out.println(p.num(1, 2));
- }
- }
- class Child extends Parent{
-
- public int num(int x,int y){
- return x-y;
- }
- }
這段代碼的執行結果爲何呢?若是你回答-1則錯了,正確答案是3。
爲何呢?由於父類的num方法是private的,因此不能被覆蓋,因此子類的num方法不是一種Override,所以在子類找不到被覆蓋的num方法就會執行父類的num方法。因此結果輸出爲3.
對象
- public class Parent {
-
- public int test(){
-
- return num(1,2);
- }
-
- protected int num(int i,int j){
- return i+j;
- }
-
- public static void main(String[] args) {
- Parent p = new Child();
- System.out.println(p.test());
- }
-
- }
- class Child extends Parent{
-
- public int num(int x,int y){
- return x-y;
- }
- }
那麼這段代碼的執行結果是-1,由於父類test方法調用的是子類的num方法。 繼承