Trong bài viết này, chúng ta sẽ tìm hiểu về constructor của một đối tượng, làm thế nào để tạo ra chúng, sự khác nhau giữa constructor mặc định và constructor do chúng ta định nghĩa và cuối cùng overloaded constructor là gì các bạn nhé!
Định nghĩa constructor
Trong Java, constructor là một phương thức đặc biệt, nó được dùng để khởi tạo và trả về đối tượng của lớp mà nó được định nghĩa. Constructor sẽ có tên trùng với tên của lớp mà nó được định nghĩa và chúng không được định nghĩa một kiểu giá trị trả về.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava; public class Student { private String name; private int age; public Student(String name) { this.name = name; } } |
Trong ví dụ trên, chúng ta đã định nghĩa một constructor cho đối tượng Student, như các bạn thấy nó không có kiểu giá trị trả về và tên của nó trùng tên với lớp mà nó được định nghĩa.
Khi một đối tượng được khởi tạo bằng cách gọi constructor của nó với toán tử new thì nó sẽ gọi constructor của lớp cha và tất cả các instance variable sẽ được khởi tạo với giá trị mặc định của nó. Trở lại ví dụ trên thì khi khởi tạo đối tượng Student bằng cách gọi:
1 2 3 4 5 6 7 8 |
package com.huongdanjava; public class Example { public static void main(String[] args) { Student student = new Student("Khanh"); } } |
thì giá trị của biến age trong đối tượng Student sẽ có giá trị mặc định của kiểu int là 0.
Constructor mặc định
Nếu trong một đối tượng, chúng ta không định nghĩa một constructor nào cả thì mặc định Java sẽ thêm một constructor mặc định vào đối tượng của chúng ta.
Ví dụ, mình định nghĩa đối tượng Student như sau:
1 2 3 4 5 6 7 |
package com.huongdanjava; public class Student { private String name; private int age; } |
Lúc này, mình có thể khởi tạo đối tượng Student bằng cách:
1 2 3 4 5 6 7 8 |
package com.huongdanjava; public class Example { public static void main(String[] args) { Student student = new Student(); } } |
Rõ ràng các bạn thấy, mặc dù mình không định nghĩa bất kỳ constructor nào trong đối tượng Student nhưng mình vẫn có thể khởi tạo đối tượng này.
Constructor mặc định sẽ không chứa bất kỳ tham số nào và khi được gọi để khởi tạo đối tượng, nó cũng gọi constructor của lớp cha và khởi tạo giá trị mặc định cho các instance variable.
Trong trường hợp chúng ta đã định nghĩa một constructor cho đối tượng:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava; public class Student { private String name; private int age; public Student(String name) { this.name = name; } } |
thì Java sẽ không tự động thêm constructor mặc định nữa và khi đó nếu chúng ta cố gắng khởi tạo đối tượng bằng constructor mặc định thì sẽ bị lỗi compile ngay:
Định nghĩa một constructor
Chúng ta có thể định nghĩa constructor cho một đối tượng bất kỳ, khi đó tất cả các thuộc tính của đối tượng bao gồm các phương thức, các instance variable có thể được gọi tùy theo định nghĩa của chúng ta.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava; public class Student { private String name; private int age; public Student(String name) { this.name = name; age = 30; } } |
Chúng ta có thể sử dụng bốn access modifier để định nghĩa cho một constructor, và do vậy chúng ta có thể giới hạn phạm vi truy cập của đối tượng từ những đối tượng khác.
Điều gì sẽ xảy ra nếu chúng ta định nghĩa một constructor với một kiểu giá trị trả về? Khi đó, Java sẽ coi nó như là một phương thức bình thường chứ không phải là một constructor.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava; public class Student { private String name; private int age; public void Student(String name) { this.name = name; age = 30; } } |
Đối tượng Student lúc này chỉ có một constructor mặc định do Java thêm vào mà thôi. Nếu chúng ta khởi tạo đối tượng Student với một tham số name thì sẽ bị lỗi ngay.
Overloaded constructor
Overloaded constructor là gì? Đó là khi chúng ta định nghĩa nhiều constructor cho một đối tượng và mỗi constructor sẽ có các tham số khác nhau cả về số lượng tham số lẫn kiểu dữ liệu của tham số.
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.huongdanjava; public class Student { private String name; private int age; public Student(int age) { this.age = age; } public Student(String name) { this.name = name; } public Student(String name, int age) { this.name = name; this.age = age; } } |
Nguyên tắc để định nghĩa overloaded constructor là:
- Các constructors, như mình đã nói, phải được định nghĩa sử dụng các tham số khác nhau cả về số lượng tham số lẫn kiểu dữ liệu của tham số.
- Các constructor không được định nghĩa chỉ khác nhau ở access modifier.
Trong trường hợp đối tượng có nhiều constructor và chúng ta muốn gọi constructor này từ constructor khác thì bắt buộc chúng ta phải sử dụng từ khóa this như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.huongdanjava; public class Student { private String name; private int age; public Student(int age) { this.age = age; } public Student(String name) { this.name = name; } public Student(String name, int age) { this(name); this.age = age; } } |
Câu lệnh this để gọi constructor khác này bắt buộc phải nằm ở dòng đầu tiên của constructor, nếu nó nằm sau một câu lệnh bất kỳ thì code chúng ta sẽ bị lỗi compile ngay:
Quang Nguyễn Văn
Anh ơi cho em hỏi làm thế nào để hủy được phương thức khởi tạo Constructor khi nó không thỏa manz 1 điều kiện nào đó.
Ví dụ như không cho khởi tạo một phân số khi mẫu số bằng 0 ạ. Em cảm ơn!
Việt Anh
Bài bạn viết rất hay về dễ hiểu, mong có nhiều series hay về java hơn nữa!
Khanh Nguyen
Thanks bạn.
Long
Cho e hỏi constructor dược sử dung nhìu ko ạ
Khi nào nên sử dụng ad
Em đọc xong mà không rõ lắm
Khanh Nguyen
Tất nhiên là nhiều rồi em ơi.
Hoan
public final long id;
private String summary;
private Boolean done;
private Date dueDate;
public Todo() {
this(-1);
}
public Todo(long i) {
this(i, “”);
}
public Todo(long i, String summary) {
this.id = i;
this.summary = summary;
}
Bạn ơi giải thích dùm mình những contructor này với mình không h iểu 2 contructor đầu
Lan anh
Cho e hỏi contructor nãy dùng để làm gì ạ:
Public class Person{
private String name;
public Person (Person person){
this(person.getName());
}
}
Khanh Nguyen
Có gì đó sai sai em nhỉ? Class của em ko có constructor Person(String name).
vu hien
constructor là gì ak anh ơi..cơ chế hoạt động của nó ak
Khanh Nguyen
Bài viết của mình chưa đủ hiểu hả bạn ơi? Bạn đang thắc mắc chỗ nào thì hỏi mình nhé!
Trần Nguyên
Cho t hỏi là, trong 1 bài có 3 Constructor như thế này: View(Context context); View(Context context, AttributeSet attrs); View(Context context, AttributeSet attrs, int defStyleAttr), nghĩa là thế nào, có tác dụng gì và khi nào thì dùng Constructor kiểu đó? Cảm ơn
Khanh Nguyen
Chào bạn,
Việc định nghĩa nhiều Constructors trong một class là do nhu cầu của chúng ta, do bài toán mà chúng ta đang giải quyết. Java hỗ trợ cho chúng ta làm điều đó.
Bạn có thể không định nghĩa những Constructors kiểu đó cũng được, trong trường hợp này bạn sẽ cần dùng các phương thức Setters để gán các giá trị mà bạn sẽ sử dụng trong class của bạn.
Có gì thắc mắc, cứ đặt câu hỏi nhé bạn!