大家先看这个程序:
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)方法,输出又是什么?
自己运行一下就知道结果哈,
想讨论哈是什么原因
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)方法,输出又是什么?
自己运行一下就知道结果哈,
想讨论哈是什么原因
{
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);
}
}当两个类属于同一级别时,编译时会报错,找不到匹配的方法
输出 :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"这个结果的。
我做了一个总结,对于所有Object的子类(非基本类型),java虚拟机在调用myMethod(null)判断具体调用那个类型入参的函数的时候,把所有如参类型分级,如果同一级上有两个节点,就抛异常,否则就调用参数类型为最底层的类的方法.假设有三个类型入参:E,EE(E的子类),EEE(EE)的子类,则调用EEE那个,如果这时候加入一个EE2,就报错了。如果加入一个int,则不会有任何影响。呵呵,说得很乱。