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.
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.
Tak, to dobrze, głównie dlatego, że syntaktycznie są używane inaczej.
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
@amit - Dobra uwaga, pozwól mi przestudiować ten problem, a następnie poprawię odpowiedź. Bardzo dziękuję – Coffee
@amit But C++! = Java, prawda? – arshajii
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.
Ale to byłby tylko błąd. To wciąż legalne. : D – zEro
@vikingsteve: P –
+1 za mniej pogrubioną: O – vikingsteve
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
Można, ale to jest anty pa ttern, należy unikać, a można się zarazić przez analityki tak:
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.
Dlaczego po prostu sam tego nie wypróbowałeś? :) –
To nie jest dozwolone w języku C#. –