大家先看这个程序:
public class NullRefrence 
{
public void myMethod(Object o) 

System.out.println("My Object"); 
}
 
public void myMethod(String s) 

System.out.println("My String"); 
} public static void main(String args[]) 

NullRefrence t = new NullRefrence(); 
t.myMethod(null); 
}}
大家看看输出结果是什么?如果去掉public void myMethod(Object o)方法,输出又是什么?
自己运行一下就知道结果哈,
想讨论哈是什么原因

解决方案 »

  1.   

    参数匹配 参数只要是OBJECT的子类都认(当没有时调用OBJECT参数方法) 而且如果有2个以上这种OBJECT子类参数方法会报异常
      

  2.   

    public class Test 
    {
    public void myMethod(String s) 

    System.out.println("My String"); 
    } public void myMethod(StringBuffer sb) 

    System.out.println("My StringBuffer"); 
    }  public static void main(String args[]) 

    Test t = new Test(); 
    t.myMethod(null); 
    }
    }当两个类属于同一级别时,编译时会报错,找不到匹配的方法
      

  3.   

    star_str(生命火花) ,你最好自己运行一下程序。要是抛出nullpoint exceptin我就不来这问了
      

  4.   

    我回去试验了一下:出现这样的结果
    输出 :My String.
    当把public void myMethod(String s)方法注释掉,则出现My object
    很显然,java虚拟机在调用myMethod(null)的时候,寻找函数的时候是以String为传如对象的。
    null不是一个对象,他是一个特殊的常量,它可以给任何一个对象进行赋值。
    String是Object的子类,在调用myMethod(null)是以子类的对象为先的。
    我又写了另一个文件进行试验,既写了A类和B类,A是B的子类,同样的调用myMethod(null),它输出的还是子类A的。我想这其中发生了覆盖,既在重载的方法中,当Java虚拟机遇到满足相同参数定义的时候,它就以传入子类的作为其参数。楼主,你还可以实验一下,再写一个C类,他是A的子类,然后你在调用myMethod(null),会发生什么结果,我想会出现"My C"这个结果的。
      

  5.   

    昨天看到:"对于引用类型,需要提及的一点就是关于null,它最初是没有运行时类型的,但是它可以被转换为任何类型,而且对于null,JVM并没有要求任何具体的值与之对应。"
    我做了一个总结,对于所有Object的子类(非基本类型),java虚拟机在调用myMethod(null)判断具体调用那个类型入参的函数的时候,把所有如参类型分级,如果同一级上有两个节点,就抛异常,否则就调用参数类型为最底层的类的方法.假设有三个类型入参:E,EE(E的子类),EEE(EE)的子类,则调用EEE那个,如果这时候加入一个EE2,就报错了。如果加入一个int,则不会有任何影响。呵呵,说得很乱。