2012-03-31 146 views
11

在java中,實例變量和方法具有相同的名稱而沒有任何不穩定或衝突?具有相同名稱的java實例變量和方法

我想確定一下,如果我可以逃脫編譯它,它不會導致任何錯誤的道路。

+11

你爲什麼不直接嘗試一下呢? :) – 2012-03-31 23:27:20

+1

這是不允許在C#中。 – 2015-05-01 12:15:44

回答

14

是的,這很好,主要是因爲在句法上,它們的使用方式不同。

+1

雖然你是正確的 - 這是可能的,我不認爲「合成不同」的原因是正確的。我的C++很生疏,但我認爲在C++中它們的使用方式也不同,但會導致問題。例如:http://ideone.com/SQWav – amit 2012-03-31 23:36:42

+0

@amit - 好點,讓我研究這個問題,然後我會修改答案。非常感謝你 – Coffee 2012-04-01 00:24:50

+2

@amit但C++!= Java,對不對? – arshajii 2013-07-08 13:49:43

3

我能想到的唯一衝突是

int sameName = 5; 

public int sameName() { 
    //method body 
    return 100; 
} 

如果你寫「this.sameName」時,你應該寫「this.sameName()」反之亦然在程序的某個地方然後代碼的湮沒纔剛剛開始。

+2

但這只是一個錯誤。這仍然是合法的。 :D – zEro 2013-07-08 13:50:55

+0

@vikingsteve:P – 2013-07-09 07:03:08

+4

對於較粗體的+1:O – vikingsteve 2013-07-09 07:04:36

5

這完全沒問題,因爲方法和變量的調用方式不同。

代碼:

String name = "myVariable"; 

public String name() { 
    return "myMethod"; 
} 

System.out.println(name()); // Brackets for method call 
System.out.println(name); // No brackets for variable call 

輸出:

的MyMethod

MYVARIABLE

2

其實,我遇到了一個問題,這是非常具體的。它只是表現在Java 8(使用Nashorn),而不是Java 6(使用Rhino)。如果它試圖通過Javascript訪問一個Java對象的實例變量,那麼[]運算符會改爲返回方法實例。

讓我們假設我運行下面的Java聲明:

class MyClass { 
    private boolean isSet=false; 
    public boolean isSet() { return isSet; } 
} 

如果我在處理JavaScript等類的一個對象,然後嘗試用[]操作符來訪問它,我得到的方法參考。

var obj = new MyClass(); 
var myfields = (myclass.getClass()).getDeclaredFields(); 
var myfieldname = myfields[0].name; 

// The following prints the method declaration, not the boolean value: 
// [jdk.internal.dynalink.beans.SimpleDynamicMethod boolean MyClass.isSet()] 
println(obj[myfieldname]); 

更新:顯然,Nashorn's method overloading resolution mechanism(「含蓄」或非有意的)提供更高的優先級的方法,而不在具有相同名稱的實例字段變量。

相關問題