方法的繼承與屬性的繼承有很大的不同,屬性任何繼承方式均可,而方法則有各種限制,於是在這里做了一個簡單的總結:
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()"); }*/ } //總結,靜態與實例之間不能相互轉換
