Подтвердить что ты не робот

Переменная экземпляра java и метод с таким же именем

В java может ли переменная экземпляра и метод иметь одно и то же имя без какой-либо нестабильности или конфликта?

Я хочу убедиться, что мне удастся скомпилировать его, чтобы он не вызывал ошибок в дороге.

4b9b3361

Ответ 1

Да, это хорошо, главным образом потому, что синтаксически они используются по-разному.

Ответ 2

Это совершенно нормально, потому что методы и переменные называются по-разному.

Код:

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

Ответ 3

Единственный конфликт, о котором я мог думать, -

int sameName = 5;

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

Если вы пишете "this.sameName" , когда вы должны писать "this.sameName()" и наоборот в каком-то месте в программе, тогда аннигиляция кода только что начался.

Ответ 4

На самом деле я столкнулся с проблемой, которая очень специфична. Он просто проявляется в Java 8 (с использованием Nashorn), но не в Java 6 (с использованием Rhino). Если он пытается получить доступ к переменной экземпляра объекта Java через Javascript, оператор [] возвращает экземпляр метода.

Предположим, что я запускаю следующее объявление 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: По-видимому Метод переноса Nashorn, перегружающий механизм разрешения ( "неявно" или ненаучно) дает более высокий приоритет методам без аргументов над полями экземпляра с одно и то же имя.