java实例变量和具有相同名称的方法

时间:2012-03-31 23:21:06

标签: java

在java中,实例变量和方法是否具有相同的名称,没有任何不稳定或冲突?

我想确定我是否可以逃脱编译,它不会导致任何错误。

5 个答案:

答案 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)

你可以,但它是一种反模式,应该避免,并且可以通过如下分析来捕获:

http://pmd.sourceforge.net/pmd-4.3.0/rules/naming.html