2013-12-10 67 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

是的,我知道,我是用錯了詞搜索對谷歌。 –