面試題:多型和方法過載
阿新 • • 發佈:2019-01-31
簡介
第一次看到這個面試題的時候,就感覺此題不簡單。考察對概念的領悟程度!!
- 多型:一個物件在不同場景表現的不同狀態叫做多型
- 方法過載:方法名稱相同,引數個數,引數型別,引數型別的順序。其中返回值和訪問許可權不能夠作為方法過載的要素。
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在中途不轉換的話,將會出現死迴圈狀態。