2012-03-31 126 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(“含蓄”或非有意的)提供更高的优先级的方法,而不在具有相同名称的实例字段变量。

相关问题