方法重載的要求就是兩個同一不同:同一個類中方法名相同,參數列表不同。至於方法的其他部分,如方法返回值類型、修飾符等,與方法重載沒有任何關係。
爲什麼方法返回值類型不能用於區分重載的方法?
對於int f(){} 和 void f(){}兩個方法,如果這樣調用 int result = f();系統可以識別時調用返回值類型爲int的方法,但是Java調用方法時可以忽略方法的返回值,如果採用如下方法來調用f();你能判斷是調用哪個方法嗎?如果你尚且不能判斷,那麼Java系統也會糊塗,系統一糊塗,那肯定是你錯了。
- public class Varargs{
- public static void test(int a,String... books){
- for(String book : books){
- System.out.println(book);
- }
- }
- }
如果同一個類定義了test(String... books)和test(String book)方法,如果只傳入一個參數,系統會執行重載test(String book)方法,如果需要調用test(String... books)方法,又只想傳入一個字符串數組,則可以採用傳入字符串數組的形式
test(new String[]{"aaa"});
一般不推薦重載形參長度可變的方法。沒有意義,降低了可讀性
二、多態
相同類型的變量,調用同一個方法呈現出多種不同的行爲特徵,這就是多態
- package com.hb.lucence.test;
- public class BaseClass {
- public int book = 7;
- public void base(){
- System.out.println("父類的普通方法");
- }
- public void test(){
- System.out.println("父類的被覆蓋的方法");
- }
- }
- package com.hb.lucence.test;
- import org.junit.Test;
- public class SubClass extends BaseClass{
- public String book = "我是一本書";
- public void test(){
- System.out.println("子類覆蓋父類的方法");
- }
- public void sub(){
- System.out.println("子類普通方法");
- }
- @Test
- public void classtest(){
- BaseClass bc = new BaseClass();
- System.out.println(bc.book);//7
- bc.base();//父類的普通方法
- bc.test();//父類的被覆蓋的方法
- System.out.println("---------------------");
- SubClass sc = new SubClass();
- System.out.println(sc.book);//我是一本書
- sc.sub();//子類普通方法
- sc.test();//子類覆蓋父類的方法
- System.out.println("---------------------");
- BaseClass polymorphic = new SubClass();
- System.out.println(polymorphic.book);//7
- polymorphic.test();//子類覆蓋父類的方法
- }
- }
與方法不同的是,對象的Field則不具備多態。
引用變量在編譯階段只能調用其編譯時類型所具有的方法,但是運行時則執行它運行時類型具有的方法。因此,編寫java代碼時,引用變量只能調用聲明改變量時所用類裏包含的方法。例如,通過Object p = new Person()代碼定義了一個變量P,則這個P只能調用Object類的方法,而不能調用Person類裏定義的方法。
通過引用變量來訪問其包含的實例Field時,系統總是試圖訪問它編譯時類型所定義的Field,而不是他運行時候類型所定義的Field。