2012-03-31 15 views
11

W java może zmienna instancji i metoda mają tę samą nazwę bez niestabilności lub konfliktu?Zmienna instancji java i metoda o tej samej nazwie

Chcę się upewnić, czy uda mi się uciec z kompilacją, że nie spowoduje to żadnego błędu na drodze.

+11

Dlaczego po prostu sam tego nie wypróbowałeś? :) –

+1

To nie jest dozwolone w języku C#. –

Odpowiedz

14

Tak, to dobrze, głównie dlatego, że syntaktycznie są używane inaczej.

+1

Chociaż masz rację - to jest możliwe, nie sądzę, że przyczyna "syntaktycznego odmiennego" jest poprawna. Moje C++ jest zardzewiałe, ale myślę, że w C++ są one również używane inaczej, ale spowoduje to problemy. na przykład: http://ideone.com/SQWav – amit

+0

@amit - Dobra uwaga, pozwól mi przestudiować ten problem, a następnie poprawię odpowiedź. Bardzo dziękuję – Coffee

+2

@amit But C++! = Java, prawda? – arshajii

3

Jedyny konflikt mogłem pomyśleć jest

int sameName = 5; 

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

Jeśli piszesz "this.sameName" kiedy mają napisać "this.sameName()" i vice-versa w pewnym miejscu programu, a następnie unicestwienie kodu właśnie się rozpoczęło.

+2

Ale to byłby tylko błąd. To wciąż legalne. : D – zEro

+0

@vikingsteve: P –

+4

+1 za mniej pogrubioną: O – vikingsteve

5

Jest całkowicie w porządku, ponieważ metody i zmienne są nazywane inaczej.

Kod:

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 

wyjściowa:

myMethod

myVariable

2

I faktycznie nie prowadził do problemu, który jest bardzo specyficzny. Po prostu manifestuje się w Javie 8 (używając Nashorn), ale nie w Javie 6 (używając Rhino). Jeśli spróbuje uzyskać dostęp do zmiennej instancji obiektu Java za pomocą skryptu JavaScript, operator [] zwraca zamiast tego instancję metody.

Załóżmy biegnę następującą deklarację Java:

class MyClass { 
    private boolean isSet=false; 
    public boolean isSet() { return isSet; } 
} 

Gdybym manipulować obiekt takiej klasy w JavaScript, a następnie spróbuj do niego dostęp z [] operatora, pojawia się odniesienie metody.

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: Widocznie Nashorn's method overloading resolution mechanism („domyślnie” lub nie celowo) daje wyższy priorytet do metod bez argumentów ponad instancji pola o tej samej nazwie.

Powiązane problemy