1. 程式人生 > 其它 >Java方法重寫小筆記

Java方法重寫小筆記

一、重寫原則:兩同兩小一大

兩同:方法名相同,引數型別相同;

兩小:
子類返回型別小於等於父類方法返回型別;//注意:java5 及更早版本返回型別要一樣,java7 及更高版本可以不同

子類丟擲異常小於等於父類方法丟擲的異常;

一大:
子類訪問許可權大於等於父類方法訪問許可權。

重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫,方法名和形參都不能改變。即外殼不變,核心重寫!

重寫方法不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的異常。例如: 父類的一個方法申明瞭一個檢查異常 IOException,但是在重寫這個方法的時候不能丟擲 Exception 異常,因為 Exception 是 IOException 的父類,丟擲 IOException 異常或者 IOException 的子類異常。

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
    public void testException() throws Exception {
        throw new Exception();
    }
}
class Employee extends Person {
    String empID = "0000";

    public Employee(String id) {
        super(id);
        empID = id;
    }
    @Override
    public void testException() throws IOException {
        throw new IOException();
    }
}

訪問許可權不能比父類中被重寫的方法的訪問許可權更低。例如:如果父類的一個方法被宣告為 public,那麼在子類中重寫該方法就不能宣告為 protected。

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
    protected void testPermission() {
        System.out.println("i'm a paraent testPermission()");
    }
}
class Employee extends Person {
    String empID = "0000";

    public Employee(String id) {
        super(id);
        empID = id;
    }
    @Override
    public void testPermission() {
        System.out.println("i'm a child testPermission()");
    }
}

二、方法的重寫詳細規則

  • 引數列表與被重寫方法的引數列表必須完全相同。

  • 返回型別與被重寫方法的返回型別可以不相同,但是必須是父類返回值的派生類(java5 及更早版本返回型別要一樣,java7 及更高版本可以不同)。

    class Person {
        String name = "No name";
        public Person(String nm) {
            name = nm;
        }
        public Object testReturnType() {
            return 2;
        }
    }
    class Employee extends Person {
        String empID = "0000";
    
        public Employee(String id) {
            super(id);
            empID = id;
        }
        @Override
        public String testReturnType() {
            return "josua317";
        }
    }
    
  • 訪問許可權不能比父類中被重寫的方法的訪問許可權更低。例如:如果父類的一個方法被宣告為 public,那麼在子類中重寫該方法就不能宣告為 protected。

  • 父類的成員方法只能被它的子類重寫。

  • 宣告為 final 的方法不能被重寫。

    package com.joshua317;
    
    public class Main {
        private static final String MESSAGE="taobao";
        public static void main(String [] args) {
            new Employee("joshua317", "0002");
        }
    }
    
    class Person {
        String name = "No name";
        public Person(String nm) {
            name = nm;
        }
        final public void testFinal() {
            System.out.println("i'm a paraent testFinal()");
        }
    }
    class Employee extends Person {
        String empID = "0000";
    
        public Employee(String name, String id) {
            super(name);
            empID = id;
        }
        @Override
        public void testFinal() {
            System.out.println("i'm a child testFinal()");
        }
    }
    
  • 宣告為 static 的方法不能被重寫,但是能夠被再次宣告。
  • 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為 private 和 final 的方法。
  • 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為 public 和 protected 的非 final 方法。
  • 重寫的方法能夠丟擲任何非強制異常,無論被重寫的方法是否丟擲異常。但是,重寫的方法不能丟擲新的強制性異常,或者比被重寫方法宣告的更廣泛的強制性異常,反之則可以。
  • 構造方法不能被重寫。
  • 如果不能繼承一個類,則不能重寫該類的方法。