Mình muốn hỏi chính xác thì default constructor làm gì?
Vì trước đó mình có một vài hiểu lầm về constructor nên ở dưới mình trình bày ý hiểu của mình về constructor nói chung và điều mình confuse.
Định nghĩa:
A constructor is used in the creation of an object that is an instance of a class
(Một constructor được sử dụng trong quá trình tạo object, trước mình nhầm nó để tạo object).
Theo lý thuyết, thì có 2 thành phần được dùng để tạo object là toán tử new & constructor.
Quá trình tạo object:
- toán tử new: cấp phát vùng nhớ cho instance, sau bước này thì đối tượng this tồn tại
- Khởi tạo giá trị cho instance variable
- Gọi hàm constructor
VD: class A{
int x = this.y;
int y = 10;
}
A a1 = new A();
/*
B1: toán tử new: init vùng nhớ cho a1
B2: gán giá trị: this.y lúc này có giá trị 0 nên x = 0, y = 10
y là members variables nên có thể access ở bất cứ đâu trong class,
tức dùng this chấm ra được. Cơ mà this ở đây nằm ngoài constructors,
mà quá trình khởi tạo giá trị cho instance value chạy trước constructor,
tức this tồn tại trước khi call constructor, vậy nên confirm đc constructor ko
phải để tạo đối tượng. Nếu có bắt buộc phải có constructor mới tạo được
instance thì là vì một lý do khác)
B3: gọi constructor
*/
Vậy constructor là một hàm được gọi sau cùng trong quá trình tạo đối tượng, mục đích để khởi tạo giá trị cho thuộc tính mà người dùng mong muốn tác động vào. Vậy thực sự thì, không cần có default constructor thì object vẫn tạo được, nhưng tại sao java lại cung cấp default constructor nếu ko tự định nghĩa, mà nếu tự định nghĩa thì default constructor biến mất? (1)
Tiếp, khai báo một class cha:
public class Parent{
public Parent(Strings){}
}
//vì đã khai báo constructor tự định nghĩa nên default constructor biến mất.
Khai báo class con:
public class Child extends Parent{
}
/*Lỗi biên dịch vì có luật: một constructor nếu không bắt đầu bằng super
hoặc this và ko phải class Object, thì constructor đó sẽ ngầm gọi super(),
tức gọi đến constructor rỗng của class cha trực tiếp của nó. Lỗi biên dịch
xảy ra khi một class có default constructor được tạo ngầm nhưng ở super
class ko có constructor rỗng nào có thể truy cập được.
*/
Vậy khi tạo 1 class con, luôn phải gọi đến constructor rỗng của cha, với mọi trường hợp cuối cùng đều call tới Object(), mà call constructor rỗng thì mình ko thấy có tác dụng gì cả, tại sao phải bắt buộc?
Thanks!!