遇到的一个有趣的题目

shirui8653719 2013-08-28 09:07:42
import java.util.ArrayList;
import java.util.List;

public class Demo {
public static void main(String[] args) {
x(null);
}
public static void x(int x){
System.out.println("x(int)");
}
public static void x(List x){
System.out.println("x(List)");
}
public static void x(ArrayList x){
System.out.println("x(ArrayList)");
}
public static void x(Object x){
System.out.println("x(Object)");
}
}

上面的代码应该输出什么,为什么?有人知道吗?
...全文
533 25 打赏 收藏 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
weidu23 2013-08-30
  • 打赏
  • 举报
回复
引用 24 楼 oh_Maxy 的回复:
http://bbs.csdn.net/topics/390568327
这帖子我看了,我把我的结论用QQ发给你了!
jackpay 2013-08-29
  • 打赏
  • 举报
回复
引用 8 楼 xxhhbb1538 的回复:
[quote=引用 7 楼 shirui8653719 的回复:] [quote=引用 4 楼 wq568907978 的回复:] 输出x(ArrayList) 调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。 null 证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
为什么不调用x(int x)?[/quote]int型不是引用类型,这次yes了吧[/quote] +1
harrisonkao 2013-08-29
  • 打赏
  • 举报
回复
x(object)吧,因为null最最符合的是Object
linhu007 2013-08-29
  • 打赏
  • 举报
回复
x(Object)
oh_Maxy 2013-08-29
  • 打赏
  • 举报
回复
引用 19 楼 weidu23 的回复:
当然是输出x(ArrayList)了! ---------首先,来一段题外的-------- 其实,这是根据函数的重载规则来的, 比如,你如果把你的函数里 public static void x(int x){ System.out.println("x(int)"); } 改成 public static void x(Integer x){ System.out.println("x(int)"); } 程序就会报错! 因为匹配有错! -----------现在进入正题------- 1、思考,为什么程序不报错 在你的程序里面,int 是原生类型,Object是基本对象类型,所以,这两个和List \ ArrayList不冲突,所以,不会报错! 2、首先证明了你的程序不报错,现在,分析别的。 在你的程序里,int和null是不匹配的,所以,x(null)根本不会理会x(int), 然后,Object ---> List ---> ArrayList是继承关系。 在英语语法中,有一个有意思的原则,叫:就近原则 , Java的设计者在设计重载函数的冲在顺序时,不应该忽视他,因为这个原则很好的表达了继承关系。 于是,根据这原则,自然选择x(ArrayList)。 3、猜是没有意义的!前面很多楼层的猜测,我建议好好看看JavaSE基本部分(即Java基础)
总结的好呀~ 这里有个类似的,也可以过来看看,挺有意思的:http://bbs.csdn.net/topics/390568327
白开水MD5 2013-08-29
  • 打赏
  • 举报
回复
引用 21 楼 hjgzj 的回复:
[quote=引用 19 楼 weidu23 的回复:] 当然是输出x(ArrayList)了! ---------首先,来一段题外的-------- 其实,这是根据函数的重载规则来的, 比如,你如果把你的函数里 public static void x(int x){ System.out.println("x(int)"); } 改成 public static void x(Integer x){ System.out.println("x(int)"); } 程序就会报错! 因为匹配有错! -----------现在进入正题------- 1、思考,为什么程序不报错 在你的程序里面,int 是原生类型,Object是基本对象类型,所以,这两个和List \ ArrayList不冲突,所以,不会报错! 2、首先证明了你的程序不报错,现在,分析别的。 在你的程序里,int和null是不匹配的,所以,x(null)根本不会理会x(int), 然后,Object ---> List ---> ArrayList是继承关系。 在英语语法中,有一个有意思的原则,叫:就近原则 , Java的设计者在设计重载函数的冲在顺序时,不应该忽视他,因为这个原则很好的表达了继承关系。 于是,根据这原则,自然选择x(ArrayList)。 3、猜是没有意义的!前面很多楼层的猜测,我建议好好看看JavaSE基本部分(即Java基础)
那我为什么Integer就会报错呢[/quote] 因为Integer和ArrayList有冲突,不知道应该调用哪一个,所以就会报错
蒲东英的约定 2013-08-29
  • 打赏
  • 举报
回复
不错,学习了!19楼讲的挺有道理的
  • 打赏
  • 举报
回复
引用 19 楼 weidu23 的回复:
当然是输出x(ArrayList)了! ---------首先,来一段题外的-------- 其实,这是根据函数的重载规则来的, 比如,你如果把你的函数里 public static void x(int x){ System.out.println("x(int)"); } 改成 public static void x(Integer x){ System.out.println("x(int)"); } 程序就会报错! 因为匹配有错! -----------现在进入正题------- 1、思考,为什么程序不报错 在你的程序里面,int 是原生类型,Object是基本对象类型,所以,这两个和List \ ArrayList不冲突,所以,不会报错! 2、首先证明了你的程序不报错,现在,分析别的。 在你的程序里,int和null是不匹配的,所以,x(null)根本不会理会x(int), 然后,Object ---> List ---> ArrayList是继承关系。 在英语语法中,有一个有意思的原则,叫:就近原则 , Java的设计者在设计重载函数的冲在顺序时,不应该忽视他,因为这个原则很好的表达了继承关系。 于是,根据这原则,自然选择x(ArrayList)。 3、猜是没有意义的!前面很多楼层的猜测,我建议好好看看JavaSE基本部分(即Java基础)
那我为什么Integer就会报错呢
异常异长 2013-08-29
  • 打赏
  • 举报
回复
我凌乱了。。。。
weidu23 2013-08-29
  • 打赏
  • 举报
回复
当然是输出x(ArrayList)了! ---------首先,来一段题外的-------- 其实,这是根据函数的重载规则来的, 比如,你如果把你的函数里 public static void x(int x){ System.out.println("x(int)"); } 改成 public static void x(Integer x){ System.out.println("x(int)"); } 程序就会报错! 因为匹配有错! -----------现在进入正题------- 1、思考,为什么程序不报错 在你的程序里面,int 是原生类型,Object是基本对象类型,所以,这两个和List \ ArrayList不冲突,所以,不会报错! 2、首先证明了你的程序不报错,现在,分析别的。 在你的程序里,int和null是不匹配的,所以,x(null)根本不会理会x(int), 然后,Object ---> List ---> ArrayList是继承关系。 在英语语法中,有一个有意思的原则,叫:就近原则 , Java的设计者在设计重载函数的冲在顺序时,不应该忽视他,因为这个原则很好的表达了继承关系。 于是,根据这原则,自然选择x(ArrayList)。 3、猜是没有意义的!前面很多楼层的猜测,我建议好好看看JavaSE基本部分(即Java基础)
LI597494570 2013-08-29
  • 打赏
  • 举报
回复
学习了
nj_dobetter 2013-08-29
  • 打赏
  • 举报
回复
验证了一下: > javac Demo.java > java Demo x(ArrayList)
「已注销」 2013-08-29
  • 打赏
  • 举报
回复
引用 14 楼 jackpay 的回复:
[quote=引用 8 楼 xxhhbb1538 的回复:] [quote=引用 7 楼 shirui8653719 的回复:] [quote=引用 4 楼 wq568907978 的回复:] 输出x(ArrayList) 调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。 null 证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
为什么不调用x(int x)?[/quote]int型不是引用类型,这次yes了吧[/quote] +1[/quote] 如果想调用x(int x),就在调用方法处给一个符合参数的值,就是说可以这样x(1);
Inhibitory 2013-08-29
  • 打赏
  • 举报
回复
技术宅的世界仍是那么的凶残。
valenon 2013-08-28
  • 打赏
  • 举报
回复
开眼界了。。。。。。。
  • 打赏
  • 举报
回复
引用 9 楼 shirui8653719 的回复:
[quote=引用 8 楼 xxhhbb1538 的回复:] [quote=引用 7 楼 shirui8653719 的回复:] [quote=引用 4 楼 wq568907978 的回复:] 输出x(ArrayList) 调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。 null 证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
为什么不调用x(int x)?[/quote]int型不是引用类型,这次yes了吧[/quote]好吧,给你一个YES![/quote]
shirui8653719 2013-08-28
  • 打赏
  • 举报
回复
引用 8 楼 xxhhbb1538 的回复:
[quote=引用 7 楼 shirui8653719 的回复:] [quote=引用 4 楼 wq568907978 的回复:] 输出x(ArrayList) 调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。 null 证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
为什么不调用x(int x)?[/quote]int型不是引用类型,这次yes了吧[/quote]好吧,给你一个YES!
  • 打赏
  • 举报
回复
引用 7 楼 shirui8653719 的回复:
[quote=引用 4 楼 wq568907978 的回复:] 输出x(ArrayList) 调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。 null 证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
为什么不调用x(int x)?[/quote]int型不是引用类型,这次yes了吧
shirui8653719 2013-08-28
  • 打赏
  • 举报
回复
引用 4 楼 wq568907978 的回复:
输出x(ArrayList) 调用java方法,当参数满足好几个重载方法时,会调用符合参数条件范围最小的。 null 证明参数要是引用类型,ArrayList是List子类,所以调用ArrayList的
为什么不调用x(int x)?
  • 打赏
  • 举报
回复
引用 5 楼 shirui8653719 的回复:
引用 1 楼 xxhhbb1538 的回复:
x(Object)吗
NO
加载更多回复(5)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧