在java中,实例变量和方法是否具有相同的名称,没有任何不稳定或冲突?
我想确定我是否可以逃脱编译,它不会导致任何错误。
答案 0 :(得分:19)
是的,没关系,主要是因为从语法上讲,它们的使用方式不同。
答案 1 :(得分: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 :(得分:4)
我能想到的唯一冲突是
int sameName = 5;
public int sameName() {
//method body
return 100;
}
如果您要编写 “this.sameName()” > 在程序中的某个地方,强>和反之亦然然后,代码的消灭才刚刚开始。
答案 3 :(得分:3)
我实际上遇到了一个非常具体的问题。它只是在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(&#34;隐式&#34;或非故意)为没有参数的方法提供更高的优先级,而不是具有相同名称的实例字段。
答案 4 :(得分:1)
你可以,但它是一种反模式,应该避免,并且可以通过如下分析来捕获: