Tôi đã theo dõi một lỗi ngày hôm nay, và tôi nhận thấy một cái gì đó kỳ lạ trong một trong các lớp học của chúng tôi. Tôi cắt càng nhiều mã càng tốt để đăng ở đây:Java phân biệt các phương thức này với cùng tên/chữ ký như thế nào?
class A {
static int obtainNumber() { return 42; }
static int obtainNumber() { return 3; }
static int obtainNumber() { return -1; }
static {
System.out.println(obtainNumber());
}
}
Lớp này có 3 phương pháp có cùng tên và chữ ký chính xác. Lúc đầu, tôi nghĩ rằng đây là mã không hợp lệ, nhưng sau đó nhật thực sẽ làm nổi bật mã màu đỏ. Nó hoạt động:
javac A.java && java A
42
Exception in thread "main" java.lang.NoSuchMethodError: main
Vì vậy, tôi nghĩ có thể Java sẽ chỉ sử dụng ứng dụng đầu tiên mà nó thấy. Tôi sắp xếp lại để kiểm tra:
class A {
static int obtainNumber() { return 3; }
static int obtainNumber() { return -1; }
static int obtainNumber() { return 42; }
static {
System.out.println(obtainNumber());
}
}
Nope, cùng kết quả:
javac A.java && java A
42
Exception in thread "main" java.lang.NoSuchMethodError: main
Tôi nghĩ có lẽ nó sử dụng một với 42 vì lớn nhất của nó. Để kiểm tra điều này, tôi đã lấy bản gốc và thay đổi giá trị trả về:
class A {
static int obtainNumber() { return 0; }
static int obtainNumber() { return 1; }
static int obtainNumber() { return 2; }
static {
System.out.println(obtainNumber());
}
}
Nó vẫn biết sử dụng đầu tiên:
javac A.java && java A
0
Exception in thread "main" java.lang.NoSuchMethodError: main
Và nếu tôi sắp xếp lại chúng một lần nữa:
class A {
static int obtainNumber() { return 1; }
static int obtainNumber() { return 0; }
static int obtainNumber() { return 2; }
static {
System.out.println(obtainNumber());
}
}
Kết quả tương tự:
javac A.java && java A
0
Exception in thread "main" java.lang.NoSuchMethodError: main
Tôi nghĩ Java là một ngôn ngữ dựa trên văn bản, điều mà tôi mong đợi làm cho điều này là không thể. Java theo dõi phương thức nào?
Nếu bạn nhận thấy, hình ảnh được chụp là một cú pháp khác với cú pháp khác nhau từ những người khác. Có lẽ điều đó có thể gợi ý bạn dựa trên các ký tự ẩn hoặc ngữ pháp ẩn. – hexafraction
Tại sao ai đó làm điều này? Nó giống như một trò ảo thuật chơi trên người lập trình viên – Shoe
@Jim từ Batman The Dark Knight: * Một số người chỉ muốn xem thế giới cháy bỏng *. –