Nó có thể nhưng không phải là cách bạn có nó.
Bạn phải thêm một hàm tạo no-args vào lớp cơ sở và thế là xong!
public abstract class A {
private String name;
public A(){
this.name = getName();
}
public abstract String getName();
public String toString(){
return "simple class name: " + this.getClass().getSimpleName() + " name:\"" + this.name + "\"";
}
}
class B extends A {
public String getName(){
return "my name is B";
}
public static void main( String [] args ) {
System.out.println( new C() );
}
}
class C extends A {
public String getName() {
return "Zee";
}
}
Khi bạn không thêm một hàm tạo (bất kỳ) vào một lớp, trình biên dịch sẽ thêm một hàm tạo không đối số mặc định cho bạn.
Khi defualt no arg gọi tới super (); và vì bạn không có nó trong lớp siêu cấp nên bạn nhận được thông báo lỗi đó.
Đó là về câu hỏi tự nó.
Bây giờ, mở rộng câu trả lời:
Bạn có biết rằng việc tạo một lớp con (hành vi) để chỉ định một giá trị (dữ liệu) khác không có ý nghĩa gì không ?? !!! Tôi hy vọng bạn làm.
Nếu điều duy nhất thay đổi là "tên" thì một lớp duy nhất được tham số hóa là đủ!
Vì vậy, bạn không cần điều này:
MyClass a = new A("A");
MyClass b = new B("B");
MyClass c = new C("C");
MyClass d = new D("D");
hoặc là
MyClass a = new A(); // internally setting "A" "B", "C" etc.
MyClass b = new B();
MyClass c = new C();
MyClass d = new D();
Khi bạn có thể viết điều này:
MyClass a = new MyClass("A");
MyClass b = new MyClass("B");
MyClass c = new MyClass("C");
MyClass d = new MyClass("D");
Nếu tôi thay đổi chữ ký phương thức của phương thức khởi tạo BaseClass, tôi sẽ phải thay đổi tất cả các lớp con.
Đó là lý do tại sao kế thừa là yếu tố tạo ra sự kết hợp CAO, điều không mong muốn trong các hệ thống OO. Nó nên được tránh và có lẽ được thay thế bằng thành phần.
Hãy nghĩ xem bạn có thực sự cần chúng dưới dạng lớp con không. Đó là lý do tại sao bạn thường thấy các giao diện được sử dụng chèn:
public interface NameAware {
public String getName();
}
class A implements NameAware ...
class B implements NameAware ...
class C ... etc.
Ở đây B và C có thể được kế thừa từ A, điều này sẽ tạo ra một mối ghép rất CAO giữa chúng, bằng cách sử dụng các giao diện, sự ghép nối bị giảm đi, nếu A quyết định nó sẽ không còn là "NameAware" thì các lớp khác sẽ không bị phá vỡ.
Tất nhiên, nếu bạn muốn sử dụng lại hành vi này sẽ không hoạt động.