Kế thừa phương thức xây dựng trong java

Tạo một lớp ConNguoi(Lớp cha):

public class ConNguoi {
	protected String hoVaTen;
	protected int namSinh;
	public ConNguoi(String hoVaTen, int namSinh) {
		this.hoVaTen = hoVaTen;
		this.namSinh = namSinh;
	}
}

Anh/Chị cho em hỏi là: Nếu lớp HocSinh kế thừa lớp ConNguoi thì lớp HocSinh sẽ kế thừa các thuộc tính và phương thức của lớp ConNguoi, cụ thể ở đây là kế thừa thuộc tính hoVaTennamSinh*=. Nhưng tại sao ở lớp HocSinh khi viết phương thức khởi tạo Constructor thì viết

this.hoVaTen = hoVaTen;
this.namsinh = namSinh;

như bên dưới thì lại không được ạ, theo như em nghĩ là nó đã kế thừa được thuộc tính của lớp cha: ConNguoi rồi thì có thể gọi các thuộc tính đó nó để sử dụng chứ:

public class HocSinh extends ConNguoi {
	private String tenLop, tenTruong;
       // Tạo Constructor:	
	public HocSinh(String hoVaTen, int namSinh, String tenLop, String tenTruong) {
	    this.hoVaTen = hoVaTen;
		this.namsinh = namSinh;			
        this.tenLop = tenLop;
		this.tenTruong = tenTruong;
	}
}

Hoặc viết theo cách này cũng báo lỗi:

public class HocSinh extends ConNguoi {
	private String tenLop, tenTruong;
    // Tạo Constructor:	
	public HocSinh(String hoVaTen, int namSinh, String tenLop, String tenTruong) {
		super.hoVaTen = hoVaTen;
		super.namsinh = namSinh;			
        this.tenLop = tenLop;
		this.tenTruong = tenTruong;
	}
}

Cách viết được dạy:

public class HocSinh extends ConNguoi {
	private String tenLop, tenTruong;
	//Tạo Constructor: 
	public HocSinh(String hoVaTen, int namSinh, String tenLop, String tenTruong) {
		super(hoVaTen, namSinh); 		
        this.tenLop = tenLop;
		this.tenTruong = tenTruong;
	}
}

Anh/Chị có thể giải thích giúp em là tại sao viết theo 2 cách trên lại không được không ạ? Em cảm ơn

1 Like

java nó tự gọi đến constructor mặc định ở cha nếu ở con không gọi, và nếu 1 lớp ko tự khai báo 1 constructor thì java cũng tự tạo 1 constructor mặc định , ở đây lớp cha bạn đã tạo 1 constructor rồi, nên nó ko tạo constructor mặc định nữa, lúc này ở con nếu ko trực tiếp gọi đến constructor ở cha, thì nó sẽ báo lỗi vì bắt buộc khi khởi tạo con thì phải khởi tạo cha trước

3 Likes

Java có một số cái thực hiện auto, đây là điểm mình không thích:

  • Tự động thêm default ctor (constructor) nếu class không có ctor nào
  • Trong ctor, tự động thêm dòng super(); ở đầu nếu không có lệnh super(...) nào

Trường hợp của bạn, do class ConNguoi bạn đã có ctor, nên Java không tạo thêm empty ctor. Và ctor của HocSinh không có dòng nào gọi super(...), nên Java sẽ thêm 1 dòng super(); gọi tới empty ctor của ConNguoi.

Tới đây chắc bạn đã hiểu rồi.

5 Likes

Mình đã tìm thấy ở đây

2 Likes

Đã có người thắc mắc giống bạn

2 Likes

Personally I don’t think @tonghoangvu is wrong here.
Probably Joe just misunderstood what @tonghoangvu mentioned because of language barrier.

From the doc:

Note: If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error. Object does have such a constructor, so if Object is the only superclass, there is no problem.

It matches what @tonghoangvu explained, and clearly explain the compiler behavior (scream “Implicit super constructor ConNguoi() is undefined. Must explicitly invoke another constructor”).

4 Likes

Tôi nghĩ câu trả lời của Joe ở đây hay hơn và có ý nghĩa hơn câu trả lời của bạn.

1 Like

Uhm, cậu nên comment trả lời Joe trên diễn đàn đó chớ mail man? :smile: Tớ không vấn đề gì, và ủng hộ cậu khi cậu comment 1 nhận xét tích cực như vậy về Joe the Java guru trên diễn đàn bên đó, để Joe có thể đọc được :smile: (Disclaim: tớ không nhận mình là Java guru).

Cá nhân tớ không nghĩ cậu hiểu câu trả lời của cả 2 người đâu @anon92144617. @tonghoangvu đã giải đáp câu trả lời của bạn @hoclaptrinh_c. Tớ thực ra khá ngạc nhiên khi Joe cố gắng nói @tonghoangvu sai (tớ có đưa doc và quote rồi - và tớ chỉ quote phần liên quan tới @tonghoangvu nói thôi. Lý do tớ đưa cả link doc để mọi người tham khảo thêm nếu muốn, chứ không phải để cứu ai hay giấu diếm thông tin gì cả - make sense? :smile: ) đưa fact về Object’s nullary constructor và chaining để chỉ ra bạn ấy sai :smile:

Tớ hi vọng cậu có thể nhìn nhận câu trả lời của @tonghoangvu chính xác hơn Joe. Không cần phải là Guru, cậu chỉ cần có 1 logic vừa đủ, để:

  • Nhận ra câu trả lời của @tonghoangvu là vừa đủ để giải đáp thắc mắc của @hoclaptrinh_c.
    Trong ví dụ ở câu hỏi đưa ra, @hoclaptrinh_c đã viết 1 constructor cho super class, và không gọi constructor đó ở subclass, và @tonghoangvu đã giải thích chuyện gì xảy ra đằng sau.
  • Nhận ra câu trả lời của @tonghoangvu phù hợp với diễn giải ở document của Oracle. Cậu cũng có thể đọc và đưa ra quan điểm của cậu.
  • Nhận ra Joe đang cố đánh tráo khái niệm. Tớ có thể kể liệt kê tất cả các fact mà Joe nói về Object’s nullary constructor, về constructor chaining, etc. Những điều đó, hoặc bổ sung cho những gì @tonghoangvu đề cập, hoặc không quá cần thiết khi để cập ở đây, trong phạm vi câu hỏi này.
  • Nhận ra cậu chỉ là người muốn mọi thứ rối tung lên :smile:

Tớ hi vọng, sau câu trả lời này:

  • Cậu dừng vai trò mailman lại. Nó không mang lại lợi ích cho cuộc trò chuyện này.
    Joe là người trưởng thành, cậu ấy có thể tự tạo tài khoản mới và tham gia cuộc trò chuyện này nếu cậu ấy muốn đóng góp, với thái độ xây dựng, vì điều đó tốt cho các bạn trẻ. Hoặc cậu ấy có thể tự biên tự diễn ở diễn đàn bên đó 1 mình với cậu, mà bên này bọn tớ không thực sự để tâm.
    Với điều này, mọi comment tiếp theo của cậu với vai trò mailman, sẽ được coi là off-topic và thiếu thân thiện.
  • Cậu nên trực tiếp comment ủng hộ Joe trên diễn đàn đó, nếu cậu nhận thấy comment của Joe thực sự hữu ích, cùng với sự mỉa mai, công kích cá nhân, đánh tráo khái niệm đó tốt cho sự nghiệp của cậu.
    Điều đó là sự động viên kịp thời cho Joe. Tớ tin là cậu ấy rất cần sự chú ý của ai đó.
  • Cậu có thể open-mind hơn, tôn trọng mọi người hơn, và bớt việc cố gắng tạo ra sự tranh cãi, như cách cậu đang làm :smile:
    Điều này tốt cho chính cậu. Vì cậu sẽ có thời gian để rèn giũa những điều quan trọng hơn 1 cuộc tranh cãi vô bổ (đây không phải tranh luận, như cậu thấy, 2 bên đang có 2 câu chuyện khác nhau).

Vậy nhé! :smile:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?