Tôi đã tìm thấy một tình huống mà chương trình java hoạt động khác sau khi đổi tên một biến. Tôi hiểu rằng đây không phải là mã mà mọi người sẽ sử dụng nhưng nếu ai đó biết điều gì đang xảy ra thì sẽ tốt hơn nếu có lời giải thích. Tôi đã thử điều này với java 1.6 trên Eclipse Kepler.Thay đổi tên biến đổi hành vi của chương trình Java
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");
}
}
đầu ra này:
hello
Exception in thread "main" java.lang.NoSuchMethodError: _test.TestClass$1.doStuff()V at _test.TestClass.main(TestClass.java:13)
Theo như tôi hiểu trình biên dịch tạo ra một tập tin TestClass $ 1.class cho đối tượng testClazz $ 1 và điều này gây ra một vụ va chạm đặt tên.
Nhưng sau khi đổi tên đối tượng để 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");
}
}
Đầu ra là:
hello2
Bất kỳ ý tưởng những gì đang xảy ra ở đây?
Không chắc chắn lý do tại sao điều này xảy ra nhưng cần lưu ý về cách đặt tên: Thực tế là đặt tên biến của bạn bằng ký hiệu $ vì điều này thường được dành riêng cho biến do hệ thống tạo. Tôi muốn sẵn sàng đặt cược hành vi kỳ quặc này xảy ra bởi vì bạn đang vấp phải một số TestClass được tạo ra từ hệ thống. – DanK
Hệ thống tạo ra một lớp học vô danh TestClass $ 1, nó vẫn còn lạ rằng điều này đang xảy ra. – user3139461