Object và class trong Java (phần 1)
Giới thiệu
Trong Java, một "class" là một mô tả hoặc mẫu cho các object (object) cụ thể. Class định nghĩa các thuộc tính (biến) và phương thức (hàm) mà object sẽ có. "Object" là một thể hiện cụ thể của một class, chứa dữ liệu và có thể thực hiện các hoạt động được định nghĩa trong class. Class là khuôn mẫu, trong khi object là phiên bản cụ thể của khuôn mẫu đó, cho phép bạn tạo, quản lý dữ liệu và hành vi trong chương trình Java.
Trong lập trình hướng object (OOP), class và object đóng vai trò quan trọng trong việc tổ chức và quản lý code. Dưới đây là một số ứng dụng phổ biến của class và object trong OOP:
-
Tổ chức code: Class giúp tổ chức code thành các module hoặc phân đoạn riêng biệt, tùy theo chức năng. Điều này giúp giảm sự phức tạp của chương trình và tạo điều kiện cho việc quản lý dự án dễ dàng hơn.
-
Tạo object (Object): Class là một bản thiết kế, và object là phiên bản cụ thể được tạo ra từ class. Object chứa dữ liệu và hành vi riêng của nó, cho phép bạn làm việc với các object cụ thể thay vì làm việc trực tiếp với dữ liệu và hàm.
-
Tính kế thừa (Inheritance): OOP cho phép bạn tạo ra các class con dựa trên class cha. Class con kế thừa các thuộc tính và phương thức từ class cha, giúp tái sử dụng code và tạo cấu trúc phân cấp.
-
Tính đa hình (Polymorphism): Object có thể thực hiện các hành vi khác nhau dựa trên class của nó. Điều này cho phép bạn viết code tổng quát cho xử lý các loại object khác nhau.
-
Đóng gói (Encapsulation): Class cho phép bạn ẩn giấu chi tiết tri thức bên trong và chỉ tiết lộ các giao diện công khai. Điều này giúp bảo vệ dữ liệu và hạn chế truy cập trái phép.
-
Trừu tượng (Abstraction): Abstraction là khả năng tạo ra các class trừu tượng đại diện cho các object trong thế giới thực. Nó giúp tạo ra các mô hình trừu tượng và làm cho code dễ đọc và quản lý hơn.
Định nghĩa class
Để hiểu cách định nghĩa một class trong lập trình, ta cùng xem xét ví dụ về một class đơn giản như sau:
public class DongVat {
private String ten;
private String loai;
public DongVat(String ten, String loai) {
this.ten = ten;
this.loai = loai;
}
public void keu(String tiengKeu) {
System.out.println(this.ten + " kêu: " + tiengKeu);
}
public void an(String thucAn) {
System.out.println(this.ten + " đang ăn " + thucAn);
}
public static void main(String[] args) {
DongVat cho = new DongVat("Fido", "Chó");
cho.keu("Gâu gâu!");
cho.an("xương");
DongVat meo = new DongVat("Whiskers", "Mèo");
meo.keu("Meo meo!");
meo.an("cá");
}
}
Trong ví dụ này, ta đã định nghĩa một class có tên là "DongVat" bằng cách sử dụng từ khóa class
. Class này có các thuộc tính (ten
và loai
) cùng với phương thức (keu
và an
) để mô tả động vật.
Ngoài ra, ta cũng tạo hai object từ class "DongVat" (cho
và meo
) và sử dụng các phương thức của object để in ra thông tin về cách mỗi con động vật kêu và ăn thức ăn.
Một số ví dụ
Trong phần này, ta sẽ tìm hiểu một số ví dụ về định nghĩa class và tạo các object.
Ví dụ 1:
Hãy tưởng tượng bạn đang phát triển một ứng dụng quản lý thư viện sử dụng Java. Trong dự án này, bạn có thể sử dụng class "Sach" để định nghĩa sách và các object sách cụ thể là các quyển sách trong thư viện.
Dưới đây là một ví dụ về cách định nghĩa clas "Sach" và tạo các object sách trong ứng dụng thư viện:
// Định nghĩa class Sach
public class Sach {
private String maSach;
private String tenSach;
private String tacGia;
private int namXuatBan;
public Sach(String maSach, String tenSach, String tacGia, int namXuatBan) {
this.maSach = maSach;
this.tenSach = tenSach;
this.tacGia = tacGia;
this.namXuatBan = namXuatBan;
}
public void hienThiThongTin() {
System.out.println("Mã sách: " + maSach);
System.out.println("Tên sách: " + tenSach);
System.out.println("Tác giả: " + tacGia);
System.out.println("Năm xuất bản: " + namXuatBan);
}
public static void main(String[] args) {
// Tạo các object sách
Sach sach1 = new Sach("001", "Java Programming", "John Doe", 2020);
Sach sach2 = new Sach("002", "Data Structures", "Jane Smith", 2019);
// Hiển thị thông tin về các object sách
System.out.println("Thông tin sách 1:");
sach1.hienThiThongTin();
System.out.println("Thông tin sách 2:");
sach2.hienThiThongTin();
}
}
Trong ví dụ này, ta đã định nghĩa class "Sach" để biểu diễn các thuộc tính và hành vi của một quyển sách. Sau đó, ta tạo thêm hai object sách (sach1 và sach2) và sử dụng phương thức "hienThiThongTin" để hiển thị thông tin về mỗi quyển sách.
Trong một ứng dụng thực tế, bạn có thể sử dụng class "Sach" để quản lý thông tin về sách trong thư viện và thực hiện các hoạt động như thêm, xóa, cập nhật và tìm kiếm sách trong cơ sở dữ liệu thư viện.
Ví dụ 2:
Ví dụ về một ứng dụng Quản lý Học sinh trong Java. Trong dự án này, ta sẽ có các class "HocSinh", "LopHoc" và "TruongHoc".
Class "HocSinh" dùng để đại diện cho một học sinh với các thuộc tính như tên, mã số học sinh, điểm số, và phương thức để tính điểm trung bình.
public class HocSinh {
private String ten;
private int maHocSinh;
private double diemToan;
private double diemVan;
public HocSinh(String ten, int maHocSinh, double diemToan, double diemVan) {
this.ten = ten;
this.maHocSinh = maHocSinh;
this.diemToan = diemToan;
this.diemVan = diemVan;
}
public double tinhDiemTrungBinh() {
return (diemToan + diemVan) / 2;
}
}
Class "LopHoc" dùng để đại diện cho một class học với danh sách các học sinh trong class.
import java.util.ArrayList;
import java.util.List;
public class LopHoc {
private String tenLop;
private List<HocSinh> danhSachHocSinh;
public LopHoc(String tenLop) {
this.tenLop = tenLop;
danhSachHocSinh = new ArrayList<>();
}
public void themHocSinh(HocSinh hocSinh) {
danhSachHocSinh.add(hocSinh);
}
}
Class "TruongHoc" để quản lý nhiều class học và thực hiện các hoạt động quản lý.
import java.util.ArrayList;
import java.util.List;
public class TruongHoc {
private String tenTruong;
private List<LopHoc> danhSachLopHoc;
public TruongHoc(String tenTruong) {
this.tenTruong = tenTruong;
danhSachLopHoc = new ArrayList<>();
}
public void themLopHoc(LopHoc lopHoc) {
danhSachLopHoc.add(lopHoc);
}
}
Trong ví dụ này, ta đã xây dựng một hệ thống quản lý học sinh với nhiều class và object. "TruongHoc" quản lý nhiều "LopHoc", mỗi "LopHoc" chứa danh sách "HocSinh".
Tạo một object sử dụng constructor
Constructor (hàm khởi tạo) trong Java là một phương thức đặc biệt được sử dụng để tạo và khởi tạo object của một class. Constructors có một số đặc điểm quan trọng:
- Tên Constructor phải giống với tên của class.
- Constructors không có kiểu trả về (không trả về giá trị).
- Constructors được gọi bằng từ khóa "new" khi tạo một object.
Dưới đây là một ví dụ về một class có constructor trong Java:
public class HocSinh {
private String ten;
private int maHocSinh;
// Constructor
public HocSinh(String ten, int maHocSinh) {
this.ten = ten;
this.maHocSinh = maHocSinh;
}
}
Trong ví dụ trên, ta có một class "HocSinh" với hai thuộc tính ten
và maHocSinh
. Class này có một constructor mà bạn có thể thấy được chữ ký là public HocSinh(String ten, int maHocSinh)
. Constructor này nhận hai tham số, ten
và maHocSinh
, và sử dụng chúng để khởi tạo các thuộc tính của object HocSinh
.
Khi bạn muốn tạo một object từ class "HocSinh", bạn sử dụng constructor như sau:
HocSinh hocSinh1 = new HocSinh("John", 1001);
HocSinh hocSinh2 = new HocSinh("Jane", 1002);
Trong đoạn code trên, ta đã tạo hai object hocSinh1
và hocSinh2
bằng cách sử dụng constructor của class "HocSinh". Constructor này được gọi với các giá trị "John", 1001 và "Jane", 1002 để khởi tạo các object tương ứng.
Constructor mặc định trong Java được tạo tự động khi một class không có bất kỳ constructor nào được xác định. Constructor mặc định là một constructor không có tham số và không có mã thực hiện bên trong nó. Nó có dạng:
public TenClass() {
// Không có code thực hiện bên trong
}
Trong trường hợp không xác định bất kỳ constructor nào cho một class, Java tự động tạo constructor mặc định cho bạn. Đây là một ví dụ minh họa:
public class HocSinh {
private String ten;
private int maHocSinh;
// Constructor mặc định được tạo tự động
public HocSinh() {
// Không có mã thực hiện bên trong
}
}
Trong ví dụ trên, class "HocSinh" có một constructor mặc định được tạo tự động bởi Java vì không có constructor nào khác được xác định. Constructor mặc định không nhận tham số và không thực hiện bất kỳ hành động nào bên trong nó.
Khi bạn tạo một object từ class "HocSinh" và không gọi constructor nào, constructor mặc định sẽ được sử dụng để khởi tạo object:
HocSinh hocSinh = new HocSinh(); // Sử dụng constructor mặc định
Constructor và method (phương thức) là hai khái niệm quan trọng trong lập trình, nhưng chúng có một số sự khác nhau cơ bản:
-
Mục đích:
- Constructor: Dùng để khởi tạo và tạo ra object của class. Constructors được gọi khi bạn tạo một object từ class bằng từ khóa "new".
- Method: Dùng để thực hiện các hành động hoặc tính toán bên trong object. Methods được gọi khi bạn muốn thực hiện một hành động cụ thể trên object.
-
Tên:
- Constructor: Tên constructor phải trùng với tên của class và không có kiểu trả về.
- Method: Có thể có bất kỳ tên nào và có thể có kiểu trả về (hoặc không).
-
Tham số:
- Constructor: Có thể có tham số hoặc không. Constructors thường được sử dụng để khởi tạo các thuộc tính của object.
- Method: Có thể có tham số hoặc không. Methods thực hiện các hành động cụ thể và có thể trả về giá trị (nếu có kiểu trả về).
-
Trả về giá trị:
- Constructor: Không trả về giá trị và không có từ khóa "return".
- Method: Có thể trả về giá trị bằng từ khóa "return".
-
Sử dụng:
- Constructor: Được gọi khi một object mới được tạo bằng từ khóa "new". Constructors chịu trách nhiệm khởi tạo các thuộc tính của object.
- Method: Được gọi khi bạn muốn thực hiện một hành động cụ thể trên object hoặc thực hiện một tính toán cụ thể.
Dưới đây là một ví dụ minh họa:
public class Example {
private int value;
// Constructor
public Example(int value) {
this.value = value;
}
// Method
public void printValue() {
System.out.println("Value: " + value);
}
public static void main(String[] args) {
// Sử dụng constructor để tạo object
Example obj1 = new Example(42);
// Gọi method để thực hiện hành động cụ thể
obj1.printValue();
}
}
Trong ví dụ trên, constructor Example(int value)
được sử dụng để khởi tạo object obj1
, và method printValue()
được gọi để in ra giá trị của value
bên trong object.
Constructor rất hữu ích trong việc khởi tạo các thuộc tính của object và cung cấp khả năng tùy chỉnh việc khởi tạo object dựa trên các tham số đầu vào.
Tổng kết
Trong Java, lập trình hướng đối tượng dựa trên hai khái niệm quan trọng: class và object. Một class định nghĩa cách một object nên được tạo và hoạt động như thế nào, bao gồm các thuộc tính và phương thức của nó. Khi bạn tạo một object từ một class bằng constructor, bạn đang tạo một phiên bản cụ thể của object đó. Điều này cho phép bạn quản lý dữ liệu và thực hiện các hoạt động cụ thể trên object đó. Class và object là cơ sở của lập trình hướng đối tượng trong Java, giúp bạn tạo và quản lý code một cách có tổ chức và có tính tái sử dụng.
©️ Tác giả: Trần Quang Hiệp từ Viblo
All Rights Reserved