public class test{
public void t(Object x){
System.out.println("Object");
}
public void t(String x){
System.out.println("String");
}
public static void main(String[] args){
test tt = new test();
tt.t(null);
}
}说出输出结果? 最重要的是为什么?
public void t(Object x){
System.out.println("Object");
}
public void t(String x){
System.out.println("String");
}
public static void main(String[] args){
test tt = new test();
tt.t(null);
}
}说出输出结果? 最重要的是为什么?
null是String,String是Object,null是Object,根据thinking in java上的说法应该是动态绑定,所以调用参数为String的函数
不知道这样解释对不对
应该在程序设计中避免使用这种重载方法.你可以去看一下effective java的第26条.
Object tt;
public ClassTest (){
}
public void doTest(Object myobject){
tt = myobject;
tt.getClass().getMethods();
}
public void doTest(String myobject){
tt = myobject;
tt.getClass().getMethods();
}
public static void main(String[] src){
ClassTest test = new ClassTest();
test.doTest(null);
}
}当test.doTest("我到底爱谁");
DeBug跳入 public void doTest(String myobject)当test.doTest(null);
DeBug跳入 public void doTest(String myobject)当test.doTest(new ArrayList());
DeBug跳入 public void doTest(Object myobject)
但是对于null来说,在编译期间,系统就知道它是一个string,也是一个object。所以系统自然选择更适合的string为参数的函数。同理如果两个函数,一个是object,一个是int[],系统也是选择作为子类的int[]为参数的函数。
如果碰到一个String,一个int[]重载的情况,系统就会报参数混淆的错误。因为string heddd
如果碰到一个String,一个int[]重载的情况,系统就会报参数混淆的错误。因为string 和int[]不存在继承关系,所以说系统找不到更贴切的参数类型,所以无法分清究竟访问的哪个函数,所以会报错。
测试用的代码如下
public class TestNull {
void f(int[] i)
{
System.out.println("int[]");
}
// void f(String i) //这里如果去掉注释的话,就会报错
// {
// System.out.println("String");
//
// }
void f(Object i)
{
System.out.println("object");
} public static void main(String[] args) {
new TestNull().f(null);
}
}
我的理解 NULL是空对象 不是STRING,而STRING 本身又是对象..所以就搞不懂到底应该优先谁了?
null传递给 string 和 object作为参数的同名函数的时候,java 不会报错,java 自动识别为string,因为string是object的子类。当 null传递给int[]和object作参数的函数时,同理,识别为int[]。只有当string 传递给int[] 和 string作参数的同名函数时,才会出现混淆。因为int[]和string之间没有继承关系。所以系统无法分辨哪个更为贴近。
再不明白,我也无语了
public class MyTest
{
public void f(MyString s)
{
System.out.println("MyString");
}
public void f(MyMyString s)
{
System.out.println("MyMyString");
}
public void f(Object s)
{
System.out.println("Object");
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
new MyTest().f(null);
}}class MyString extends Object
{
}class MyMyString extends MyString
{
}
MyMyString是继承关系的叶子。。所以系统判断null是MyMyString
更感谢 wthwebbe(honghong) ( ) 信誉:97