java函数重载简单问题体现继承问题

public String testFun(String s)
    {
        System.out.println("String String");
        return "";
    }
    
    public void testFun(Object o)
    {
        System.out.println("object void");
    }


T.testFun("123");会调用第一个方法
问题:“123”也是Object类型的啊,为什么不会调用下面的方法?
回答:
因为Object是所有类的父类,所以这里如果你传入字符串的话,相当于覆盖了父类中的方法,只会调用 子类的方法,如果你传入一个整型的话,那么在子类中就找不到这个方法
,就会在父类中去找,就会调用第二个方法。



另一个,预先不确定的实参类型引起的错误。

先考虑下面代码的输出:

  1. public class JavaPuzzles {  
  2.     public static void main(String[] args) {  
  3.         JavaPuzzles.printObj(null);  
  4.     }  
  5.       
  6.     public static void printObj(double[] array){  
  7.         System.out.print("double array");  
  8.     }  
  9.       
  10.     public static void printObj(Object obj){  
  11.         System.out.println("Object");  
  12.     }  
  13. }  

    输出结果:double array ,我们来分析一下。 JAVA函数重载调用一般分为两个步骤:

    1、找到所有可用的方法或构造器。 从上面的示例中,我们找到两个,参数类型分别为:double[] 和 Object

    2、从1中根据参数类型选择最精确的方法或构造器进行调用。对于null我们事先并不能确定其类型,两个函数都满足条件,数组也是继承自Object所以,double[]比Object具有更高的精确度,于是输出结果就为double array。

   进一步考虑:
  1. public class JavaPuzzles {  
  2.     public static void main(String[] args) {  
  3.         JavaPuzzles.printObj(null); // 这里会出现编译错误  
  4.     }  
  5.       
  6.     public static void printObj(double[] array){  
  7.         System.out.print("double array");  
  8.     }  
  9.       
  10.     public static void printObj(Number number){  
  11.         System.out.print("number");  
  12.     }  
  13.       
  14.     public static void printObj(Object obj){  
  15.         System.out.println("Object");  
  16.     }  
  17. }  

如果调用重载函数的话,是可以通过编译的。如果调用了会编译通不过,提示:

The method printObj(double[]) is ambiguous for the type JavaPuzzles。

为什么?因为编译的时候,我们不能够确定null到底是什么类型,Number和doubl[]都继承自Object,根本无法区分,于是就出现了编译错误。

于是我们可知,在这种事先不能够明确类型的参数重载调用,只能够发生在父子或多层继承关系中,但不能发生在兄弟或者兄弟子孙间。

例如,因为String继承自Object,而Double继承自Object-->Number,所以显示调用null的时候编译会提示错误。

  1. public static void printObj(Double dbl){  
  2.     System.out.print("double");  
  3. }  
  4.   
  5. public static void printObj(String string){  
  6.     System.out.println("string");  
  7.         }  
而因为Double继承自Number,所以调用null的时候,会调用更高精度的函数,即输入double
  1. public static void printObj(Double dbl){  
  2.     System.out.print("double");  
  3. }  
  4.   
  5. public static void printObj(Number number){  
  6.     System.out.println("number");  
  7. }  
解函数重载给我们带来了很多的方便,但是有的时候不注意,可能会带来不期望的结果,如果避免此类的问题,可以在调用的时候明确调用参数的精确类型,从而避免问题出现。如
  1. JavaPuzzles.printObj((Number)null); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章