TỔNG QUAN
CẤU TRÚC ĐIỀU KHIỂN
VÒNG LẶP
CHUỖI VÀ MẢNG
COLLECTIONS
THƯ VIỆN QUAN TRỌNG
HƯỚNG ĐỐI TƯỢNG
XỬ LÝ LUỒNG
EXCEPTION
LÀM VIỆC VỚI FILE
THAM KHẢO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT

Quảng cáo

Tính đóng gói (Encapsulation) trong Java

Trong lập trình hướng đối tượng, chúng ta có 4 tính chất chính đó là tính đóng gói (Encapsulation), tính kế thừa (Inheritance), tính đa hình (Polymorphism) và tính trừu tượng (Abstraction). Trong bài này, tôi sẽ giới thiệu đến các bạn tính chất cơ bản đầu tiên đó là tính đóng gói (Encapsulation) trong Java và cách vận dụng tính chất này trong lập trình.

1. Khái niệm tính đóng gói

Trong bài trước, tôi có đưa ra một số ví dụ từ 1 lớp chúng ta có thể truy cập trực tiếp đến thuộc tính của đối tượng trong một lớp thông qua tên của thuộc tính đó. Tuy nhiên, chúng ta nên hạn chế dùng cách này vì nó không đảm bảo một trong những nguyên tắc quan trọng nhất của lập trình hướng đối tượng đó là tính bảo mật và che giấu thông tin. Vì vậy, để khắc phục, trong lập trình hướng đối tượng có 1 tính chất có thể cho phép chúng ta truy cập và thay đổi giá trị thuộc tính thông qua các phương thức của lớp đó là tính đóng gói (Encapsulation).

Quảng cáo

Vậy đóng gói là gì? Đóng gói là sự che giấu bên trong dữ liệu riêng của mỗi đối tượng của lớp được khai báo và chỉ được truy xuất thông qua hệ thống các phương thức có sẵn của lớp (chỉ có thể gọi những phương thức có sẵn của lớp). Vì vậy, nó còn được gọi là data hiding (nghĩa là che giấu dữ liệu).

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Tính đóng gói có những đặc điểm như sau:

  • Tạo ra cơ chế để ngăn ngừa việc gọi phương thức của lớp này tác động hay truy xuất dữ liệu của đối tượng thuộc về lớp khác.
  • Dữ liệu riêng (khi được khai báo là private) của mỗi đối tượng được bảo vệ khỏi sự truy xuất không hợp lệ từ bên ngoài.
  • Người lập trình có thể dựa vào cơ chế này để ngăn ngừa việc gán giá trị không hợp lệ vào thành phần dữ liệu của mỗi đối tượng.
  • Cho phép thay đổi cấu trúc bên trong của một lớp mà không làm ảnh hưởng đến những lớp bên ngoài có sử dụng lớp đó.

Để cài đặt tính đóng gói, chúng ta có 2 bước như sau:

  • Khai báo các thuộc tính của đối tượng trong lớp là private để các lớp khác không thể truy cập trực tiếp/sửa đổi được.
  • Cung cấp các phương thức getter/setter có phạm vi truy cập là public để truy cập và sửa đổi các giá trị của thuộc tính trong lớp. Phương thức getter là phương thức truy cập vào thuộc tính của đối tượng và trả về các thuộc tính của đối tượng, còn phương thức setter là phương thức truy cập vào thuộc tính của đối tượng và gán giá trị cho các thuộc tính của đối tượng đó.

2. Ví dụ về tính đóng gói

Ví dụ sau sẽ minh họa tính đóng gói trong Java:

Person.java
package vidu;

public class Person {
	// khai báo các thuộc tính của đối tượng là private
	private String cmnd;
	private String hoTen;
	
	// tạo các phương thức getter/setter
	// 2 phương thức getCmnd() và getHoTen() là phương thức getter
	// dùng để trả về số chứng minh nhân dân và họ tên của đối tượng
	// và kiểu trả về của hai phương thức này tương ứng với kiểu dữ liệu của thuộc tính
	// 2 phương thức setCmnd() và setHoTen() là phương thức setter
	// dùng để gán giá trị cho thuộc tính chứng minh nhân dân và họ tên của đối tượng
	// trong đó tham số truyền vào của 2 phương thức này được gọi là tham số (biến cục bộ)
	// và có kiểu dữ liệu tương ứng với kiểu dữ liệu của thuộc tính (biến đối tượng)
	public String getCmnd() {
		return cmnd;
	}
	
	// this là từ khóa có ý nghĩa là một tham chiếu đặc biệt 
	// chiếu tới đối tượng chủ của phương thức hiện hành
	// this có thể được dùng để truy cập biến đối tượng (instance variable)
	// hoặc gọi phương thức đối với đối tượng hiện hành. 
	// Thông thường, công dụng này của this chỉ có ích
	// khi tên biến đối tượng bị trùng với tham số (biến cục bộ - local variable) của phương thức 
	public void setCmnd(String cmnd) {
		this.cmnd = cmnd;
	}
	public String getHoTen() {
		return hoTen;
	}
	public void setHoTen(String hoTen) {
		this.hoTen = hoTen;
	}
	
}

Quảng cáo

TestPerson.java
package vidu;

public class TestPerson {

	public static void main(String[] args) {
		Person person = new Person();
		
		// gán giá trị họ tên cho đối tượng person vừa tạo thông qua setHoTen() 
		// và gán số chứng minh nhân dân thông qua setCmnd()
		person.setHoTen("Trần Văn Bình");	
		person.setCmnd("212321678");
		
		// truy cập đến tên của đối tượng person thông qua phương thức getHoten()
		// và số chứng minh nhân dân thông qua phương thức getCmnd()
		System.out.println("Tên: " + person.getHoTen() + ", số cmnd: " + person.getCmnd());
	}

}

Kết quả sau khi biên dịch chương trình:

ketqua vi du phuong thuc getter setter PNG

Trong lớp Person, chúng ta có đoạn code như sau:

tu khoa this trong java PNG

this là từ khóa có ý nghĩa là một tham chiếu đặc biệt chiếu tới đối tượng chủ của phương thức hiện hành. Trong lớp Person, phương thức setHoTen() lấy một tham số (hay còn gọi là biến cục bộ - Local Variable) hoTen kiểu String trùng tên với thuộc tính hoTen của lớp đó, nếu chúng ta chỉ viết "hoTen" mà không có từ khóa this đằng trước thì trình biên dịch sẽ hiểu là ta đang nói đến tham số hoTen. Vì vậy, để gọi đến thuộc tính (hay còn gọi là biến đối tượng - Instance Variable), cách duy nhất là sử dụng tham chiếu this để gọi một cách tường minh.

Lưu ý: Để tạo nhanh phương thức getter/setter của các thuộc tính trong lớp, chúng ta sẽ làm như sau:

Bước 1: Vào Source -> Generate Getters and Setters:

Quảng cáo

cac buoc tao getter setter 1 png

Bước 2: Hộp thoại Generate Getters and Setters xuất hiện. Chúng ta có thể chọn Select All để chọn tất cả các đối tượng cần tạo getter/setter hoặc có thể chọn riêng từng thuộc tính. Ngoài ra, nếu các bạn chỉ muốn tạo phương thức getter (hoặc setter) thì các bạn có thể chọn Select Getters (hoặc Select Setters). Sau đó bấm OK để kết thúc.

cac buoc tao getter setter 2 png

3. Lời kết

Trong bài này, chúng ta đã tìm hiểu về tính đóng gói trong Java. Sang bài sau, chúng ta sẽ tìm hiểu về tính chất tiếp theo trong lập trình hướng đối tượng đó là tính kế thừa. Các bạn theo dõi nhé!

Quảng cáo

Câu hỏi thường gặp liên quan:

Cùng chuyên mục:

Khi nào dùng Default Methods trong Java 8

Khi nào dùng Default Methods trong Java 8

Ở 2 bài trước chúng ta đã tìm hiểu 2 tính năng mới của Java…

Cách chuyển chữ hoa thành chữ thường trong Java

Cách chuyển chữ hoa thành chữ thường trong Java

Trong bài viết này chúng ta sẽ tìm hiểu về cách chuyển đổi chữ in…

Bài tập tính tổng các số tự nhiên trong Java

Bài tập tính tổng các số tự nhiên trong Java

Các số dương 1, 2, 3, 4, ... được gọi là các số tự nhiên,…

Cách chuyển chữ thường thành chữ hoa trong Java

Cách chuyển chữ thường thành chữ hoa trong Java

Trong chuỗi có thể vừa có ký tự thường vừa có ký tự hoa, nhưng…

Cách viết hoa ký tự đầu tiên trong Java

Cách viết hoa ký tự đầu tiên trong Java

Để hiểu được bài này, các bạn cần có kiến thức căn bản về Java…

Hướng dẫn chuyển đổi giờ phút giây trong Java

Hướng dẫn chuyển đổi giờ phút giây trong Java

Để hiểu được chương trình, các bạn cần có kiến thức cơ bản về Java.…

Cách lấy thời gian hiện tại trong Java

Cách lấy thời gian hiện tại trong Java

Để hiểu được bài viết này, các bạn cần có kiến thức cơ bản sau…

Cách làm tròn số trong Java

Cách làm tròn số trong Java

Khi thực hiện tính toán, việc kết quả ra một con số thập phân dài…

Cách tìm ma trận chuyển vị trong Java

Cách tìm ma trận chuyển vị trong Java

Quá trình hoán đổi giữa hàng và cột được gọi là chuyển vị của ma…

Cách chuyển ArrayList thành mảng và ngược lại trong Java

Cách chuyển ArrayList thành mảng và ngược lại trong Java

Để hiểu được bài này, các bạn cần có kiến thức cơ bản về mảng…

Cách nối hai mảng trong Java

Cách nối hai mảng trong Java

Mình sẽ thực hiện hai chương trình nối mảng. Chương trình thứ nhất nối hai…

Cách xóa khoảng trắng của chuỗi trong Java

Cách xóa khoảng trắng của chuỗi trong Java

Mình sẽ thực hiện hai chương trình khác nhau để các bạn có thể hiểu…

In ra tam giác bằng ký tự * và số trong Java

In ra tam giác bằng ký tự * và số trong Java

Mình sẽ giới thiệu cách để in ra các tam giác bằng ký tự *…

Tìm số lớn nhất trong mảng Java

Tìm số lớn nhất trong mảng Java

Các bạn cần tìm hiểu về mảng, cách khởi tạo và in mảng trong Java…

Tìm ước của một số nguyên trong Java

Tìm ước của một số nguyên trong Java

Trong bài viết này chúng ta sẽ tìm hiểu cách tìm tất cả các ước…

Cách kiểm tra số hoàn hảo trong Java

Cách kiểm tra số hoàn hảo trong Java

Cách kiểm tra số đối xứng trong Java

Cách kiểm tra số đối xứng trong Java

Trong bài viết này chúng ta sẽ kiểm tra một số có phải là số…

Đảo ngược một số trong Java

Đảo ngược một số trong Java

Mình sẽ giới thiệu các bạn cách đảo ngược một số sử dụng vòng lặp…

Tìm bội chung nhỏ nhất trong Java

Tìm bội chung nhỏ nhất trong Java

Mình sẽ sử dụng hai cách khác nhau để tìm BCNN. Cách thứ nhất mình…

Cách hoán đổi hai số trong Java

Cách hoán đổi hai số trong Java

Trong phần này mình sẽ sử dụng một biến tạm temp() làm biến trung gian…

Top