Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục tìm hiểu về hàm khởi tạo (constructor) trong lập trình hướng đối tượng. Ở bài này, mình sẽ đi qua những nội dung như sau:
Nội dung
1. Hàm khởi tạo là gì?
Một hàm khởi tạo cũng tương tự như một phương thức (nhưng không phải là một phương thức) được gọi tự động khi một đối tượng được khởi tạo.
Trình biên dịch compiler Java phân biệt giữa một phương thức và một hàm khởi tạo bằng tên của nó và kiểu dữ liệu trả về. Trong Java, một hàm khởi tạo có tên giống với tên của class, và không trả về bất kì giá trị nào.
Ví dụ:
class Test {
Test() {
// constructor body
}
}
Ở đây, Test() là một khởi hàm khởi tạo; nó có tên giống với tên của class và không có kiểu trả về.
class Test {
void Test() {
// method body
}
}
Ở đây, Test() cũng có tên giống với tên của class. Tuy nhiên, nó có kiểu trả về void. Do đó, nó là một phương thức chứ không phải là một hàm khởi tạo.
2. Ví dụ về hàm khởi tạo
class Main {
private int x;
// constructor
private Main(){
System.out.println("Constructor Called");
x = 5;
}
public static void main(String[] args){
// constructor is called while creating object
Main obj = new Main();
System.out.println("Value of x = " + obj.x);
}
}
Khi bạn chạy chương trình, kết quả sẽ là:
Constructor Called
Value of x = 5
Ở đây, hàm khởi tạo Main() được gọi khi đối tượng obj được khởi tạo.
Một hàm khởi tạo có thể hoặc không thể chấp nhận các đối số.
3. Hàm khởi tạo không có tham số
Hàm khởi tạo của một lớp có thể không có tham số nào. Cú pháp:
private Constructor() {
// body of constructor
}
- Nếu access modifier là private thì hàm khởi tạo chỉ được sử dụng bên trong lớp đó.
- Nếu access modifier là public thì hàm khởi tạo có thể được sử dụng bên ngoài lớp đó.
3.1. Ví dụ hàm khởi tạo với access modifier là private
class Main {
int i;
// constructor with no parameter
private Main(){
i = 5;
System.out.println("Object created and i = " + i);
}
public static void main(String[] args) {
// calling the constructor without any parameter
Main obj = new Main();
}
}
Khi bạn chạy chương trình, kết quả sẽ là:
Object created and i = 5
Ở đây, hàm khởi tạo Main() không chấp nhận bất kì tham số nào.
3.2. Ví dụ hàm khởi tạo với access modifier là public
class Company {
String domainName;
// public constructor
public Company(){
domainName = "programiz.com";
}
}
public class Main {
public static void main(String[] args) {
// object is created in another class
Company companyObj = new Company();
System.out.println("Domain name = "+ companyObj.domainName);
}
}
Khi bạn chạy chương trình, kết quả sẽ là:
Domain name = programiz.com
4. Hàm khởi tạo có tham số
Hàm khởi tạo trong Java có thể có 1 hoặc nhiều tham số. Cú pháp:
Constructor (arg1, arg2, ..., argn) {
// constructor body
}
Ví dụ:
class Vehicle {
int wheels;
// constructor accepting single value
private Vehicle(int wheels){
this.wheels = wheels;
System.out.println(wheels + " wheeler vehicle created.");
}
public static void main(String[] args) {
// calling the constructor by passing single value
Vehicle v1 = new Vehicle(2);
Vehicle v2 = new Vehicle(3);
Vehicle v3 = new Vehicle(4);
}
}
Khi bạn chạy chương trình, kết quả sẽ là:
2 wheeler vehicle created.
3 wheeler vehicle created.
4 wheeler vehicle created.
Ở đây, chúng ta đã truyền một đối số kiểu int (số các bánh xe) vào hàm tạo trong suốt quá trình khởi tạo đối tượng.
5. Hàm khởi tạo mặc định
Nếu trong lớp không có hàm khởi tạo nào, trình biên dịch Java sẽ tự động tạo ra một hàm khởi tạo không có tham số. Hàm khởi tạo này gọi là hàm khởi tạo mặc định (default constructor).
Ví dụ:
class DefaultConstructor {
int a;
boolean b;
public static void main(String[] args) {
// A default constructor is called
DefaultConstructor obj = new DefaultConstructor();
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
Trong ví dụ trên, lớp DefaultConstructor không có hàm khởi tạo nào được định nghĩa. Trình biên dịch Java sẽ tự động tạo ra hàm default constructor. Hàm này sẽ tự động khởi tạo các thuộc tính với các giá trị mặc định.
Kiểu dữ liệu | Giá trị mặc định |
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | Tham chiếu đến null |
Chương trình trên tương đương với chương trình:
class DefaultConstructor {
int a;
boolean b;
// a private constructor
private DefaultConstructor() {
a = 0;
b = false;
}
public static void main(String[] args) {
// call the constructor
DefaultConstructor obj = new DefaultConstructor();
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
Khi chạy chương trình, kết quả sẽ là:
a = 0
b = false
6. Nạp chồng hàm khởi tạo (constructor overloading)
Trong một lớp, có thể có nhiều hàm khởi tạo cùng tên nhưng khác tham số. Ta gọi đó là nạp chồng hàm khởi tạo (constructor overloading).
Ví dụ:
class Company {
String domainName;
// constructor with no parameter
public Company(){
this.domainName = "default";
}
// constructor with single parameter
public Company(String domainName){
this.domainName = domainName;
}
public void getName(){
System.out.println(this.domainName);
}
public static void main(String[] args) {
// calling the constructor with no parameter
Company defaultObj = new Company();
// calling the constructor with single parameter
Company programizObj = new Company("cafedev.vn");
defaultObj.getName();
programizObj.getName();
}
}
Khi bạn chạy chương trình, kết quả sẽ là:
default
cafedev.vn
7. Các lưu ý quan trọng
- Hàm khởi tạo được khai báo ngầm khi bạn khởi tạo đối tượng.
- Hai nguyên tắc cho việc khởi tạo một hàm tạo là:
- Tên của một hàm khởi tạo Java chắc chắn phải khớp với tên của class.
- Một hàm khởi tạo Java chắc chắn không có kiểu trả về.
- Nếu một class không có hàm khởi tạo nào, trình biên dịch Java sẽ tự động tạo ra một hàm khởi tạo mặc định trong suốt thời gian chạy chương trình.
- Hàm tạo mặc định khởi tạo các biến instance cùng với các giá trị mặc định. Ví dụ như: biến int sẽ được khởi tạo thành 0.
- Các loại hàm khởi tạo:
- Hàm tạo không chấp nhận đối số – hàm tạo không chấp nhận bất kỳ đối số nào
- Hàm tạo mặc định – constructor được trình biên dịch Java tạo tự động nếu nó không được định nghĩa rõ ràng.
- Hàm tạo được tham số hóa – được sử dụng để chỉ định các giá trị cụ thể của các biến trong đối tượng
- Hàm khởi tạo không thể khai báo với từ khóa abstract, static hoặc final.
- Hàm khởi tạo có thể được nạp chồng nhưng không thể được ghi đè trong lớp con khi kế thừa.
8. Kết
Như vậy chúng ta đã tìm hiểu xong cách khởi tạo 1 hàm trong lập trình hướng đối tượng. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn:
https://cafedev.vn/tu-hoc-java-ham-tao-constructor-trong-java/