Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有相同名称的java实例变量和方法_Java - Fatal编程技术网

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

具有相同名称的java实例变量和方法,java,Java,在java中,实例变量和方法是否可以具有相同的名称而不存在任何不稳定性或冲突 我想确保如果我可以编译它,它不会导致任何错误。是的,这很好,主要是因为从语法上讲,它们的用法不同。我能想到的唯一冲突是 int sameName = 5; public int sameName() { //method body return 100; } 如果在程序中的某个位置编写“this.samenae”时编写“this.samenae()”,反之亦然,那么代码的销毁才刚刚开始。完全可以,因为方法和

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


我想确保如果我可以编译它,它不会导致任何错误。

是的,这很好,主要是因为从语法上讲,它们的用法不同。

我能想到的唯一冲突是

int sameName = 5;

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

如果在程序中的某个位置编写“this.samenae”时编写“this.samenae()”,反之亦然,那么代码的销毁才刚刚开始。

完全可以,因为方法和变量的调用不同

代码:

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
输出:

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
我的方法

myVariable


您可以,但这是一种反模式,应该避免,并且可以通过以下分析进行捕获:


我实际上遇到了一个非常具体的问题。它只是在Java8(使用Nashorn)中表现出来,而不是在Java6(使用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] );

UPDATE:显然(“隐式”或非故意地)为没有参数的方法提供了比同名实例字段更高的优先级

你为什么不自己试一试呢?:)这在c#中是不允许的。仅仅因为它被允许并不意味着它是一个好主意。我只是浪费了几个小时去寻找一个NPE,这一切都是因为这个字段被意外地用来代替这个方法。如果您想避免错误,请避免这种反模式。很好,C#不允许这样做。虽然你是正确的——这是可能的,但我认为“不同的语法调用”的理由是不正确的。我的C++是生锈的,但是我认为C++中的用法也不同,但会引起问题。例如:@amit-好的观点,让我研究这个问题,然后修改答案。多谢各位Much@arshajii或者你的意思是:!C++(C++)?@ java语言的ARSHAGJI,定义了<代码>!代码>运算符,它进行值不等式比较,而不是参考不等式比较!如果他写了
Java!=C++
尽管如此@是的,这是不同的。我并没有说这是不正确的(而且它在java上也不起作用),我只是说提供的理由是不够的——除非有来自规范的引用来解释为什么它是足够的——还有一个不同语言的反例——它在语法上也是不同的,但有不同的行为。这意味着像给出的答案那样的全局答案是不够的,一个好的答案应该引用规范来解释为什么会这样。但那只是一个bug。这仍然是合法的德克塞普,如果他把这片土地封起来,让它成为私人的。