Ho trovato uno scenario in cui il programma java si comporta diversamente dopo la ridenominazione di una variabile. Capisco che questo non sia in realtà un codice che chiunque userebbe, ma se qualcuno sa che cosa sta succedendo sarebbe bello avere una spiegazione. Ho provato questo con java 1.6 su Eclipse Kepler.Nome variabile della modifica Java modifica il comportamento del programma
package _test;
public class TestClass{
public static void main(String...args){
Object testClazz$1 = new Object(){
public String toString() {
return "hello";
}
};
TestClass$1 test = new TestClass$1();
System.out.println(testClazz$1.toString());
test.doStuff();
}
}
class TestClass$1{
public void doStuff(){
System.out.println("hello2");
}
}
Questo uscite:
hello
Exception in thread "main" java.lang.NoSuchMethodError: _test.TestClass$1.doStuff()V at _test.TestClass.main(TestClass.java:13)
Per quanto ho capito il compilatore crea un file TestClass $ 1.class per l'oggetto testClazz $ 1 e questo fa sì che una collisione di denominazione.
Ma dopo la ridenominazione dell'oggetto da TestClass $ 1:
package _test;
public class TestClass{
public static void main(String...args){
Object testClass$1 = new Object(){
public String toString() {
return "hello";
}
};
TestClass$1 test = new TestClass$1();
System.out.println(testClass$1.toString());
test.doStuff();
}
}
class TestClass$1{
public void doStuff(){
System.out.println("hello2");
}
}
l'output è:
hello2
Tutte le idee che cosa sta succedendo qui?
Non si conosce esattamente il motivo per cui ciò si sta verificando, ma c'è qualcosa da notare sulla denominazione: è una pratica scorretta denominare le variabili con un segno $ poiché questo è in genere riservato per una variabile generata dal sistema. Sarei disposto a scommettere che questo strano comportamento si sta verificando perché stai inciampando su alcuni TestClass generati dal sistema. – DanK
Il sistema crea una classe anonima TestClass $ 1, è ancora strano che ciò si stia verificando. – user3139461