You are on page 1of 23

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

TRONG JAVA

Giảng viên: Nguyễn Đắc Hiếu


Email: dachieu@tlu.edu.vn
4 tính chất OOP
Đóng gói - Encapsulation

• Một đối tượng có hai khung nhìn:

• Bên trong: Chi tiết về các thuộc tính và các Phương thức của
lớp tương ứng với đối tượng

• Bên ngoài: Các dịch vụ mà một đối tượng có thể cung cấp và
cách đối tượng đó tương tác với các thành phần còn lại của
hệ thống
Đóng gói - Encapsulation

• Dữ liệu và Phương thức được đóng gói trong một lớp

• Dữ liệu được che giấu ở bên trong lớp và chỉ được truy cập và
thay đổi ở các phương thức bên ngoài. Tránh thay đổi trái phép
hoặc làm sai lệch dữ liệu

Client Methods

Data
Che giấu dữ liệu

• Các thành viên dữ liệu:

• Chỉ có thể truy cập từ phương thức bên trong lớp

• Chỉ định truy cập là private để bảo vệ dữ liệu

• Các đối tượng khác muốn truy cập vào dữ liệu riêng tư này phải
thông qua các phương thức public

• Accessor (getter): Trả về giá trị hiện tại của một thuộc tính (dữ
liệu)

• Mutator (setter): Thay đổi giá trị của một thuộc tính

• Thường là getX và setX, trong đó x là tên thuộc tính


public class Car {
private String name;
Private Data
private int price;

public String getName() { Getter


return name;
}

public void setName(String name) {


Setter
this.name = name;
}

public int getPrice() {


return price;
}

public void setPrice(int price) {


this.price = price;
}
}
Phương thức Get

• Các phương thức truy vấn (query method, accessor) là các


phương thức dung để hỏi về giá trị của các thành viên dữ liệu của
một đối tượng

• Có nhiều loại câu hỏi truy vấn có thể:

• Truy vấn đơn giản (“Giá trị của x là bao nhiêu?”)

• Truy vấn điều kiện (“Thành viên x có lớn hơn 10 không?”)

• Truy vấn dẫn xuất (“Tổng giá trị của các thành viên x, y là bao
nhiêu)

• Phương thức truy vấn không làm thay đổi giá trị của dữ liệu
Phương thức Set

• Các phương thức thiết lập (Mutator, setter) là các phương thức
dung để thay đổi giá trị các thành viên dữ liệu

• Ưu điểm của việc sử dụng các phương thức setter là có thể sử


dụng các phương thức setter để đảm bảo tính hợp lệ của các
thành viên dữ liệu

• Kiểm tra giá trị đầu vào trước khi gán vào các thuộc tính

public void withdraw(int money) throws Exception {


if (money > balance) {
throw new Exception("Out of money");
}
...
}
Kế thừa

• Kế thừa là khái niệm dùng để chỉ quá trình tạo ra các lớp mới dựa
trên những đặc điểm và phương thức của một lớp đã có.

• Kế thừa giúp tránh việc phải xây dựng lại các đặc tính đã có của
một lớp, tạo ra khả năng mở rộng và nâng cấp một cách đơn
giản, hiệu quả.
Kế thừa

• Các kiểu kế thừa


Kế thừa

• Sử dụng từ khóa extends

• Lớp con:

• Kế thừa các thuộc tính và phương thức của lớp cha

• Định nghĩa thêm thuộc tính và phương thức mới

• Định nghĩa lại (hay còn gọi là ghi đè phương thức, overriding)
phương thức được kế thừa từ lớp cha

• Chỉ được truy cập các thành viên có phạm vi public và


protected của lớp cha

• Không được phép truy cập đến thành viên private của lớp cha
Kế thừa
class Animal {
void eat() {
System.out.println("eating...");
}
}

class Dog extends Animal {


void bark() {
System.out.println("barking...");
}
}

class Cat extends Animal {


void meow() {
System.out.println("meowing...");
}
}
Ghi đè phương thức

• Ghi đè phương thức (method overriding)

• Xảy ra nếu lớp con có phương thức giống lớp cha

• Cung cấp cài đặt đặc biệt của một phương thức mà đã được
định nghĩa ở lớp cha

• Sử dụng cho đa hình runtime

• Các nguyên tắc ghi đè phương thức

• Phương thức phải có tên giống với lớp cha

• Phương thức phải có tham số giống với lớp cha

• Lớp con và lớp cha có mối quan hệ kế thừa


Đa hình

• Polymorphism: Nhiều hình thức thực hiện, nhiều kiểu tồn tại

• Đa hình trong lập trình:

• Đa hình phương thức:

• Phương thức trùng tên, phân biệt bởi danh sách tham số

• Đa hình đối tượng:

• Nhìn nhận đối tượng theo nhiều kiểu khác nhau

• Các đối tượng khác nhau cùng đáp ứng chung danh sách
các thông điệp có giải nghĩa thông điệp theo cách thức
khác nhau
Ghi đè phương thức

• Sử dụng @Override để thực hiện ghi đề phương thức

public class Vehicle {


void run() {
System.out.println("Vehicle is running");
}
}

public class Car extends Vehicle {


@Override
void run() {
System.out.println("Car is running safely");
}
}
Nạp chồng phương thức

• Nạp chồng phương thức (Overloading Methods)

• Khai báo trong một số lớp nhiều phương thức cùng tên nhưng
khác nhau về tham số, kiểu dữ liệu,..

• Cùng ở trong một lớp

• Có cùng tên

• Khác nhau về danh sách tham số

• Những phương thức được nạp chồng là một hình thức đa


hình (polymorphism) trong quá trình biên dịch (compile time)
Nạp chồng phương thức

• Có 2 cách nạp chồng phương thức

• Thay đổi số lượng các tham số

• Thay đổi kiểu dữ liệu của tham số

class Adder {
static int sum(int a, int b) {
return a + b;
}
static double sum(double a, double b) {
return a + b;
}
static int sum(int a, int b, int c) {
return a + b + c;
}
}
Tính trừu tượng

• Tính trừu tượng (abstract) là một tiến trình ẩn các cài đặt chi tiết
và chỉ hiển thị tính năng tới người dùng. Sử dụng tính trừu tượng
giúp chúng ta chỉ tập trung vào trọng tâm thay vì quan tâm đến
cách nó thực hiện

• Có hai cách để sử dụng tính trừu tượng:

• Sử dụng lớp trừ tượng (abstract)

• Sử dụng giao diện (interface)


Lớp trừu tượng

• Lớp trừu tượng

• Chỉ được dùng làm lớp cha cho các lớp khác

• Không có các thể hiện (instance)

• Định nghĩa các thuộc tính chung cho các lớp con

• Không thể tạo các đối tượng của một lớp trừu tượng

• Có thẻ khai báo biến thuộc kiểu lớp trừu tượng để tham chiếu
đến các đối tượng thuộc lớp con
abstract class Animal {
abstract void makeSound();
public void eat() {
System.out.println("I can eat.");
}
}

class Dog extends Animal {


@Override
public void makeSound() {
System.out.println("Bark bark");
}
}

class Cat extends Animal {


@Override
public void makeSound() {
System.out.println("Meow");
}
}
Giao diện

• Giao diện (interface)

• Là mội kiểu dữ liệu tham chiếu

• Là tập hợp các phương thức trừu tượng

• Đặc điểm của interface

• Không thể khởi tạo, nên không có phương thức khởi tạo.

• Tất cả các phương thức trong interface luôn ở dạng public


abstract mà không cần khai báo.

• Các thuộc tính trong interface luôn ở dạng public static


final mà không cần khai báo, yêu cầu phải có giá trị.
Giao diện

interface FirstInterface {
public void myMethod(); // interface method
}

interface SecondInterface {
public void myOtherMethod(); // interface method
}

class DemoClass implements FirstInterface, SecondInterface {


public void myMethod() {
System.out.println("Some text..");
}
public void myOtherMethod() {
System.out.println("Some other text...");
}
}
Lớp trừu tượng vs Giao diện

Lớp trừu tượng Interface

Có các phương thức abstract và non-


Chỉ có thể có phương thức abstract
abstract

Không hỗ trợ đa kế thừa Hỗ trợ đa kế thừa

Có thể có các biến final, non-final, static


Chỉ có các biến static và final
và non-static
Có thể có phương thức static, phương Không thể có phương thức static, main
thức main và constructor hoặc constructor
Từ khóa abstract được sử dụng để khai Từ khóa interface được sử dụng để khai
báo lớp trừu tượng báo interface
Có thể cung cấp trình triển khai của Không cung cấp trình triển khai cụ thể
interface của lớp abstract

You might also like