Tôi có các lớp ví dụ sau trong Java:Không thể gọi trực tiếp supertype constructor - tại sao không?
public class A { }
public class Super {
protected Super() { }
public Super(A a) { }
}
public class Sub extends Super { }
public class Consumer {
public Consumer() {
Sub sub = new Sub(new A()); //compiler error
}
}
Trình biên dịch báo lỗi nói rằng các đối số không thể được áp dụng cho các nhà xây dựng mặc định trong Sub, mà là hoàn toàn dễ hiểu.
Điều tôi tò mò là lý do đằng sau quyết định này. Java tạo ra hàm tạo rỗng mặc định trong Sub
; tại sao nó không thể gọi nó đằng sau hậu trường trong trường hợp này? Đây có phải là trường hợp chủ yếu của việc nắm tay sane hay có lý do kỹ thuật không?
EDIT
Tôi biết rằng đây là một giới hạn ngôn ngữ. Tôi tò mò về lý do tại sao đó là giới hạn ngôn ngữ.
EDIT 2
Dường như, như thường là trường hợp, tôi đã quá gần với mã tôi đã thực sự làm việc để xem hình ảnh lớn. Tôi đã đăng một ví dụ phản đối trong các câu trả lời dưới đây cho thấy lý do tại sao đây là Bad Thing®.
Tất cả những gì tôi có thể tìm thấy trong thông số kỹ thuật là không thể thực hiện được. Không có lời giải thích nào về lý do tại sao http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.2 –
Dưới đây là Jon Skeet's take on it http://stackoverflow.com/questions/1644317/java -constructor-inheritance/1644410 # 1644410 –
Tôi đang bối rối về chỉnh sửa của bạn. Bạn đang tự hỏi tại sao, khi bạn gọi một hàm tạo với một đối số, một hàm tạo mặc định không có đối số không thể được gọi trong vị trí của nó? Rõ ràng các lập trình viên đã không cố gắng gọi một nhà xây dựng mà hoàn toàn sẽ bỏ qua tham số của mình, nếu không anh ta sẽ không có specifed tham số! –