NỘI DUNG BÀI HỌC

✳️ Giới thiệu Java OOP hướng đối tượng (Object Oriented Programing)
✳️ Tính Kế thừa trong Java (Inheritance)
✳️ Tính Đóng gói trong Java (Encapsulation)

✅ Tính kế thừa trong Java

Phần này chúng ta sẽ tìm hiểu những vấn đề sau:

  • Khái niệm kế thừa
  • Khai báo và sử dụng kế thừa
  • Chú ý về kế thừa

Khái niệm kế thừa

Kế thừa có nghĩa là thừa hưởng lại, ví dụ như tài sản của ba mẹ sẽ được giao lại cho con cái.

Kế thừa trong lập trình (Inheritance) có nghĩa là một lớp sẽ thừa hưởng lại những thuộc tính, phương thức từ lớp khác.

Việc sử dụng kế thừa nhằm tái sử dụng code đã viết trước đó, thuận tiện trong việc bảo trì và nâng cấp chương trình.


Khai báo và sử dụng kế thừa

Cú pháp:

class <tên lớp con> extends <tên lớp cha> {

}

Ví dụ: ta có 2 lớp Person và Student như sau

[Selenium Java] Bài 2: Java OOP | Anh Tester


Class Person:

public class Person {

    public String name;
    public int age;
    public float height;

    public Person(String name, int age, float height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public void getInfo() {
        System.out.println("Name:" + this.name);
        System.out.println("Age:" + this.age);
        System.out.println("Height:" + this.height);
    }
}


Class Student:

public class Student {

    public String name;
    public int age;
    public float height;

    public Student(String name, int age, float height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public void getInfo() {
        System.out.println("Name:" + this.name);
        System.out.println("Age:" + this.age);
        System.out.println("Height:" + this.height);
    }
}

 

Ta thấy 2 lớp Person và Student có chung thuộc tính và phương thức. Ta sẽ giữ nguyên code ở lớp Person lại

Bây giờ mình chỉ cần cho lớp Student kế thừa Person như sau:


public class Student extends Person{

	public Student(String name, int age, float height) {
		super(name, age, height);
	}	
}

Trong phương thức khởi tạo Student, ta sẽ dùng từ khóa super để cho lớp con truy cập các những thứ liên quan đến lớp cha. Như ví dụ trên thì ta dùng super(name, age, height) để gọi phương thức khởi tạo lớp cha. Chổ này BẮT BUỘC phải như vậy vì trong Java quy định.

Cái tên name, age, height trong super không cần phải giống tên với lớp Cha mà nó chỉ cần mapping kiểu dữ liệu với nhau là được.


Tiếp theo, ta thử khởi tạo đối tượng cho lớp Student và gọi phương thức getInfo() ở main để chạy:

public class Student extends Person {

    public Student(String name, int age, float height) {
        super(name, age, height);
    }

    public static void main(String[] args) {
        Student student = new Student("Nhung", 40, 160);
        student.getInfo();
    }

}

Theo kết quả, đối tượng student của lớp Student sử dụng được phương thức getInfo() từ lớp cha Person:

Name:Nhung
Age:40
Height:160.0

 


Chú ý về kế thừa

Slogan đặc trưng kế thừa: “Cha có thì con có, con có chưa chắc cha đã có

Tính chất kế thừa các ngôn ngữ lập trình hướng đối tượng đa số đều tương đồng với nhau về tính chất. Có thể các bạn không nhớ khái niệm và cú pháp, nhưng chỉ cần hiểu câu nói trên là bạn đã hiểu về kế thừa.

Ví dụ: Như ví dụ trước thì lớp Student kế thừa Person, ngoài những thuộc tính kế thừa ra, ta muốn thêm thuộc tính universityName cho Student


public class Student extends Person {
	
	public String universityName;

	public Student(String name, int age, float height, String universityName) {
		super(name, age, height);
		this.universityName = universityName;
	}	
}

Như vậy theo đúng tính chất: lớp cha Person có name, age, height thì lớp con Student có. Lớp con Student có universityName thì lớp cha Person không có.


Tận dụng từ khóa super để bảo trì và nâng cấp code

Từ khóa super mục đích chính truy cập những phương thức của lớp cha. Trong việc phát triển phần mềm, ta cần nâng cấp chương trình. Việc tận dụng từ khóa super sẽ giúp ta vừa tận dụng những dòng code trước đó và viết tiếp code mới.

Ví dụ: ta thấy phương thức getInfo()Person chỉ trả về thông tin name, age, height. Bây giờ, ta sẽ nâng cấp phương thức có thể trả về thông tin universityName ở lớp Student bằng cách tạo hàm tên trùng với lớp cha và dùng từ khoá super để gọi lại hàm từ lớp cha. Xong bổ sung thêm code ở hàm của lớp con.

(Tính chất này là kêu bằng tính Ghi đè hay Đa hình trong OOP. Mình học ở phần dưới kĩ hơn.)

public class Student extends Person {

    public String universityName;

    public Student(String name, int age, float height, String universityName) {
        super(name, age, height);
        this.universityName = universityName;
    }

    public void getInfo() {
        super.getInfo();
        System.out.println("University Name:" + this.universityName);
    }

}

Ta truyền thêm tham số thứ 4 vào lại chổ khởi tạo để kiểm tra:

public class Student extends Person {

    public String universityName;

    public Student(String name, int age, float height, String universityName) {
        super(name, age, height);
        this.universityName = universityName;
    }

    public void getInfo() {
        super.getInfo();
        System.out.println("University Name:" + this.universityName);
    }

    public static void main(String[] args) {
        Student student = new Student("Nhung", 40, 160, "Dai hoc Dong Thap");
        student.getInfo();
    }

}

Kết quả:

Name:Nhung
Age:40
Height:160.0
University Name:Dai hoc Dong Thap


Như vậy chúng ta đã tìm hiểu kế thừa trong lập trình hướng đối tượng.

 

✅ Tính đóng gói trong Java

Tính đóng gói trong java là kỹ thuật ẩn giấu thông tin không liên quan và chỉ cho phép hiển thị ra những thông liên quan hoặc cần thiết. Mục đích chính của đóng gói trong Java là giảm thiểu mức độ phức tạp code trong phát triển phần mềm.

Tính đóng gói trong Java | Anh Tester

Chúng ta có thể tạo một lớp được đóng gói hoàn toàn trong Java bằng việc tạo tất cả thành viên dữ liệu của lớp là private. Tiếp theo, chúng ta sử dụng phương thức settergetter để thiết lập và lấy dữ liệu trong nó. Đặt các phương thức có phạm vi truy cập là public hoặc protected

Đóng gói cũng được sử dụng để bảo vệ trạng thái bên trong của một đối tượng. Bởi việc ẩn giấu các Biến biểu diễn trạng thái của đối tượng. Việc chỉnh sửa đối tượng được thực hiện xác nhận thông qua các phương thức.

Hơn nữa, việc ẩn giấu các biến thì các lớp sẽ không chia sẻ thông tin với nhau được. Điều này làm giảm số lượng khớp nối hoặc duplicated có thể có trong một ứng dụng.

Tính đóng gói là kỹ thuật tạo một trường (thuộc tính, biến) của một lớp là private và cung cấp khả năng truy cập trường này qua các phương thức public. Nếu một trường được khai báo là private, nó không thể được truy cập bởi bên ngoài lớp, do đó có thể che dấu các trường có lớp này. Vì lý do này, tính đóng gói được ám chỉ như việc dấu dữ liệu (data hiding).

🔆 Để đạt được đóng gói trong Java chúng ta cần:

  • Khai báo các biến của một lớp là private.
  • Cung cấp phương thức setter và getter là public để có thể sửa đổi và xem các giá trị biến.


Ví dụ về đóng gói trong java

Hãy xem ví dụ sau về đóng gói trong java với một lớp chỉ có một trường và các phướng thức setter và getter của nó.

Class: Student.java

public class Student {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


Các phương thức public setXXX() và getXXX() là các điểm truy cập đến các biến của lớp Student. Thông thường, các phương thức này được gọi là getters và setters. Vì vậy, bất kỳ đối tượng nào nào muốn truy cập vào các biến private sẽ truy cập chúng thông qua các trình getters và setters này.


Class: LearnTinhDongGoi.java

public class LearnTinhDongGoi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student s = new Student();
		s.setName("Anh Tester");
		System.out.println("Tính đóng gói trong Java: \n"+s.getName());
	}
}

Kết quả:

Tính đóng gói trong Java:
Anh Tester

 

🔆 Lưu ý Quy ước đặt tên:

Quy ước đặt tên biến trong Java: từ đầu tiên là viết thường, từ thứ hai trở đi viết hoa chữ cái đầu tiên ở mỗi từ. Xem thêm ở bài viết Tiêu chuẩn coding trong Java (Coding Standards).

Quy ước đặt tên phương thức gettersetter như sau:

  • Getter: bắt đầu bằng chữ get + viết hoa chữ đầu tiên tất cả các từ (viết hoa chữ đầu tiên của tên biến).
  • Setter: bắt đầu bằng chữ set + viết hoa chữ đầu tiên tất cả các từ (viết hoa chữ đầu tiên của tên biến).


VD:
getName, getAge, getAddress,...setName, setAge, setAttribute, setText,...


🔆 Lợi ích của đóng gói trong Java

  • Tất cả các trường (field) của lớp có có chế độ chỉ đọc (read-only) hoặc chỉ ghi (write-only), tức là chỉ có hàm getter hoặc setter.
  • Một lớp có thể có toàn bộ điều khiển thông qua những gì được lưu giữ trong các trường (field) của nó.
  • Người sử dụng của class không biết cách các class lưu trữ dữ liệu. Một class có thể thay đổi kiểu dữ liệu của một trường và người dùng class không cần sự thay đổi trong code.
  • Bạn có thể kiểm soát đối với dữ liệu. Giả sử bạn muốn đặt giá trị của id chỉ lớn hơn 100 bạn có thể viết logic bên trong lớp setter.

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học