2013-12-10 39 views
4

我经历了一件有趣的事情在这里来了。这不是问题,我只是对优先顺序感到好奇。让我们去的代码:排序方法调用顺序

我有在同一类这两种方法:

1- public void method1(String a, String...b){ 
2-  System.out.println(a + "===" + b[0]); 
3- } 
4- 
5- public void method1(String a, String b){ 
6-  method1(a, b); 
7- } 
8- 
9- public static void main(String[] args) { 
10-  Teste t = new Teste(); 
11-  t.method1("a", "b"); 
12- } 

这里运行测试中,我看到,第11行的调用method1将调用method1第5行定义那么它会做一个自己的电话,因此一个java.lang.StackOverflowError。我的问题是关于优先顺序呼吁theese方法,如method1 1号线接收线5的String, String[]method1接收理论上的String, String他们收到相同的参数,如果我想传递的第二个参数两种方法只是一个字符串。

我知道,在这种情况下调用特定的方法第1行只有一个字符串作为第二个参数我会做method1("someString", new String[]{"someString"});

我想知道是否有任何的解释(或文档)到这个优先顺序的呼叫。这说的是这样的:

“在一个方法定义中,如果只传递一个参数,其中一个方法接收一个对象,而另一个是同一个对象的数组,那么执行它的方法将是一个接收仅仅一个对象,而不是接收阵列为该对象”

+0

什么额外的好处确实你的'第二个版本method1'提供? – Ingo

+0

没什么......这只是为了好奇。正如我在这个问题上所说的。 –

回答

2

我想答案可以在15.12.2. Compile-Time Step 2: Determine Method Signature中发现的一个:

可以存在多于一种这样的方法,在这种情况下大多数 特定的一个被选中。该描述符(签名加上返回类型)的 最具体的方法是在运行时用于执行方法 调度。

通过它并看到examples更好的解释。

+1

太好了。那正是我想要找到的。谢谢。只要我能接受,我会的。 –

+1

@JorgeCampos我很高兴它帮助:)参考官方文档和JLS的是别人的事情最好能做到。 – Maroun

+0

是的,我知道,我是用错了词搜索对谷歌。 –