Giả sử chúng ta có hai lớp:Mở rộng ngoại trừ phương pháp ghi đè trong Java
Class A:
import java.io.IOException;
public class A {
public void test() throws IOException{
System.out.println("test in A");
}
}
Class B:
import java.io.IOException;
public class B extends A {
@Override
public void test() throws Exception{
System.out.println("test in B");
}
}
này đưa ra một lỗi biên dịch, và tôi muốn để biết lý do cho nó. Tôi có thể tự mình nhận được câu trả lời, nhưng điều này không hoàn toàn khoa học, nhưng một phần logic.
Tôi đã viết a blog post in Azerbaijani. Khi tôi viết blog, tôi đã bị kẹt trong quá trình tải.
Xin hãy cẩn thận trong dấu ngoặc kép:
Tôi nghĩ rằng khi trình biên dịch lần đọc lớp B, nó tải các tiêu đề phương pháp A và tiêu đề phương pháp B. Và khi bạn gọi thử nghiệm của A, JVM kêu gọi sự thử thách của A, nhưng khi cơ thể gọi là thử nghiệm của B, và tại thời điểm đó chúng tôi sẽ có phương pháp này:
public void test() throws IOException{ // <-- Header of A
System.out.println("test in B"); // <-- Body of B
// Here I can throw wide Exception from IOException
// because here is the body of the test in B. The test
// method in B can throw Exception so the compiler
// doesn't approve of this version of the code.
}
là quá trình này thực sự xảy ra như những gì tôi đã viết ở trên?
Tải vấn đề tiêu đề Tôi đã bị kẹt chính xác ở đây. Quá trình liên kết hoạt động như thế nào? Tôi không thể tìm ra nền tảng của
A a = new B(); // When the compiler converts this line into bytecode
// does it loads of method headers of A and method
// body's of B
a.test()
gọi kiểm tra của lớp B. Tôi biết một cách hợp lý, nhưng tôi không thể tìm ra ở cấp độ trình biên dịch, quá trình liên kết.
cảm ơn trả lời.hãy đọc câu hỏi lần nữa tôi đã cập nhật – Sarkhan
@ Serkhan Khi nó thấy B.test() ghi đè A.test(), nó cũng kiểm tra sự kết hợp của kiểu trả về và ngoại lệ. Cả hai chỉ có thể được thu hẹp và không mở rộng, để ngăn chặn tình hình tôi đã thảo luận trong câu trả lời của tôi. – amit
bạn có thể giải thích cho tôi quá trình liên kết không. Tôi không thể tìm ra nền tảng của A a = new B(); a.test() gọi kiểm tra của lớp B.i biết logically.but không thể tìm ra như trình biên dịch cấp như liên kết process.A a = new B(); // khi trình biên dịch chuyển đổi dòng này thành bytecode // nó có nạp các tiêu đề phương thức của A và phương thức của B hoặc tải của tất cả các tiêu đề phương thức và phần thân phương thức.i đang yêu cầu điều này để hiểu cách phương thức thử nghiệm của A liên kết với phương pháp kiểm tra B – Sarkhan