繼承和多型都是物件導向程式設計的特色。使用繼承可以在一個父類別的基礎上再建立一個子類,這個子類別不但擁有父類別已有的屬性和方法,還可以建立屬於自己的屬性和方法。由於子類別和父類別之間的關係,從而引出了方法重寫和方法重載的問題。方法重寫及方法重載在繼承和多態性方面的應用中會存在很多問題,這些概念很容易混淆,掌握重寫和重載的區別對學會使用多態的方式編寫程序、提高程序的可維護性奠定了基礎。
一、方法重寫(0veriding)
如何定義重寫:在Java程式中,類別的繼承關係可以產生一個子類,子類別繼承父類,它具備了父類所有的特徵,繼承了父類所有的方法和變數。子類別可以定義新的特徵,當子類別需要修改父類別的一些方法進行擴展,增大功能,程式設計者常常把這樣的一種操作方法稱為重寫,也叫稱為覆寫或覆蓋。重寫體現了Java優越
性,重寫是建立在繼承關係上,它使語言結構更加豐富。在Java中的繼承中,子類別既可以隱藏和存取父類別的方法,也可以覆寫繼承父類別的方法。在Java中覆寫繼承父類別的方法就是透過方法的重寫來實現的。
所謂方法的重寫是指子類別中的方法與父類別中繼承的方法有完全相同的返回值類型、方法名稱、參數個數以及參數類型。這樣,就可以實作父類別方法的覆寫。例如:下面的程式碼實作了方法的重寫。
class Person//定义父类 fpublic void print(){//父类中的方法 System.out.println( 父类Person的print方法! ); } } class Student extends Person//定义子类继承Person类 {public void print(){//方法的重写 System.out.println( 子类Student的print方法! ); } } public class 0verrideExampleO1 {public static void main(String args[]) {Student s=new Student(); S.print(); } }
運行結果:子類別Student的print方法!
可以看出,當子類別重寫了父類別中的print()方法後,使用S呼叫的是子類別的print()方法,父類別中的print()方法被覆寫了。也就是說,如果現在子類別將父類別中的方法重寫了,呼叫的時候肯定是呼叫被重寫過的方法,那麼如果現在一定要呼叫父類別中的方法該怎麼辦呢?此時,透過使用.. super關鍵就可以實現這個功能,super關鍵字可以從子類訪問父類中的內容,如果要訪問被重寫過的方法,使用“super.方法名(參數列表)”的形式調用。
例如:
Class Person {public void print () { System.out.println( 父类Person的print方法! ); } } class Student extends Person {public void print () { super.print(://访问父类中被子类覆写过的方法 System.out.println(" 子类Student的print方法!" ); } } public class OverrideExample02 {public static void main(String args[]) {Student s=new Student(); S.print(); } }
運行結果:父類Person的print方法!
子類Student的print方法!
如果要使用super關鍵字不一定要在方法重寫之後使用,
也可以明確地使用super關鍵字不一定要在方法重寫之後使用,
只是更明確的說,要從父類別中查找,就不在子類別中查找了。
二、重寫規則
在重寫方法時,需要遵循以下的規則:
(一) 父類別方法的參數清單必須完全與被子類別重寫的方法的參數清單相同,否則不能稱為重寫而是重載。 ..
(二) 父類別的回傳類型必須與被子類別重寫的方法回傳類型相同,否則不能稱為重寫而是重載。 ..
(三) Java中規定,被子類別重寫的方法不能擁有比父類別方法更嚴格的存取權限。存取權大小關係為:
編寫過Java程式的人就知道,父類別中的方法並不是在任何情況下都可以重寫的,當父類別中方法的存取權修飾符為private時,該方法只能被自己的類別訪問,不能被外部的類別訪問,在子類別是不能被重寫的。如果定義父類別的方法為public,在子類別定義為private,程式執行時就會報錯。例如:
class Person {public void print()(//public访问权限 System.out.println( "父类Person的print方法! "); } } Class Stedent extends Person {private void print()(//重写方法降低了访问权限,错误 System.out.println( "子类Student的print方法!" ); } }
同樣的道理,如果子類中創建了一個成員變量,而該變量和
三、方法重载(Overloading)
(一) 如何定义重载。方法的重写和重载只有一个字不同,很多初学者认为这两者十分相似,其实不然。方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。下面通过一个实例来分析。
重载的定义和使用方法。
Class Person { {String name; int age; void print(){ System.out.println("姓名:" +name+"年龄:" +age); } void print(String a,int b){ System.out.println("姓名:" +a+"年龄:"+b); void print(String a,int b,intC){ System.out.println("姓名:"+a+"年龄:" +b+"ID号:" +c); } void print(String a,int b,doubleC){ System.out.println("姓名:"+a+"年龄:" +b+"ID号:"+c); } } public class OverLoadExampleOL {publicstaticvoidmain(String args[]) {Personpl=newPerson(); p1.nanle="李明"; p1.age=22; p1.print(); p1.print("王小早",19); p1.print("金波",18,100325); p1.print("婉宁",25,110903); } }
在上面的程序中,可以看到Person类中有多个名为 void print的方法,这就是方法的重载。执行程序,运行结果如下:
姓名:李明年龄:22
姓名:王小早年龄:l9
姓名:金波年龄:18ID号:10 00325
姓名:婉宁年龄:25ID号:110903
在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根
据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型和.. (或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,
但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:
1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。..
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。
四、方法重写与方法重载的区别
通过上面例子的分析,我们可以将方法重写和重载的区别总
结成这样一个表格,如下:
五、结束语
在面向对象程序设计的思想中,类的继承和多态性主要就是体现在子类重写父类的方法。而构造方法的重载作为方法重载的一个典型特例,可以通过重载构造方法来表达对象的多种初始化行为。灵活的运用方法重写与方法重载,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。用好重写和重载
可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。