java繼承方法規則或規律


方法的繼承與屬性的繼承有很大的不同,屬性任何繼承方式均可,而方法則有各種限制,於是在這里做了一個簡單的總結:

1、修飾符相同的方法覆蓋,即只改內部,不改外部

2、訪問權限不同的方法覆蓋,子類只能相對父類越來越寬松,例如父類是public,子類就不能是缺省或protect,private

3、返回值的類型覆蓋,只允許相容的返回類型,例如不能將返回值為int型改為double型,但是復合類型則例外

4、final的方法覆蓋,只能是父類無,子類有,而不能是父類有,子類無

5、static(靜態)的方法覆蓋不能有任何變動,即父類有,子類必須有,父類無,子類也必須無

實例如下:

父類:

 

package ExtendMethod;

public class CommonMethod {
    protected int x=100;
    public int getX() {//定義一個普通返回值的實例方法
        return x;
    }
    public CommonMethod getObject() {//定義一個返回復合類型的方法
        return new CommonMethod();
    }
    public final void setX(int ix) {
        x=ix;
    }
    protected  void proShowMsg() {//定義一個具有保護權限的方法
        System.out.println("this is protected ShowMsg() in Common class");
    }
    
    public void pubShowMsg() {//定義一個具有公共訪問權限的方法
        System.out.println("this is public showMsg() in Common class");
    }
    static public void stShowMsg() {//定義一個靜態方法
        System.out.println("this is static showMsg() in Common class");
    }
}

 

一、修飾符相同的可以任意覆蓋:

public class OverrideMember_1 extends Common{
    //覆蓋父類中的同名實例方法
    public void pubShowMsg() {
        System.out.println("this is public showMsg in derive class");
    }
    //覆蓋父類中的同名靜態方法
    static public void stShowMsg() {
        System.out.println("this is static showMsg() in derive class");
    }
    //可以任意覆蓋
    public static void main(String args[]) {
        OverrideMember_1 oa =new OverrideMember_1();
        oa.pubShowMsg();
        oa.proShowMsg();
    }
}

二、訪問權限不同的覆蓋,只能越來越寬松,private——>public的方向

public class OverrideMember_2 extends Common{
    public void proShowMsg() {//覆蓋父類中的protect方法,public > protect,正確
        System.out.println("this is public ShowMsg()");
    }
    /*protected void pubShowMsg() {//權限越來越嚴格,錯誤,protect < public
        System.out.println("this is protect ShowMsg()");
    }*/
}

三、返回值類型的覆蓋

public class OverrideMember_3 extends Common {
    //覆蓋getX()方法,但返回的數據類型不同,原方法是int型,錯誤
    /*public double getX() {
        return (double)x;
    }*/
    //覆蓋getObject(),返回類型相容,正確,原方法的返回類型是新common對象,復合類型
    public OverrideMember_3 getObject() {
        return new OverrideMember_3();
    }
}

四、final的方法覆蓋,只能從無到有,不能從有到無

public class OverrideMember_4 extends Common{
    //覆蓋getX()方法,並將其指定為最終方法,正確,原方法為public int getX()
    public final int  getX() {
        return x;
    }
    //覆蓋最終方法,錯誤,原方法為 public final void setX()
    /*public void setX(int ix) {
        x=ix;
    }*/
}

五、static不能有任何改變

public class OverrideMember_5 extends Common{
    //試圖覆蓋實例方法,將其改為靜態方法,錯誤,原型為 public void pubShowMsg()
    /*public static void pubShowMsg() {
        System.out.println("this is public ShowMsg()");
    }*/
    //試圖覆蓋靜態方法,並將其指定為實例方法,錯誤
    /*public void stShowMsg() {
        System.out.println("this is static ShowMsg()");
    }*/
}
//總結,靜態與實例之間不能相互轉換

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM