LẬP TRÌNH HƯỚNG

ĐỐI TƯỢNG TRONG JAVA

Lịch sử phát triển của lập trình

“Không có ngôn ngữ, chỉ có dây và phích cắm”

Bắt đầu hoạt động vào năm 1946, ENIAC chiếm diện tích hơn 167 𝑚2, nặng 27 tấn, không chỉ thực hiện được các phép tính cơ bản, còn cho phép chạy vòng lặp, rẽ nhánh và các thủ tục con.

duytrung.tcu@gmail.com

Lịch sử phát triển của lập trình

trình từ góc nhìn của máy tính để xây dựng những khái niệm và nguyên lý phản chiếu (gần như) chính xác sự cảm nhận thế giới thực của con người.

• Sự “tiến hóa” của ngôn ngữ lập trình

High-level languages

Assembly languages

Machine language

duytrung.tcu@gmail.com

• Lịch sử phát triển của lập trình chứng kiến sự từ bỏ cách lập

Machine languages

• Chỉ gồm 0 và 1 – mã nhị phân

• Là ngôn ngữ “tự nhiên” với máy tính, liên hệ chặt chẽ với phần

cứng máy tính

• Độ khó lập trình: God level - chỉ đặt sai giá trị một bit có thể làm

sai tất cả chương trình.

00110010 00001110 00010010 00000000

duytrung.tcu@gmail.com

• Ví dụ về ngôn ngữ máy:

Assembly languages

• Là một bước tiến để lập trình trở nên dễ hơn

• Bao gồm tập các câu lệnh cơ bản được xây dựng cho một bộ xử

lý cụ thể

• Mã Assembly cần được dịch thành mã máy để máy tính có thể

hiểu được

• Ví dụ:

• Mỗi lệnh Assembly được ánh xạ 1-1 thành một chỉ dẫn NN máy

duytrung.tcu@gmail.com

XOR CL, [12H]

High-level languages

• Là một bước nhảy vọt trong lịch sử lập trình

• Cú pháp rất giống với ngôn ngữ tự nhiên của con người

- Các ngôn ngữ hướng thủ tục / hướng cấu trúc (procedural)

• Trên quan điểm lịch sử, được phân chia làm 2 nhóm chính:

duytrung.tcu@gmail.com

- Các ngôn ngữ hướng đối tượng (object-oriented)

Procedural languages

tục: C, COBOL, Fortran, LISP, PERL, HTML, VBScript…

• Các ngôn ngữ bậc cao thời kỳ đầu là các ngôn ngữ hướng thủ

duytrung.tcu@gmail.com

• Các ngôn ngữ loại này tập trung vào cấu trúc của một chương trình: đặc trưng bởi các câu lệnh tuyến tính, chương trình xử lý theo logic tuần tự từ trên xuống

Procedural languages

duytrung.tcu@gmail.com

Object-oriented languages

trúc của chương trình, mà là mô hình hóa dữ liệu

• Mục tiêu của các ngôn ngữ hướng đối tượng không phải là cấu

• Lập trình viên sử dụng các “thiết kế” mô hình hóa dữ liệu gọi là

các lớp (class), từ đó sinh ra các đối tượng (object) có các thuộc tính (attributes) riêng biệt và tác động nội ngoại thông qua các phương thức (methods)

• Ví dụ ngôn ngữ: C++, VB .NET, C#, Java, Kotlin, Swift, Objective-

duytrung.tcu@gmail.com

C…

Object-oriented languages

duytrung.tcu@gmail.com

Đối tượng (object) là gì?

• Object (n) a thing that could be seen and touched … (Oxford Dict)

• Tất cả những gì ta thấy xung quanh đều là đối tượng

• Trong sự vận động của thế giới, các đối tượng luôn tương tác với nhau. Con người trong các công việc, hoạt động của mình cần tương tác với vô vàn sự vật, hiện tượng khác

mô tả quy trình con người làm công việc đó trên máy tính -> mô tả các đối tượng tham gia công việc -> thế giới thực có thể được mô tả lại chính xác thông qua tập hợp các “đối tượng” có tương tác

duytrung.tcu@gmail.com

• Với yêu cầu “dạy” cho máy tính thực hiện công việc, cần tìm cách

Đối tượng thế giới thực

Sủa

Vẫy đuôi

Ăn uống

Màu lông, cân nặng, tên, đói, buồn…

Chạy nhảy

duytrung.tcu@gmail.com

• 2 đặc tính của đối tượng thế giới thực: trạng thái và hành vi

Đối tượng thế giới thực

duytrung.tcu@gmail.com

Mô tả đối tượng trong lập trình

duytrung.tcu@gmail.com

Mô tả đối tượng trong lập trình

tính (fields/attributes) -> các biến

- Hãng sản xuất

- Lượng xăng

Danh từ

- Màu

- Tốc độ hiện tại

• Mô tả hành vi của đối tượng thông qua các phương thức hành

• Mô tả trạng thái của đối tượng thông qua các trường / thuộc

- Khởi động()

- Đổ xăng()

Động từ

- Phanh()

- Dừng()

duytrung.tcu@gmail.com

động (methods) -> các hàm

Định nghĩa Lớp

tượng cùng loại

• Lớp (Class) là một khuôn mẫu được sử dụng để mô tả các đối

• Một lớp có tên xác định, chứa trong nó các thuộc tính và các

• Mỗi đối tượng được tạo ra từ một lớp được gọi là một thực thể

phương thức

(instance) của lớp đó

duytrung.tcu@gmail.com

• Việc ấn định giá trị cho các thuộc tính và sử dụng các phương thức sẽ tạo nên đặc trưng trạng thái và hành vi cho một đối tượng cụ thể

Lớp và Đối tượng

duytrung.tcu@gmail.com

Cú pháp khai báo Lớp

duytrung.tcu@gmail.com

Ví dụ về khai báo lớp

duytrung.tcu@gmail.com

Ví dụ về tạo đối tượng

Default Constructor

• Từ khóa new được sử dụng để tạo đối tượng

• Biến emp chứa tham chiếu tới đối tượng

• Sử dụng toán tử (.) để truy xuất đến các thành viên của đối

duytrung.tcu@gmail.com

tượng (trường và phương thức)

Định nghĩa phương thức

• Cú pháp: giống như viết hàm

• Phương thức có thể có kiểu trả về hoặc không (void)

• Phương thức có thể nhận không hoặc nhiều tham số đầu vào

duytrung.tcu@gmail.com

• input() và output() trong class Employee

Tạo phương thức

Xây dựng phương thức cho lớp Employee:

• setInfo(String, double): cho phép gán giá trị cho các

thuộc tính fullname và salary, không có kiểu trả về

• incomeTax(): trả về giá trị tiền thuế thu nhập dựa trên thuộc

tính salary của đối tượng

-salary ≥ 5000000 : thuế bằng 10% lương

duytrung.tcu@gmail.com

-salary < 5000000 : miễn thuế

Tạo phương thức

duytrung.tcu@gmail.com

Nạp chồng phương thức (overloading)

phân biệt với nhau về tham số (kiểu, số lượng, thứ tự)

public class Employee{ void setInfo() {...} void setInfo(String val) {...} void setInfo(double val) {...} void setInfo(String val1, double val2){...} void setInfo(double val1, String val2){...}

}

duytrung.tcu@gmail.com

• Trong một lớp, có thể có nhiều phương thức cùng tên, miễn là

Nạp chồng phương thức (overloading)

duytrung.tcu@gmail.com

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

trả về, dùng để tạo một thực thể từ lớp qua từ khóa new

• Là một phương thức đặc biệt: lấy tên của lớp và không có kiểu

• Tương tự như phương thức, có thể có nhiều constructor, mỗi

duytrung.tcu@gmail.com

hàm cung cấp một cách khởi tạo đối tượng khác nhau

Từ khóa “this”

• this được sử dụng để ám chỉ đối tượng hiện tại

• this được sử dụng trong lớp để tham chiếu đến các thành viên

duytrung.tcu@gmail.com

trong lớp

Hàm khởi tạo mặc định

sinh ra một hàm khởi tạo mặc định cho lớp đó

• Khi lớp không được khai báo bất kỳ hàm khởi tạo nào, Java sẽ

• Hàm khởi tạo này không có tham số (no-argument constructor)

• Hàm khởi tạo này sẽ đặt giá trị cho tất cả các trường chưa được

public class Employee{ String fullname; double salary;

public class Employee{ String fullname; double salary;

public class Employee{ String fullname; double salary; // không có hàm khởi tạo }

public Employee() { }

}

public Employee() { this.fullName = null; this.salary = 0.0; }

}

duytrung.tcu@gmail.com

khởi tạo về giá trị mặc định của kiểu dữ liệu của trường đó

Biến và phương thức của lớp

• Mỗi đối tượng có các giá trị ở các thuộc tính là khác nhau

• Nếu ta mong muốn tạo ra một biến số chung của lớp mà tất cả

các đối tượng đều có thể thấy và dùng? tương tự đối với phương thức?

• Sử dụng từ khóa static trước biến và phương thức để khai

• Để gọi đến biến và phương thức của lớp, gọi

báo sở hữu của lớp, không phải của đối tượng

duytrung.tcu@gmail.com

.

Biến và phương thức của lớp

I belong to the class Lion Lions have 4 legs I belong to a lion I have 4 legs

duytrung.tcu@gmail.com

Biến của lớp và biến của đối tượng

nhiêu đối tượng được sinh ra từ lớp đó.

• Biến của lớp chỉ có 1 bản sao duy nhất thuộc về lớp, bất kể bao

• Biến của lớp được tất cả các đối tượng dùng chung, được khai

báo static và thường phạm vi là public

• Biến của đối tượng, ngược lại, được sinh ra riêng cho mỗi một đối tượng, thay đổi giá trị biến này trong đối tượng này không ảnh hưởng gì đến giá trị biến cùng tên trong đối tượng khác

duytrung.tcu@gmail.com

• Thường được khai báo private (Xem thêm Encapsulation)

Từ khóa “final”

được lớp khác kế thừa

• Khi một lớp được khai báo final, lớp đó sẽ không có khả năng

• Khi một biến được khai báo final, biến đó sẽ trở thành hằng số, do đó các biến static thường đi kèm với final, bởi biến của lớp thường chứa các giá trị hằng số cho phép công khai

• Khi một phương thức được khai báo final, phương thức đó sẽ

public static final double PI = 3.14;

duytrung.tcu@gmail.com

không thể bị ghi đè bởi phương thức khác

Package

annotation có liên quan đến nhau

• Package là một tập hợp các class, interface, enum và

• Package được sử dụng để chống xung đột định danh, kiểm soát truy cập, giúp tìm kiếm và sử dụng các class, interface, enum và annotation dễ dàng và hiệu quả hơn

• Các package của Java: package java chứa trong nó các

• Package có thể chứa nhiều package khác

duytrung.tcu@gmail.com

package java.util, java.lang, java.awt, java.sql, java.beans…

Package

• Khi tạo package, ta chọn tên cho package và phải đặt từ khóa package đi kèm với tên này ở đầu các file code nào có các class, interface, enum và annotation cần đưa vào package

thường là câu lệnh đầu tiên trong file

• Mỗi một file source code chỉ chứa 1 câu lệnh package, và

• Một kinh nghiệm là đặt tên package bằng chữ thường để tránh

duytrung.tcu@gmail.com

xung đột với tên các thành phần package đó chứa

Import package

cần dùng đến tên package

• Khi 1 class gọi đến 1 class khác trong cùng package thì không

• Để gọi đến 1 class ở package khác, có thể thực hiện theo 1

trong những cách sau:

- Gọi đầy đủ tên package khi cần sử dụng: payroll.Employee;

- Chỉ import đến class cần dùng: import payroll.Employee;

duytrung.tcu@gmail.com

- Sử dụng từ khóa import và dấu *: import payroll.*;

Đặc tả truy xuất (Access modifier)

vi truy cập cho các class, biến và phương thức

duytrung.tcu@gmail.com

• Java cung cấp các từ khóa đặc tả truy xuất để kiểm soát phạm

Đặc tả truy xuất (Access modifier)

class

duytrung.tcu@gmail.com

Đặc tả truy xuất (Access modifier)

duytrung.tcu@gmail.com

Quy ước định danh trong Java

Loại tên

Quy ước

Class

Bắt đầu bằng chữ hoa, là danh từ , ví dụ: String, Color, Button, System, Thread...

Interface

Bắt đầu bằng chữ hoa, thường là tính từ, ví dụ: Runnable, Remote, ActionListener …

Phương thức

Băt đầu bằng chữ thường, thường là động từ, ví dụ: actionPerformed(), main(), print(), println()...

Biến

Bắt đầu bằng chữ thường, ví dụ: firstName, orderNumber ...

Package

Viết bằng chữ thường ví dụ: java, lang, sql, util ....

Constant

Viết toàn bộ bằng chữ hoa. e.g. RED, YELLOW, MAX_PRIORITY etc.

duytrung.tcu@gmail.com

duytrung.tcu@gmail.com

Bài tập

duytrung.tcu@gmail.com

• Xây dựng lớp Hình tròn có một biến tĩnh tên PI là hằng số pi, một trường lưu bán kính của hình tròn, một hàm khởi tạo cho phép khởi tạo bán kính của hình tròn, một phương thức tính diện tích của hình tròn.

CÁC NGUYÊN LÝ CỦA OOP

TRONG JAVA

Ưu điểm của OOP

• Tính tái sử dụng code

• Tính dễ bảo trì code

• Tính mô đun hóa cao

• Tính linh hoạt khi sử dụng đối tượng

duytrung.tcu@gmail.com

• Tính bảo mật

Các nguyên lý của OOP

• Encapsulation – Tính bao gói và che giấu dữ liệu

• Abstraction – Tính trừu tượng

• Polymorphism – Tính đa hình

duytrung.tcu@gmail.com

• Inheritance – Tính kế thừa

Encapsulation

• Bao gói các trường và phương thức vào trong một lớp như một “hộp đen”: sử dụng mà không cần/được biết cơ chế bên trong

• Che giấu dữ liệu và che giấu cách thực hiện

• Kiểm soát truy cập thông qua các đặc tả truy xuất

 Quy định người sử dụng được làm gì và không được làm gì,

duytrung.tcu@gmail.com

 Xây dựng phần giao tiếp tách biệt hoàn toàn với phần thực thi

Encapsulation – che giấu dữ liệu

• Giả sử ta có lớp SinhVien và công khai họ tên và điểm như sau:

điểm lớn hơn 10?

duytrung.tcu@gmail.com

• Điều gì xảy ra nếu như người dùng tùy ý gán điểm âm hoặc

Encapsulation – che giấu dữ liệu

private

• Để che giấu dữ liệu, đặt phạm vi truy cập cho các trường là

duytrung.tcu@gmail.com

• Người dùng chỉ có thể tương tác với các trường private thông qua giao diện là các phương thức getter và setter kiểu như:

Encapsulation – che giấu dữ liệu

duytrung.tcu@gmail.com

Abstraction – tính trừu tượng

phức tạp

• Một thực thể thế giới thực có thể có trạng thái và hành vi rất

• Tính trừu tượng nhấn mạnh vào việc lựa chọn những kiến thức vừa đủ để mô tả thực thể trong một ngữ cảnh xác định, chứ không cần phải liệt kê tất cả các thuộc tính, hành vi của nó

duytrung.tcu@gmail.com

=> Tạo ra một phản chiếu trừu tượng của thực thể thực tiễn, người dùng chỉ cần biết đủ về đối tượng để sử dụng nó

Abstraction – tính trừu tượng

• Ví dụ:

duytrung.tcu@gmail.com

Mô tả đối tượng SinhVien để sử dụng cho một phần mềm quản lý sinh viên. Sinh viên có rất nhiều thông tin và hành vi. Ta chỉ quan tâm đến các thuộc tính như: tên, năm sinh, giới tính, ngành học, quê quán … chứ không cần quan tâm đến chiều cao, cân nặng, thói xấu, hát, nói, nhảy lò cò, đi chơi …

Inheritance – Tính kế thừa

trong Java

• Là nguyên lý then chốt cho phép tái sử dụng và bảo trì code

• Khi đã tồn tại một lớp có nhiều đặc điểm mà ta mong muốn, ta có thể kế thừa lớp đó để tạo nên lớp mới để không phải viết (và cả debug!) lại các trường và phương thức chung nữa

• Theo cây phân cấp, tất cả các lớp đều là “hậu duệ” của lớp

• Trong Java, lớp mà kế thừa từ lớp khác được gọi là subclass (lớp con), còn lớp được kế thừa gọi là superclass (lớp cha)

duytrung.tcu@gmail.com

Object trong package java.lang

Inheritance – Tính kế thừa

• Java chỉ cho phép đơn thừa kế (single inheritance)

• Lớp con sẽ được sở hữu các tài sản từ lớp cha:

- Các tài sản default nếu lớp con và lớp cha thuộc cùng package

- Các tài sản public hoặc protected

• Lớp con không truy cập được các tài sản private của lớp cha

duytrung.tcu@gmail.com

• Lớp con không kế thừa các hàm khởi tạo của lớp cha

Sử dụng “super”

khóa super

• Truy cập đến các thành viên của lớp cha bằng cách sử dụng từ

• Có thể sử dụng super để gọi hàm

duytrung.tcu@gmail.com

khởi tạo của lớp cha

Sử dụng “super”

Animals can move Dogs can walk and run

duytrung.tcu@gmail.com

Ghi đè phương thức – Overriding

thức cùng cú pháp

• Overriding được thực hiện khi lớp con và lớp cha có phương

• Lớp Child và Parent đều có phương thức method() cùng cú pháp nên method() trong Child sẽ ghi đè lên method() trong Parent

• Sử dụng từ khóa super để truy cập đến phương thức bị ghi đè

duytrung.tcu@gmail.com

của lớp cha

Ghi đè phương thức – Overriding

Animals can move Dogs can walk and run

duytrung.tcu@gmail.com

Lưu ý khi ghi đè phương thức

• Danh sách đối số giữa 2 PT phải giống nhau

• Kiểu trả về phải tương thích với kiểu trả về của PT gốc (chính

kiểu đó hoặc kiểu con của kiểu đó)

• Phạm vi truy cập của của PT ghi đè không được nhỏ hơn

phương thức gốc

• Không thể ghi đè lên hàm khởi tạo

• Không thể ghi đè lên PT được khai báo final

duytrung.tcu@gmail.com

• Nên sử dụng chỉ dẫn @Override đặt trước PT ghi đè

Lớp trừu tượng

• Nhiều trường hợp, ta cần tập trung mô tả ý tưởng, cách tổ chức hơn

là cách thực thi

- Đã là hình thì sẽ có diện tích và chu vi, nhưng tính thế nào còn phụ thuộc xem hình là tam giác, chữ nhật… mới có thể xác định cụ thể;

- Ai trong công ty cũng có thu nhập, nhưng để tính được thu nhập cần biết được chức vụ, số ngày công, chế đô chính sách… với từng nhóm người;

• Lớp trừu tượng là lớp có các hành vi chưa được xác định rõ ràng

• Lớp Hình và lớp Nhân viên là các lớp trừu tượng vì các phương thức

tính chu vi, diện tích và tính điểm chưa được xác định cụ thể

duytrung.tcu@gmail.com

Lớp trừu tượng

Chữ nhật

Tam giác

Tròn

Vuông

Hình

Nhân viên

Trưởng phòng

Giám đốc

duytrung.tcu@gmail.com

Viên chức

Từ khóa “abstract”

một lớp trừu tượng

• Một lớp được khai báo kèm từ khóa abstract sẽ trở thành

• Một phương thức được khai báo kèm từ khóa abstract sẽ trở

duytrung.tcu@gmail.com

thành một phương thức trừu tượng

Tính chất của lớp và PT trừu tượng

• Một PT trừu tượng không có phần thân hàm

• Một lớp trừu tượng có thể không có PT trừu tượng nào

• Tuy nhiên, một khi đã chứa một PT trừu tượng thì bắt buộc phải

khai báo lớp đó là abstract

• Không thể tạo đối tượng từ lớp trừu tượng

duytrung.tcu@gmail.com

• Để sử dụng lớp trừu tượng, phải kế thừa nó ở 1 lớp khác. Lớp kế thừa phải cung cấp phần thân hàm (thực thi) cho tất cả các PT trừu tượng trong lớp trừu tượng được kế thừa

Nội dung tự tìm hiểu

• Tìm hiểu về interface trong Java

• Ý tưởng đa thừa kế được thực hiện thông qua interface được

không? Nếu được cho một ví dụ

duytrung.tcu@gmail.com

• So sánh giữa abstract class và interface

Bài tập

• Tạo lớp trừu tượng Hình với 2 phương thức tính chu vi và diện tích, sau đó xây dựng các lớp Chữ nhật, Tròn, Tam giác kế thừa lớp Hình. Thêm thuộc tính cho phù hợp với mỗi lớp và hoàn thiện 2 phương thức trên ứng với mỗi loại hình.

• Tạo lớp trừu tượng Viên chức với 2 thuộc tính là tên và hệ số lương theo tháng và PT tính thu nhập theo năm. Xây dựng các lớp Nhân viên, Trưởng phòng và Giám đốc kế thừa lớp Viên chức. Hoàn thiện phương thức tính thu nhập, biết:

- Hệ số lương của Nhân viên là 3.5, Trưởng phòng là 5.0, Giám đốc là 8.0, lương cơ bản là

1.500.000đ.

- Trưởng phòng và Giám đốc có thêm hệ số trách nhiệm lần lượt là 1.0 và 3.3 theo tháng

- Tính thu nhập theo năm thì Nhân viên, Trưởng phòng và Giám đốc lần lượt được thưởng thêm

1, 2 và 3 tháng lương không kèm trách nhiệm

duytrung.tcu@gmail.com

Polymorphism – Tính đa hình

được biểu hiện theo nhiều dạng khác nhau

• Tính đa hình ám chỉ việc một thực thể, một hành động có thể

• Có hai loại đa hình trong Java: đa hình trong phase biên dịch

(compile time) và đa hình trong phase chạy (run time)

• Đa hình trong phase biên dịch: nạp chồng phương thức

• Đa hình trong phase chạy: ghi đè phương thức (method

(method overloading)

duytrung.tcu@gmail.com

overriding)

Runtime polymorphism

trình đã chạy.

• Việc gọi đến phương thức ghi đè được thực hiện khi chương

duytrung.tcu@gmail.com

• PT này được gọi thông qua biến tham chiếu của lớp cha, việc xác định PT phù hợp phụ thuộc vào đối tượng được biến tham chiếu trỏ đến.

Runtime polymorphism

duytrung.tcu@gmail.com

Tổng kết nội dung bài học

• Đặc điểm ngôn ngữ hướng đối tượng

• Khái niệm object

• Các nguyên lý cơ bản của lập trình hướng đối tượng

duytrung.tcu@gmail.com

• Class trong Java

Yêu cầu về nhà

• Ôn bài, tham chiếu với các nguồn tài liệu tham khảo

• Chạy các ví dụ trong bài, tìm và chạy các ví dụ trong các tài liệu

• Tìm hiểu trước về exception trong Java

duytrung.tcu@gmail.com

• Làm bài tập và tự tìm hiểu nội dung đã yêu cầu