1. 程式人生 > >面試題:多型和方法過載

面試題:多型和方法過載

簡介

第一次看到這個面試題的時候,就感覺此題不簡單。考察對概念的領悟程度!!

  • 多型:一個物件在不同場景表現的不同狀態叫做多型
  • 方法過載:方法名稱相同,引數個數,引數型別,引數型別的順序。其中返回值和訪問許可權不能夠作為方法過載的要素。
public class TestMianShi {
    public static void main(String[] args) {
        //第一波測試
        A a1=new A();
        test(a1);

        //第二波測試
        A a2=new B();
        test(a2);

        //第三波測試
B b1=new B(); test(b1); } public static void test(A a){ System.out.println("aaaaaaaaa"); } public static void test(B b){ System.out.println("bbbbbbbbb"); } } class A{ } class B extends A{ } /* 輸出結果: aaaaaaaaa aaaaaaaaa bbbbbbbbb */

解答:

方法的過載始終是靠物件外在的表現型別來進行過載的,和裡面到底是什麼東西沒有關係!!

繼續下一個測試:

package cn.domarvel.entitytest;

public class TestMianShi {
    public static void main(String[] args) {

        C c1=new C();
        test(c1);
    }
    public static void test(Object o){
        System.out.println("ooooooooo");
    }
    public static void test(A a){
        System.out.println("aaaaaaaaa"
); } public static void test(B b){ System.out.println("bbbbbbbbb"); } public static void test(C c){ System.out.println("ccccccccc"); } } class A{ } class B extends A{ } class C extends B{ }

我們都知道這裡將會輸出"ccccccccc",那麼下面呢??

package cn.domarvel.entitytest;

public class TestMianShi {
    public static void main(String[] args) {

        C c1=new C();
        test(c1);
    }
    public static void test(Object o){
        System.out.println("ooooooooo");
    }
    public static void test(A a){
        System.out.println("aaaaaaaaa");
    }
    public static void test(B b){
        System.out.println("bbbbbbbbb");
    }
}

class A{

}

class B extends A{

}
class C extends B{

}

好好想想,其實也不難,這裡將會輸出bbbbbbbbb

再來:

package cn.domarvel.entitytest;

public class TestMianShi {
    public static void main(String[] args) {

        C c1=new C();
        test(c1);
    }
    public static void test(Object o){
        System.out.println("ooooooooo");
    }
    public static void test(A a){
        System.out.println("aaaaaaaaa");
    }
}

class A{

}

class B extends A{

}
class C extends B{

}

最終輸出aaaaaaaaa。為什麼會這樣輸出呢??其實是當我們呼叫方法的時候,如果各個過載方法中找不到我們要的型別它將找父型別引數的方法,父型別方法沒有就找父父型別引數的方法。以此類推,這就是類的體系樹,過載將會通過類的體系樹呼叫各引數方法。

應用:

這裡寫圖片描述

注意這個service方法的呼叫,如果request和response在中途不轉換的話,將會出現死迴圈狀態。