30/09/2018, 18:56

Constructor trong Java

Xin mọi người chỉ dạy giúp em cái này. Em có đoạn code bên dưới lấy từ một bài học. Xin mọi người cho em hỏi tại sao bên trong public Sup40(){} mặc định là super();?
Em không hiểu super() ở đâu lấy ra mà em chỉ thấy có public Super40(int a).
public class constructor {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	Sup40 sup = new Sup40();
}

}
class Super40 {
public Super40(int a) {

	}
}

class Sup40 extends Super40 {

	public Sup40() {
		// super(); mac dinh la ham nay
		super(3);
	}

Tiện thể cho em hỏi sao em ctrl+ k code mà không được nhỉ?
Em xin cảm ơn mọi người!

Võ Anh Kiệt viết 21:07 ngày 30/09/2018

super();

nó sẽ call tới constructor cha, ở đây sẽ gọi tới

public Super40(){
}

Nếu super(3);

thì nó sẽ call tới constructor cha như sau :

public Super40(int value){
// ở đây value của cha khi truyền lên sẽ là = 3
}

Lưu ý : thằng cha phải khai báo các contructor sẵn, ngoại trừ default thì không cần

Bảo Ngọc viết 21:08 ngày 30/09/2018

super();

Nhưng em vẫn không hiểu là code ở trên đâu có đoạn nào tạo ra super(); đâu ạ, vậy mà khi sử dụng mà không báo lỗi. Hay nó là một phương thức trong một thư viện nào đó của java có sẵn và mỗi khi code như trên nó sẽ mặc định suất hiện và call tới cóntructor cha ạ?

Võ Anh Kiệt viết 21:06 ngày 30/09/2018

super() là mặc định rồi bạn

Tức là nó gọi tới constructor cha mặc định mà không cần phải viết hoặc khai báo ra !

Super40() {
}

Cương Nguyễn viết 21:06 ngày 30/09/2018

Đây là kế thừa, khi em kế thừa từ 1 Class, để gọi hàm contructor của class Cha đó thì sử dụng từ khóa super.
Đặc điểm:

  • Phải là dòng dầu tiên trong hàm constructor của class Con, từ dòng thứ 2 trở đi sẽ không hiểu -> compile fail
  • Mặc định là gọi super(); dù không khai báo, nếu khai báo thì thay thế hàm này vd super(3);

Ngoài ra, để gọi hàm contructor khác của class Con, dùng từ khóa this. Đặc điểm tương tự như super.

Interns viết 20:57 ngày 30/09/2018

tại sao bên trong public Sup40(){} mặc định là super();?

constructor của Sup40 không thể gọi super(); được vì ở class cha là Super40 không có constructor mặc nhiên là public Super40(){};
Bởi vì, constructor mặc nhiên chỉ tự động sinh ra bởi compiler nếu class đó chưa có khai báo 1 constructor nào (mà ở đây ta đã khai báo constructor public Super40(int a) {}; )

  • Constructor mặc nhiên sẽ tự động sinh ra nếu class đó chưa có constructor nào cả (compiler sẽ thay thế ta làm việc này).

  • Constructor mặc nhiên luôn luôn không có tham số.

  • Nếu không có lời gọi tường minh đến constructor của class cha tại class con thì compiler sẽ tự động chèn lời gọi tới Constructor mặc nhiên của class cha trước khi thực thi các đoạn code trong Constructor của class con.

Bảo Ngọc viết 21:01 ngày 30/09/2018

Em đã thông. Em xin cảm ơn mọi người đã chỉ dạy ạ

Bài liên quan
0