Tài Liệu Học Phần: Lập Trình Hướng Đối Tượng Trong Java (Mã Học Phần: IS216 - Chương 2)


Tổng quan về giáo trình

Tài liệu bài giảng học phần IS216 - Lập trình Java (trọng tâm là Chương 2: Lập trình Hướng đối tượng - OOP) là tài liệu giảng dạy thuộc khối kiến thức cơ sở ngành Công nghệ Thông tin và Hệ thống Thông tin bậc đại học. Chương học này đóng vai trò bản lề trong toàn bộ học trình, chuyển tiếp tư duy lập trình của người học từ phương pháp cấu trúc sang mô hình hướng đối tượng trên nền tảng ngôn ngữ Java.

Mục tiêu học tập của chương bao gồm:

  • Phân biệt rõ ràng phương pháp giải quyết vấn đề từ trên xuống (top-down approach) của lập trình hướng cấu trúc với phương pháp tiếp cận từ dưới lên (bottom-up approach) của lập trình hướng đối tượng.
  • Hiểu và vận dụng 4 nguyên tắc trụ cột (4 basic pillars) của OOP: Trừu tượng hóa (Abstraction), Đóng gói (Encapsulation), Kế thừa (Inheritance), và Đa hình (Polymorphism).
  • Nắm vững kỹ thuật khai báo lớp (class), khởi tạo đối tượng (object/instance), tổ chức thuộc tính (attributes) và phương thức (methods).
  • Làm chủ hệ thống kiểm soát quyền truy cập (Access Modifiers) và các từ khóa bổ trợ (Non-access Modifiers).
  • Cài đặt thành thạo hàm khởi tạo (Constructor), phân biệt cơ chế nạp chồng phương thức (Method Overloading) và ghi đè phương thức (Method Overriding), sử dụng biến tham chiếu this.

Cách tiếp cận của tài liệu đi từ trực quan hóa thế giới thực sang mô hình hóa dữ liệu trừu tượng, sau đó cụ thể hóa bằng cú pháp chuẩn của Java, đi kèm các ví dụ thực tế như quản lý thực thể Sinhvien, phương tiện Ô tô, hoặc các phép toán số học OverloadingExample.


Nội dung kiến thức cốt lõi

Các chủ đề chính trong chương

1. Tổng quan về Lập trình Hướng đối tượng và So sánh phương pháp luận

  • Bản chất của OOP: Lập trình hướng đối tượng là phương pháp (bao gồm cả thiết kế và phát triển) dựa trên kiến trúc lớp (class) và đối tượng (object).
  • So sánh Top-down và Bottom-up:
    • Phương pháp Top-down (Lập trình cấu trúc): Xác định chức năng chính của chương trình rồi phân rã thành các đơn vị nhỏ hơn đến mức thấp nhất. Ví dụ mô hình: Xây dựng tòa nhà 10 tầng của khách sạn, sau đó thiết kế từng tầng lầu, phòng ốc và phòng họp.
    • Phương pháp OOP (Bottom-up): Tập trung trước hết vào cấu trúc dữ liệu và mô hình hóa đối tượng từ thực tế; gắn kết phương thức xử lý với dữ liệu đó; che giấu thông tin bên trong đối tượng để quản lý sự phức tạp của thế giới thực. Ví dụ mô hình: Xây dựng các phòng trung bình, phòng sang trọng, phòng họp lớn, rồi ghép thành khách sạn hoàn chỉnh.
  • 4 nguyên tắc trụ cột (4 basic pillars):
    1. Abstraction (Trừu tượng hóa): Tạo ra các lớp đại diện cho các khái niệm thực tế bằng cách chỉ tập trung vào các đặc tính cốt lõi.
    2. Encapsulation (Đóng gói): Gom dữ liệu và các hàm thao tác liên quan vào một đơn vị, che giấu dữ liệu để ngăn chặn truy nhập tự do trái phép từ bên ngoài.
    3. Inheritance (Kế thừa): Tái sử dụng và mở rộng các thuộc tính, hành vi từ lớp cha sang lớp con.
    4. Polymorphism (Đa hình): Khả năng thực thi cùng một phương thức theo các cách thức khác nhau tùy thuộc vào ngữ cảnh đối tượng.

2. Khái niệm cơ bản về Lớp và Đối tượng

  • Lớp (Class): Khuôn mẫu (template), bản mô tả những tính chất và hành vi chung của một tập hợp các sự vật, hiện tượng tồn tại trong thực tế (ví dụ: các lớp Con người, Sinh viên, Lớp học, Môn học, Phòng học, Ô tô). Lớp là một kiểu dữ liệu do người dùng định nghĩa.
  • Đối tượng (Object): Thực thể cụ thể trong thế giới thực có định danh (identity), thuộc tính (attributes/states) và hành vi (behaviors/operations). Mỗi đối tượng cụ thể là một thể hiện (instance) sinh ra từ khuôn mẫu lớp (ví dụ: sinh viên Nguyễn Văn A có MSSV TH0701001 là một thể hiện của lớp Sinhvien).
  • Hệ thống các đối tượng: Tập hợp các đối tượng độc lập, mỗi đối tượng đảm trách một công việc cụ thể, tương tác và trao đổi thông tin với nhau qua thông điệp (gọi phương thức), hỗ trợ xử lý phân tán hoặc song song.

3. Cấu trúc khai báo Lớp và Thành phần trong Java

Cú pháp cơ bản của một lớp trong Java:

class <ClassName> {
    <danh sách thuộc tính>
    <các khởi tạo>
    <danh sách các phương thức>
}
  • Thuộc tính: Thành phần dữ liệu đại diện cho trạng thái của đối tượng. Khai báo bên trong lớp kèm phạm vi truy cập:
    <Tiền tố> <kiểu dữ liệu> <tên thuộc tính>;
    
    Ví dụ: Lớp Ô tô có các thuộc tính Màu sắc, Vận tốc.
  • Phương thức: Các hàm xác định hành vi và chức năng xử lý của đối tượng, tương tác trực tiếp lên thuộc tính để làm thay đổi trạng thái của đối tượng:
    <Tiền tố> <kiểu trả về> <tên phương thức>(<các đối số>) {
        // Thân phương thức
    }
    
    Ví dụ: Lớp Ô tô có các phương thức Tăng tốc, Giảm tốc.

4. Phân loại Mức độ truy cập (Modifiers)

  • Access Modifiers: Xác định phạm vi hiển thị và quyền truy cập của biến, phương thức, constructor hoặc lớp:
    • private: Chỉ cho phép truy cập nội bộ bên trong cùng một lớp.
    • default (không khai báo từ khóa): Cho phép truy cập trong cùng một gói (package).
    • protected: Cho phép truy cập trong cùng gói và trong các lớp dẫn xuất (lớp con) ở khác gói.
    • public: Cho phép truy xuất tự do từ bất kỳ đâu. (Lưu ý: Đối với khai báo cấp độ lớp (class), chỉ được sử dụng 2 access modifiers là public và default).
Phạm vi truy xuất private default protected public
Cùng class Yes Yes Yes Yes
Cùng package, khác class No Yes Yes Yes
Class con trong cùng package với class cha No Yes Yes Yes
Khác package, khác class No No No Yes
Class con khác package với class cha No No Yes Yes
  • Non-access Modifiers:
    • static: Thành phần lớp dùng chung cho tất cả các thể hiện, thực thi mà không cần tạo đối tượng.
    • final: Ngăn chặn việc ghi đè phương thức hoặc kế thừa lớp.
    • abstract: Lớp hoặc phương thức trừu tượng, không có phần thân code, bắt buộc cài đặt ở lớp con.
    • synchronized: Dùng trong lập trình đa luồng (multithreading) để ngăn các tác động đồng thời lên đối tượng.
    • Các từ khóa khác: native, volatile, transient.

5. Hàm khởi tạo (Constructor)

  • Định nghĩa: Phương thức đặc biệt cùng tên với lớp, không có kiểu trả về, tự động thực thi khi khởi tạo đối tượng bằng từ khóa new.
  • Quy tắc:
    • Nếu không khai báo constructor nào, trình biên dịch tự động cung cấp một constructor mặc định không tham số.
    • Nếu đã khai báo một constructor có tham số (ví dụ: Sinhvien(String ma, String ten)), constructor mặc định không đối số sẽ bị vô hiệu hóa trừ khi được định nghĩa tường minh:
    class Sinhvien {
        Sinhvien() {} // Khai báo tường minh constructor mặc định
        Sinhvien(String maSv, String tenSv) { /*...*/ } // Constructor có đối số
    }
    

6. Cơ chế Đa hình: Overloading và Overriding

Chương học phân định chi tiết hai kỹ thuật định nghĩa phương thức trong Java:

Tiêu chí Ghi đè phương thức (Method Overriding) Nạp chồng phương thức (Method Overloading)
Hành vi Thay đổi hành vi hiện tại của phương thức được kế thừa. Thêm hoặc mở rộng các hành vi khác nhau cho tên phương thức.
Bản chất Đa hình Thể hiện tính đa hình tại thời điểm chạy (Run-time Polymorphism). Thể hiện tính đa hình tại thời điểm biên dịch (Compile-time Polymorphism).
Danh sách tham số Bắt buộc phải giống nhau hoàn toàn về số lượng và kiểu dữ liệu. Bắt buộc phải khác nhau về số lượng tham số hoặc kiểu dữ liệu tham số.
Quyền truy cập Phương thức lớp con phải có quyền truy cập bằng hoặc rộng hơn lớp cha. Các phương thức nạp chồng có thể có quyền truy cập hoàn toàn độc lập.
Giá trị trả về Bắt buộc phải giống nhau (hoặc kiểu đồng biến). Có thể khác nhau hoặc giống nhau.
Phạm vi xảy ra Xảy ra giữa 2 lớp có quan hệ kế thừa (extends). Xảy ra trong phạm vi cùng một lớp.

Minh họa Overloading:

public class OverloadingExample {
    static int add(int a, int b) { return a + b; }
    static int add(int a, int b, int c) { return a + b + c; }
}

Minh họa Overriding:

class Animal {
    void eat() { System.out.println("Animal is eating..."); }
}
class Dog extends Animal {
    void eat() { System.out.println("eating bread."); }
}

7. Biến tham chiếu this và Cặp phương thức Accessor / Mutator

  • this: Biến ẩn trỏ đến chính thể hiện hiện tại của lớp, cho phép phân biệt giữa thuộc tính lớp và biến cục bộ/tham số khi bị trùng tên. this không thể sử dụng bên trong các khối lệnh hoặc phương thức static.
  • Cài đặt cơ chế đóng gói thông qua các phương thức Getter/Setter:
class Sinhvien {
    private String maSv, tenSv, dcLienlac;
    private int tuoi;

    // Mutator Method (Setter)
    public void setmaSV(String maSv) {
        this.maSv = maSv;
    }

    // Accessor Method (Getter)
    public String getmaSV() {
        return this.maSv;
    }
}

Phương pháp giảng dạy và học tập

  • Phương pháp sư phạm: Kết hợp thuyết giảng lý thuyết mô hình hóa hướng đối tượng với phương pháp giải thích trực quan mã nguồn. Tài liệu sử dụng các so sánh đối chiếu giữa tư duy cấu trúc truyền thống và tư duy hướng đối tượng để người học nhận diện rõ lý do chuyển đổi mô hình.
  • Tình huống nghiên cứu và bài tập mẫu:
    • Tình huống phân tích hệ thống thực tế: Phân tích cấu trúc xây dựng tòa nhà khách sạn để làm rõ cách tư duy phân rã đơn vị chức năng (Top-down) so với cách tư duy gom nhóm dữ liệu và hành vi đối tượng (OOP Bottom-up).
    • Mô hình quản lý sinh viên: Cài đặt lớp Sinhvien với các trường thông tin maSv, tenSv, tuoi, dcLienlac, cài đặt phương thức nạp chồng xemThongTinSV(), xemThongTinSV(String psMaSv) và kiểm thử việc truy cập trường private từ bên ngoài để quan sát lỗi biên dịch.
    • Mô hình đa hình động vật: Cài đặt lớp cha Animal và lớp con Dog mở rộng với phương thức eat() nhằm minh họa cơ chế ghi đè.
  • Phương pháp tự học và thực hành:
    • Người học chủ động viết lại các đoạn mã nguồn trong bài giảng trên môi trường phát triển (IDE).
    • Thực nghiệm tự tạo các trường hợp gây lỗi biên dịch: cố tình truy xuất trực tiếp biến thành viên private như sv.maSv = "TH0601001" ngoài phạm vi lớp để ghi nhận cơ chế bảo vệ của Java; khởi tạo new Sinhvien() khi lớp đã có constructor tham số mà thiếu constructor mặc định để hiểu rõ quy tắc nạp chồng constructor.

Điểm nổi bật và tính hệ thống của tài liệu

  • Chuẩn hóa hệ thống bảng phân loại quyền truy cập: Toàn bộ hệ thống kiểm soát quyền truy cập của Java được tổng hợp thành ma trận đối chiếu 4 chiều (private, default, protected, public) tương ứng với 5 phạm vi môi trường (cùng class, cùng package, lớp con cùng package, khác package khác class, lớp con khác package).
  • Chuẩn hóa tiêu chí so sánh kỹ thuật: Cung cấp bảng phân tích đối chiếu rành mạch giữa Overriding và Overloading dựa trên 6 tiêu chí kỹ thuật cụ thể (hành vi, thời điểm thể hiện tính đa hình, quy tắc danh sách tham số, phạm vi quyền truy cập, quy tắc kiểu trả về, và phạm vi kế thừa).
  • Phân định rõ ràng các từ khóa điều khiển đặc thù: Không chỉ dừng lại ở các bổ từ truy cập cơ bản, tài liệu còn liệt kê và giải thích nguyên lý hoạt động của nhóm Non-access Modifiers phục vụ cho các kiến thức nâng cao như đa luồng (synchronized), bất biến (final), trừu tượng (abstract), và thành phần tĩnh cấp độ lớp (static).

Đối tượng sử dụng giáo trình

  • Sinh viên chuyên ngành: Dành cho sinh viên năm thứ hai chuyên ngành Công nghệ Thông tin, Kỹ thuật Phần mềm, Hệ thống Thông tin đang theo học học phần IS216 - Lập trình Java.
  • Điều kiện tiên quyết (Prerequisites): Người học cần hoàn thành học phần Nhập môn lập trình hoặc Lập trình cơ bản (nắm vững cú pháp cơ sở, kiểu dữ liệu nguyên thủy, cấu trúc điều khiển rẽ nhánh if/else, vòng lặp for/while, mảng).
  • Giảng viên giảng dạy: Dùng làm khung giáo án chi tiết và đề cương bài giảng lý thuyết kết hợp thực hành trên lớp cho nội dung OOP trong Java.
  • Tài liệu tham khảo cho người tự học: Phù hợp cho lập trình viên muốn chuẩn hóa lại nền tảng lập trình hướng đối tượng, nắm chắc cơ chế hoạt động của máy ảo và cú pháp chuẩn của ngôn ngữ Java.

Câu hỏi thường gặp

1. Chương học này tập trung giải quyết vấn đề gì?

Chương 2 giải quyết toàn diện nền tảng lập trình hướng đối tượng trên ngôn ngữ Java, bao gồm cách trừu tượng hóa dữ liệu thành các Class, quản lý vòng đời đối tượng thông qua Constructor, kỹ thuật đóng gói bảo vệ dữ liệu với Access Modifiers, và áp dụng tính đa hình thông qua Overloading và Overriding.

2. Người học cần chuẩn bị kiến thức nền tảng nào trước khi học chương này?

Cần nắm vững các khái niệm lập trình cơ bản: các kiểu dữ liệu cơ sở (int, String, float...), cấu trúc điều kiện, vòng lặp và khái niệm hàm/thủ tục trong các ngôn ngữ lập trình cấu trúc như C.

3. Constructor mặc định hoạt động như thế nào khi đã có constructor có tham số?

Khi trong lớp không khai báo bất kỳ constructor nào, Java sẽ tự động cung cấp một constructor mặc định không tham số. Tuy nhiên, nếu lập trình viên đã chủ động khai báo ít nhất một constructor có tham số (ví dụ Sinhvien(String maSv)), thì constructor mặc định sẽ biến mất. Muốn sử dụng cú pháp new Sinhvien(), lập trình viên bắt buộc phải tự khai báo tường minh Sinhvien() {} trong mã nguồn.

4. Sự khác biệt cốt lõi giữa Overloading và Overriding là gì?

  • Overloading (Nạp chồng): Xảy ra trong cùng một lớp, các phương thức cùng tên nhưng khác nhau về danh sách tham số; là đa hình tại thời điểm biên dịch (compile-time).
  • Overriding (Ghi đè): Xảy ra giữa lớp cha và lớp con trong quan hệ kế thừa, phương thức lớp con định nghĩa lại hoàn toàn trùng tên và trùng danh sách tham số với lớp cha; là đa hình tại thời điểm chạy (runtime).

5. Từ khóa this có thể dùng trong phương thức static không?

Không. Từ khóa this đại diện cho thể hiện (đối tượng cụ thể) đang thực thi. Trong khi đó, các phương thức hoặc khối lệnh static thuộc về cấp độ lớp (class-level), tồn tại và hoạt động độc lập ngay cả khi chưa có bất kỳ đối tượng nào được tạo ra, do đó this không tồn tại trong ngữ cảnh static.


Kết luận

Chương 2 của giáo trình IS216 - Lập trình Java thiết lập nền tảng lý thuyết và kỹ thuật thực thi của mô hình lập trình hướng đối tượng. Bằng việc phân tích cấu trúc Class, Object, hệ thống phân quyền Access Modifiers, cơ chế Constructor, phương thức this, cùng hai kỹ thuật đa hình Overloading và Overriding, tài liệu trang bị đầy đủ các quy chuẩn lập trình Java cho người học.

Để hoàn thành lộ trình học tập của học phần IS216, sinh viên cần nắm vững toàn bộ kiến thức trong chương này trước khi tiếp tục chuyển sang các chủ đề nâng cao ở các chương kế tiếp như kế thừa chuyên sâu, xử lý ngoại lệ (Exception Handling), và lập trình đa luồng (Multithreading với synchronized).