Chapter 2 Ngôn ngữ Lập trình Java

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

Mục tiêu

Chương này nhằm giới thiệu các thành phần cơ bản của ngôn ngữ lập trình Java, cách biên dịch và thực thi chương trình và cơ bản về cách xử lý ngoại lệ trong Java

CT176 – Lập trình Hướng đối tượng 2

TS. Trần Công Án

 Ngôn ngữ lập trình Java

Nội dung

• Cấu trúc của một chương trình Java • Dịch và thực thi một chương trình Java • Cú pháp của ngôn ngữ Java • Các kiểu dữ liệu cơ bản trong Java • Cấu trúc điều khiển • Tạo lớp và đối tượng • Khởi tạo và hủy đối tượng • Xử lý ngoại lệ

CT176 – Lập trình Hướng đối tượng 3

TS. Trần Công Án

 Cấu trúc một chương trình Java

Cấu trúc một chương trình Java

CT176 – Lập trình Hướng đối tượng

4

TS. Trần Công Án

 Cấu trúc một chương trình Java

Ví dụ 1 – Hello World

• Một chương trình Java hiển thị câu chào hỏi ra màn

hình:

/* HelloWorld.java */

public class HelloWorld {

public static void main(String args[]) {

System.out.println("Hello!"); System.out.println("How are you?");

}

}

• Kết quả thực thi chương trình:

CT176 – Lập trình Hướng đối tượng 5

TS. Trần Công Án

 Cấu trúc một chương trình Java

Cấu trúc một chương trình Java

chú thích

tên chương trình (phải giống tên tập tin, không bao gồm phần mở rộng)

/* HelloWorld.java */

public class HelloWorld {

chương trình chính (điểm bắt đầu, entry point, của chương trình)

public static void main(String args[]) {

System.out.println("Hello!"); System.out.println("How are you?");

}

}

các lệnh trong chương trình lệnh System.out.println() dùng để hiển thị một chuỗi ra màn hình

• Chú ý:

 tên chương trình và tên tập tin phải giống nhau  hàm main() có chức năng giống như hàm main() trong C

CT176 – Lập trình Hướng đối tượng 6

TS. Trần Công Án

 Cấu trúc một chương trình Java

Ví dụ 2 – Chương trình có nhiều hàm

chương trình chính (main)

public class Arithmetic {

public static void main(String[] args) {

System.out.println("The sum of 2 and 3 = " + (2+3)); System.out.println("(7 + 8)/2=" + avg(7, 8));

}

gọi hàm

public static float avg(float a, float b) {

return (a + b)/2;

}

}

hàm tính trung bình hai số avg()

• Kết quả thực thi chương trình:

CT176 – Lập trình Hướng đối tượng 7

TS. Trần Công Án

 Cấu trúc một chương trình Java

Ví dụ 3 – Giao diện đồ họa

Khai báo sử dụng lớp JFrame

import javax.swing.JFrame; class MyGUIApp {

public static void main(String[] args) {

JFrame myWindow; myWindow = new JFrame(); myWindow.setSize(300, 200); myWindow.setTitle("My First Java Program"); myWindow.setVisible(true);

}

}

• Lệnh import: khai báo sử

dụng các lớp (thư viện lớp) từ bên ngoài

CT176 – Lập trình Hướng đối tượng 8

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Dịch và thực thi một chương trình Java

CT176 – Lập trình Hướng đối tượng

9

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Đặc điểm của Java

• Java là một ngôn ngữ lập trình vừa thông dịch, vừa biên

dịch.

 Chương trình Java, sau khi phát triển xong sẽ được biên dịch

(compile) sang dạng bytecode bằng trình biên dịch Java.

 Khi cần thực thi một chương trình bytecode, máy ảo Java sẽ

thông dịch từng lệnh bytecode sang mã máy.

• Chương trình Java có tính đa nền (multi-platform): có thể thực thi trên nhiều kiến trúc máy tính và hệ điều hành khác nhau nhờ vào cơ chế thông dịch.

CT176 – Lập trình Hướng đối tượng 10

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Quá trình phát triển 1 chương trình Java

CT176 – Lập trình Hướng đối tượng

11

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Quá trình phát triển 1 chương trình Java

• Người lập trình viết chương trình Java:  Bao gồm 1 tập các câu lệnh (statements)  Dùng công cụ soạn thảo văn bản hay môi trường lập trình IDE  Lưu trong các tập tin có phần mở rộng .java  Được gọi là các chương trình nguồn (source code)

• Trình biên dịch Java biên dịch các chương trình nguồn:

 Thành các chương trình dạng bytecode  Được lưu trong các tập tin với phần mở rộng .class  Các lỗi cú pháp nếu có, sẽ được sinh ra

CT176 – Lập trình Hướng đối tượng 12

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Quá trình phát triển 1 chương trình Java

• Máy ảo Java sẽ thực thi các chương trình bytecode:  Bộ nạp (loader) sẽ nạp chương trình bytecode vào JVM  JVM sẽ thông dịch các lệnh trong chương trình bytecode ra

mã máy ở nền tảng tương ứng để thực thi

• Máy ảo Java:

 Hoạt động như là 1 máy tính ảo: thực thi các mã bytecode (vs. CPU là máy tính “thật”, thực thi các mã máy do JVM thông dịch ra)

 Mã bytecode là giống nhau đối với JVM trên tất cả các nền tảng (hệ điều hành)  Các JVM trên từng nền tảng sẽ dịch mã bytecode sang mã máy ở nền tảng tương ứng

CT176 – Lập trình Hướng đối tượng 13

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Quá trình phát triển 1 chương trình Java

• Máy ảo Java – tính khả chuyển:

Bytecode (.class)

JVM for Windows

JVM for Unix

JVM for Linux

JVM for Mac

Why Java bytecode?

CT176 – Lập trình Hướng đối tượng 14

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Dịch và thực thi 1 chương trình Java

MyGUIApp.class

MyGUIApp.java

java MyGUIApp

javac MyGUIApp.java

• Trình biên dịch: javac • Máy ảo Java: java

CT176 – Lập trình Hướng đối tượng 15

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Môi trường dịch và thực thi chương trình

• Giao diện dòng lệnh:

 Unix + Mac OS: Terminal

 Windows: Command Prompt

CT176 – Lập trình Hướng đối tượng 16

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Môi trường dịch và thực thi chương trình

• Môi trường phát triển tích hợp: Netbean, Eclipse,...

CT176 – Lập trình Hướng đối tượng 17

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Môi trường dịch và thực thi chương trình

• Môi trường phát triển tích hợp: Netbean, Eclipse,...

CT176 – Lập trình Hướng đối tượng 18

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Đối số dòng lệnh (command line argument)

• Khi gọi thực thi một chương trình Java, ta có thể truyền vào các đối số (dữ liệu) từ dòng lệnh cho chương trình  Cú pháp: java [danh sách đối số]  Các đối số cách nhau bằng khoảng trắng  Nếu giá trị của đối số có khoảng trắng thì bao giá trị của đối

số bằng cặp dấu nháy "

• Giá trị của các đối số dòng lệnh sẽ được truyền vào cho

đối số args của hàm main(String args[])

• Chỉ số của các đối số bắt đầu từ 0: args[0], args[1],…

CT176 – Lập trình Hướng đối tượng 19

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Đối số dòng lệnh (command line argument)

/* HelloWorld.java */

public class HelloWorldArg {

public static void main(String args[]) {

System.out.println("Hello " + args[0]); System.out.println("How are you?");

}

}

tham số

CT176 – Lập trình Hướng đối tượng

20

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Thiết lập môi trường phát triển

• Cài đặt JDK (Java Development Kit):

JDK download link : http://goo.gl/lOEB4I

1. 2. Chọn bộ cài đặt thích hợp (Windows, Linux, Mac OS,…) 3. Chạy bộ cài đặt theo hướng dẫn 4. Kiểm tra việc cài đặt: Thực thi các lệnh sau từ dòng lệnh

o Trình biên dịch Java: javac –version o Máy ảo Java: java –version

• Bộ cài đặt JDK bao gồm cả JVM

CT176 – Lập trình Hướng đối tượng 21

TS. Trần Công Án

 Dịch và thực thi một chương trình Java

Thiết lập môi trường phát triển

• Thiết lập môi trường phát triển JDK bằng tay:

1. Copy thư mục chứa JDK vào máy tính (từ máy đã cài đặt) 2. Chọn Computer / Properties/ Advanced

System Settings / Advanced / Environment Variables…

3. Click New:

o Variable name: JAVA_HOME o Variable value: nhập vào đường dẫn chứa JDK

4. Chọn biến path trong User variable for USER 5. Click Edit và thêm vào ô Variable Values:

;%JAVA_HOME%/BIN;.;

6. Nhấn OK để đóng tất cả các hộp thoại 7. Kiểm thử việc cài đặt (tương tự slide trước)

CT176 – Lập trình Hướng đối tượng 22

TS. Trần Công Án

 Các thành phần cơ bản của Java

Các thành phần cơ bản của Java

CT176 – Lập trình Hướng đối tượng

23

TS. Trần Công Án

 Các thành phần cơ bản của Java

Câu lệnh & Chú thích (Statement & Comment)

• Một câu lệnh (statement) Java kết thúc bằng dấu ; • Các lệnh và các định danh (identifier) phân biệt chữ

hoa, chữ thường (case sensitive)

System.out.println("Hello!");

System.out.Println("How are you?");

• Có hai loại chú thích trong Java (giống ngôn ngữ C):

 Trên một dòng: //chú thích  Nhiều dòng:

/* chú thích */ • Một khối lệnh (block) được bao bởi cặp ngoặc nhọn { }

CT176 – Lập trình Hướng đối tượng 24

TS. Trần Công Án

 Các thành phần cơ bản của Java

Biến và Định danh (Variable & Identifier)

• Biến là một vùng nhớ được đặt tên, dùng để trữ dữ liệu

xử lý trong chương trình

 Khai báo biến:

; [<, tên biến 2>...];

• Tên biến được đặt theo qui tắc đặt tên định danh:  Có thể chứa các ký tự (A-Z, a-z), số (0-9), dấu _ và $  Ký tự đầu tiên không được là 1 số  Không được trùng với các từ khóa (keywords) của Java  Phân biệt chữ hoa và chữ thường  Ví dụ: itemOrdered, noOfStudent

CT176 – Lập trình Hướng đối tượng 25

TS. Trần Công Án

 Các thành phần cơ bản của Java

Biến và Định danh (Variable & Identifier)

• Ngoài các qui tắc đặt tên định danh, cần tham khảo

thêm các qui ước đặt tên (naming convention):

 Tên phải mang ý nghĩa  Tên biến, tên phương thức: Pascal case

studentName, dateOfBirdth, sqrt(), println()

 Tên lớp: Title Case

Student, Person, Stack, Queue

 Tên biến thường là các danh từ hoặc cụm danh từ  Các qui ước viết chương trình (coding convention) cho Java: http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html

CT176 – Lập trình Hướng đối tượng 26

TS. Trần Công Án

 Các thành phần cơ bản của Java

Phạm vi của biến

• Phạm vi của biến: các vị trí trong chương trình có thể

truy xuất được biến

 Một biến được khai báo trong khối lệnh nào thì chỉ được truy

xuất bên trong khối lệnh đó

 Phạm vi của biến là từ câu lệnh khai báo biến cho đến cuối

khối lệnh chứa khai báo biến

 Một biến sẽ bị hủy (vùng nhớ dành cho biến bị thu hồi) khi

chương trình thực thi ra khỏi phạm vi của biến

CT176 – Lập trình Hướng đối tượng 27

TS. Trần Công Án

 Các thành phần cơ bản của Java

Từ khóa (Keywords)

• Từ khóa là các từ dành riêng cho Java:

static super switch synchronized this throw throws transient true try void volatile while

abstract assert boolean break byte case catch char class const continue default do

double else enum extends false for final finally float goto if implements import

instanceof int interface long native new null package private protected public return short

CT176 – Lập trình Hướng đối tượng 28

TS. Trần Công Án

 Các thành phần cơ bản của Java

Các kiểu dữ liệu nguyên thủy

• Java có 8 kiểu dữ liệu nguyên thủy (primitive datatype):

 Kiểu số nguyên:

o byte o short o int o long  Kiểu số thực: o float o double

 Kiểu luận lý: boolean  Kiểu ký tự: char

CT176 – Lập trình Hướng đối tượng 29

TS. Trần Công Án

 Các thành phần cơ bản của Java

⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu số (numeric datatype)

Miền giá trị

Kiểu DL

Kích thước

1 byte

-128 to +127

byte

2 bytes

-32,768 to +32,767

short

int

4 bytes

-2,147,483,648 to +2,147,483,647

long

8 bytes

-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807

float

4 bytes ±3.410-38 to ±3.41038, with 7 digits of accuracy

double

8 bytes ±1.710-308 to ±1.710308, with 15 digits of accuracy

• Kích thước: dung lượng bộ nhớ được cấp phát cho 1

biến có kiểu tương ứng.

CT176 – Lập trình Hướng đối tượng 30

TS. Trần Công Án

 Các thành phần cơ bản của Java

⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu số (numeric datatype)

• Hằng giá trị số (numeric literal):  Số nguyên: 0, 5, 10, 12, -25, -30,...  Số thực: các hằng giá trị số thực có kiểu mặc nhiên là

double

//Khai báo biến a kiểu int

 Ví dụ:

//Khai báo biến b kiểu float

int a; float b; a = 123; b = 123.5;

//Sai!

Giá trị kiểu double không tương thích với biến số kiểu float vì độ chính xác khác nhau (7 vs. 15 số lẻ).

⇒ b = 123.4F;

 Có thể dùng cách biểu diễn bằng ký hiệu E (E-notation):

number = 1.234E2F;

CT176 – Lập trình Hướng đối tượng 31

TS. Trần Công Án

 Các thành phần cơ bản của Java ⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu số (numeric datatype)

// This program has variables of several of the integer types. public class IntegerVariables {

public static void main(String[] args) {

// Declare a byte variable named miles.

int checking; // Declare an int variable named checking. byte miles; short minutes; // Declare a short variable named minutes. long days;

// Declare a long variable named days.

checking = -20; miles = 105; minutes = 120; days = 185000; System.out.println("We’ve made a journey of " + miles +

" miles.");

System.out.println("It took us " + minutes + " minutes."); System.out.println("Our account balance is $" + checking);

}

}

CT176 – Lập trình Hướng đối tượng

32

TS. Trần Công Án

 Các thành phần cơ bản của Java ⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu số (numeric datatype)

// This program demonstrates the double data type.

public class Sale {

public static void main(String[] args) {

double price, tax, total;

price = 29.75; tax = 1.76; total = 31.51; System.out.println("The price of the item " +

"is " + price);

System.out.println("The tax is " + tax); System.out.println("The total is " + total);

}

}

CT176 – Lập trình Hướng đối tượng

33

TS. Trần Công Án

 Các thành phần cơ bản của Java

⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu luận lý (boolean datatype)

• Giá trị luận lý có thể mang 1 trong 2 giá trị:

 true  false

• Một biến luận lý chỉ có thể được gán 1 trong hai giá trị

này (khác với ngôn ngữ lập trình C)

• Thông thường, các biến/giá trị luận lý được sử dụng

trong các câu lệnh điều kiện (conditional statement) và lặp (loop)

CT176 – Lập trình Hướng đối tượng 34

TS. Trần Công Án

 Các thành phần cơ bản của Java ⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu luận lý (boolean datatype)

// A program for demonstrating boolean variables

public class TrueFalse {

public static void main(String[] args) {

boolean bool;

bool = true; System.out.println(bool); bool = false; System.out.println(bool);

}

}

CT176 – Lập trình Hướng đối tượng

35

TS. Trần Công Án

 Các thành phần cơ bản của Java

⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu ký tự (char datatype)

• Kiểu dữ liệu ký tự cho phép thao tác trên 1 ký tự • Một hằng giá trị kiểu ký tự được bao trong một cặp dấu

ngoặc đơn ‘’

 Ví dụ: ‘a’, ‘Z’, ‘\n’, ‘\t’, ‘2’ • Mỗi ký tự có một mã ký tự (character code):  Ví dụ: ký tự ‘A’ có mã là 65, ‘B’ có mã là 66,...  Khi thao tác trên ký tự, ta có thể sử dụng ký tự được bao

trong dấu ngoặc đơn hoặc mã ký tự.  Mã ký tự có giá trị từ 0 – 65.535 (216 – 1)

• Kích thước của mỗi ký tự là 2 bytes (Unicode)

CT176 – Lập trình Hướng đối tượng 36

TS. Trần Công Án

 Các thành phần cơ bản của Java ⤷ Các kiểu dữ liệu nguyên thủy

Kiểu dữ liệu ký tự (char datatype)

//Chương trình minh họa sử dụng kiểu dữ liệu

public class Letters {

public static void main(String[] args) {

char ch;

//ch = 'B';

ch = 'A'; System.out.println(ch); ch = 66; System.out.println(ch);

}

}

CT176 – Lập trình Hướng đối tượng

37

TS. Trần Công Án

 Các thành phần cơ bản của Java

Gán giá trị cho biến

• Để gán giá trị cho biến, ta dùng toán tử gán =

=

//Chương trình minh họa phép gán

public class Initialize {

public static void main(String[] args) {

int month, days;

month = 2; days = 28; System.out.println("Month " + month + " has " +

days + " days.");

}

}

CT176 – Lập trình Hướng đối tượng 38

TS. Trần Công Án

 Các thành phần cơ bản của Java

Khởi tạo giá trị cho biến

• Một biến có thể được khởi tạo giá trị ngay khi khai báo

[= giá trị];

//Chương trình minh họa khởi tạo giá triị cho biến public class Initialize {

public static void main(String[] args) {

int month = 2, days = 28;

System.out.println("Month " + month + " has " +

days + " days.");

}

}

• Lưu ý: biến phải được khởi tạo hoặc gán giá trị trước

khi được truy xuất giá trị.

CT176 – Lập trình Hướng đối tượng 39

TS. Trần Công Án

 Các thành phần cơ bản của Java

Toán tử toán học (arithmetic operators)

Ý nghĩa

Ví dụ

total = cost + tax;

Toán tử +

Cộng

cost = total – tax;

-

a = -b;

Trừ Trừ một ngôi

tax = cost * rate;

*

Nhân

salePrice = original / 2;

/

Chia

remainder = value % 5;

%

Chia dư

a++;

++a;

++

Tăng

a--;

--a;

--

Giảm

• Toán tử / sẽ là toán tử chia nguyên nếu cả hai toán hạng đều là

kiểu số nguyên, ngược lại sẽ là phép chia thực.

• Độ ưu tiên của các toán tử tương tự như ngôn ngữ C

CT176 – Lập trình Hướng đối tượng 40

TS. Trần Công Án

 Các thành phần cơ bản của Java

Các toán tử khác

• Toán tử so sánh (comparisons):

== != < <= > >=

• Toán tử luận lý (boolean operators):

&& || !

• Toán tử trên bit (bitwise operators):

& | ^

• Toán tử kết hợp (combined operators): kết hợp các toán tử toán học và phép gán vào cùng 1 toán tử.

+= -= *= /= %= &= |= ^=

CT176 – Lập trình Hướng đối tượng 41

TS. Trần Công Án

 Các thành phần cơ bản của Java

Biểu thức (expression)

• Biểu thức là một biến hay sự kết hợp giữa toán tử với

các biến, hằng hay các biểu thức khác.

Biểu thức số học

• Ví dụ: -5 8 – 7 2 + 3 * 5 (b * b) + (4 * a * c)

Biểu thức luận lý

(month > 0) && (month <= 12) (year % 100) == 0

CT176 – Lập trình Hướng đối tượng 42

TS. Trần Công Án

 Các thành phần cơ bản của Java

Biểu thức (expression)

• Chú ý qui tắc chuyển đổi kiểu của biểu thức toán học:  Nếu tất cả các toán hạng là kiểu nguyên thì biểu thức trả về

kiểu nguyên

 Nếu có ít nhất một toán hạng kiểu số thực thì biểu thức trả

về kiểu thực

 Biểu thức được định giá theo thứ tự ưu tiên của các toán tử

• Ví dụ:

 3/2 + 4.0 = 1 + 4.0 = 5.0  (3/2 + 4.0)/2 = (1 + 4.0)/2 = 5.0/2 = 2.5  14.6 / 2 + 5 = 7.3 + 5 = 12.3

CT176 – Lập trình Hướng đối tượng 43

TS. Trần Công Án

 Các thành phần cơ bản của Java

Ép kiểu (type casting)

• Ép kiểu dữ liệu (type casting) của một giá trị từ kiểu này

sang kiểu khác.

 Ép kiểu tự động (implicit): Java tự động ép kiểu các toán hạng

trong một biểu thức khi có sự không tương thích về kiểu

 Ép kiểu tường minh (explicit): người lập trình yêu cầu ép kiểu

một cách tường minh

• Cú pháp: (kiểu dữ liệu)  "a = " + 3 = "a = " + "3" = "a = 3"  3 / 2 + 4.0 = 1 + 4.0 = 1.0 + 4.0 = 5.0  (float)3 / 2 + 4.0 = 1.5 + 4.0 = 5.5  (int) 11 * 0.3 = ?

CT176 – Lập trình Hướng đối tượng 44

TS. Trần Công Án

 Các thành phần cơ bản của Java

Ép kiểu (type casting)

• Java API cũng cung cấp một số hàm để chuyển đổi kiểu • Một số hàm chuyển đổi kiểu thông dụng:

tương ứng với một chuỗi số.

 float Float.parseFloat(String s): trả về giá trị số thực

(float) tương ứng với một chuỗi số.

 int Integer.parseInt(String s): trả về giá trị số nguyên

(double) tương ứng với một chuỗi số.

 double Double.parseDouble(String s): trả về giá trị số thực

ứng với một số nguyên

 …

CT176 – Lập trình Hướng đối tượng 45

TS. Trần Công Án

 String Interger.toString(int a): trả về một chuỗi tương

 Các thành phần cơ bản của Java

Ép kiểu (type casting)

public class TypeCasting {

public static void main(String[] args) {

System.out.println("(int)(7.9) = " + (int)(7.9)); System.out.println("(int)(3.3) = " + (int)(3.3)); System.out.println("(double)(5 + 3) = " + (double)(5 + 3)); System.out.println("(double)(15)/2 = " + ((double)(15)/2)); System.out.println("(double)(15/2) = " + ((double)(15/2))); System.out.println("(int)(7.8 + (double)(15)/2) = " +

((int)(7.8 + (double)(15)/2)));

System.out.println("(int)(7.8 + (double)(15/2)) = " +

((int)(7.8 + (double)(15/2))));

}

}

CT176 – Lập trình Hướng đối tượng

46

TS. Trần Công Án

 Các thành phần cơ bản của Java

Kiểu dữ liệu chuỗi (String datatype)

• Một chuỗi được xem như là một dãy các ký tự • Một hằng chuỗi ký tự được bao trong cặp ngoặc kép “”

 Ví dụ: “Hello World”, “Chào bạn”

• Mỗi ký tự trong chuỗi có 1 chỉ số với chỉ số của ký tự

đầu tiên của chuỗi được đánh từ 0 • Kiểu dữ liệu chuỗi trong Java: String • Toán tử trên chuỗi: + (cộng, ghép chuỗi)

System.out.println("The sum = " + 12 + 26);

• Lưu ý: String là một lớp ⇒ hỗ trợ nhiều phương thức để thao tác trên chuỗi, sẽ được giới thiệu sau.

CT176 – Lập trình Hướng đối tượng 47

TS. Trần Công Án

 Các thành phần cơ bản của Java

Kiểu dữ liệu chuỗi (String datatype)

// This program demonstrates a few of the String methods.

public class StringMethods {

public static void main(String[] args) {

String message = "Java is Great Fun!"; String upper = message.toUpperCase(); String lower = message.toLowerCase(); char letter = message.charAt(2); int stringSize = message.length();

System.out.println(message); System.out.println(upper); System.out.println(lower); System.out.println(letter); System.out.println(stringSize);

}

CT176 – Lập trình Hướng đối tượng

48

TS. Trần Công Án

}

 Nhập/Xuất căn bản

Nhập/Xuất căn bản

CT176 – Lập trình Hướng đối tượng

49

TS. Trần Công Án

 Nhập/Xuất căn bản

Xuất dữ liệu ra màn hình

• System.out.println(String s): xuất + xuống dòng • System.out.print(String s): xuất, không xuống dòng • System.out.printf(String format, Object… args): hiển thị dữ liệu có định dạng, tương tự như hàm printf() của C

System.out.printf("Phuong trinh co nghiem %.2f",

-(float)b/a);

 Cú pháp định dạng có thể tham khảo tại: https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax

CT176 – Lập trình Hướng đối tượng 50

TS. Trần Công Án

 Nhập/Xuất căn bản

Đọc dữ liệu từ bàn phím

• Muốn nhập dữ liệu từ bàn phím, ta dùng lớp Scanner, kết hợp với System.in như sau:

 Tạo một Scanner:

Scanner keyboard = new Scanner(System.in);

 Lớp Scanner được định nghĩa trong java.util, vì vậy ta

phải thêm vào lệnh sau ở đầu chương trình:

import java.util.Scanner;

 Đọc dữ liệu từ bàn phím: dùng các hàm

o String nextLine(): đọc một chuỗi ký tự o int nextInt(): đọc một số nguyên kiểu int o long nextLong(): đọc một số nguyên kiểu long o float nextFloat(): đọc một số thực kiểu float o ...

CT176 – Lập trình Hướng đối tượng 51

TS. Trần Công Án

 Nhập/Xuất căn bản

Đọc dữ liệu từ bàn phím

import java.util.Scanner;

public class PTB1 {

public static void main(String args[]) {

//Tạo đối tượng thuộc lớp Scanner để nhập dữ liệu từ bàn phím Scanner keyboard = new Scanner(System.in);

int a, b; System.out.print("a = "); a = keyboard.nextInt(); System.out.print("b = "); b = keyboard.nextInt(); System.out.printf("Nghiem cua PT x = %.2f", -(float)b/a);

}

}

• Lưu ý: g/sử a, b khác 0 và phương trình luôn có nghiệm

CT176 – Lập trình Hướng đối tượng 52

TS. Trần Công Án

//đọc một số nguyên

 Nhập/Xuất căn bản

Đọc dữ liệu từ bàn phím

• Chú ý tr/hợp dữ liệu còn sót trong bộ đệm bàn phím

import java.util.Scanner; public class ScannerFlush {

//Tạo đối tượng thuộc lớp Scanner để nhập dữ liệu từ bàn phím Scanner keyboard = new Scanner(System.in);

public static void main(String args[]) {

String name; long ID; System.out.print("Enter your ID: "); ID = keyboard.nextLong();

keyboard.nextLine();

System.out.println("ID :" + ID + ", name: " + name);

System.out.print("Enter your name: "); name = keyboard.nextLine();

}

CT176 – Lập trình Hướng đối tượng 53

TS. Trần Công Án

}

 Cấu trúc điều khiển trong Java

Cấu trúc điều khiển trong Java

CT176 – Lập trình Hướng đối tượng

54

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

Cấu trúc điều khiển (control structure)

• Cấu trúc điều khiển: điều khiển cách thức thực hiện các

lệnh trong chương trình. • Có 3 cấu trúc điều khiển:

Câu lệnh 1

 Tuần tự (sequence, mặc nhiên)  Lựa chọn (selection)  Lặp (repetition)

Câu lệnh 2

. . .

Câu lệnh n

CT176 – Lập trình Hướng đối tượng 55

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

Cấu trúc rẽ nhánh (selection structure)

• Lựa chọn 1 trong 2 công việc (khối lệnh) để thực hiện

dựa trên 1 điều kiện cho sẵn.

đúng

sai

Khối lệnh 1

Khối lệnh 2

Biểu thức điều kiện

• Các lệnh rẽ nhánh:  if … else  switch … case

CT176 – Lập trình Hướng đối tượng 56

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc rẽ nhánh

Lệnh rẽ nhánh if … else

• Lệnh if đầy đủ:

if (biểu thức điều kiện) {

statement T;

} else {

statement F;

}

 Nếu điều kiện đúng, thực hiện statement T, ngược lại

thực hiện statement F.

 Statement T/F có thể là một hoặc nhiều câu lệnh  Trong trường hợp chỉ có 1 câu lệnh thì không cần cặp dấu

ngoặc nhọn

CT176 – Lập trình Hướng đối tượng 57

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc rẽ nhánh

Lệnh rẽ nhánh if … else

• Ví dụ: tìm giá trị lớn nhất (max):

if (x > y) {

max = x;

} else {

max = y;

}

đúng

sai

max = x

x > y ?

max = y

CT176 – Lập trình Hướng đối tượng 58

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc rẽ nhánh

Lệnh rẽ nhánh if … else

• Lệnh rẽ nhánh if không có mệnh đề else:

if (biểu thức điều kiện) {

statement T;

}

 Nếu điều kiện đúng, thực hiện statement T

Tìm giá trị tuyệt đối

đúng

x < 0 ?

x = -x

if (x < 0) { x = -x;

}

sai

CT176 – Lập trình Hướng đối tượng 59

TS. Trần Công Án

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh

Lệnh rẽ nhánh if … else

import java.util.Scanner; public class PTB1 {

public static void main(String args[]) {

Scanner keyboard = new Scanner(System.in);

int a, b; System.out.print("a = "); a = keyboard.nextInt(); System.out.print("b = "); b = keyboard.nextInt(); if (a == 0) {

if (b == 0)

System.out.println("PT vo so nghiem");

System.out.println("PT vo nghiem");

else

} else

System.out.printf("PT co nghiem x = %.2f", -(float)b/a);

}

CT176 – Lập trình Hướng đối tượng

60

TS. Trần Công Án

}

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh

Lệnh lựa chọn switch … case

đúng

switch (exp) { case value1:

exp=value_1? Statements_ 1 break

(nếu ko có break)

sai

statements_1; break; case value_2:

break

Statements_ 2 (nếu ko có break)

đúng exp=value_2?

sai

statements_2; break;

. . .

(nếu ko có break)

... case value_n:

đúng

exp=value_n? Statements_n break

statements_n; break;

sai

default:

statements;

Không bắt buộc

default? Statements

}

CT176 – Lập trình Hướng đối tượng

61

TS. Trần Công Án

không

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc rẽ nhánh

Lệnh lựa chọn switch … case

• Giải thích:

 exp phải là một biểu thức có giá trị kiểu số nguyên hoặc kiểu

ký tự (từ Java 7 trở đi có thể là kiểu chuỗi)

 Mệnh đề case nào có giá trị bằng với giá trị của exp, thì các câu lệnh từ mệnh đề case đó cho đến hết lệnh switch sẽ được thực hiện, hoặc cho đến khi gặp lệnh break  Lệnh break dùng để thoát ra khỏi cấu trúc switch  Các câu lệnh trong mệnh đề default (không bắt buộc) sẽ được thực hiện nếu giá trị của exp không nằm trong các giá trị được liệt kê trong các mệnh đề case

CT176 – Lập trình Hướng đối tượng 62

TS. Trần Công Án

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh

Lệnh lựa chọn switch … case

switch (grade) { case 'A':

System.out.println("The grade is A."); break; case 'B':

System.out.println("The grade is B."); break; case 'C':

System.out.println("The grade is C."); break; case 'D':

System.out.println("The grade is D."); break; case 'F':

System.out.println("The grade is F."); break;

default:

}

CT176 – Lập trình Hướng đối tượng

63

TS. Trần Công Án

System.out.println("The grade is invalid.");

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh

Lệnh lựa chọn switch … case

switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:

System.out.println("31-day month"); break;

case 4: case 6: case 9: case 11:

System.out.println("30-day month"); break;

default:

System.out.println("28/29-day month");

CT176 – Lập trình Hướng đối tượng

64

TS. Trần Công Án

}

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc lặp

Cấu trúc lặp (repetition/loop)

• Được sử dụng để thực hiện lặp đi lặp lại 1 tác vụ (khối

lệnh) 1 số lần dựa vào điều kiện cho trước

sai

Biểu thức điều kiện

• Các lệnh lặp:  while  for  do … while

đúng

. . .

Câu lệnh 1

Câu lệnh n

CT176 – Lập trình Hướng đối tượng 65

TS. Trần Công Án

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp

Lệnh lặp while

while (biểu thức điều kiện) {

1. Kiểm tra “biểu thức điều

kiện”

thân vòng lặp

câu lệnh 1; . . . câu lệnh n;

2. Nếu đúng, thực hiện thân

}

vòng lặp Ngược lại, thoát khỏi vòng lặp

3. Trở lại bước 1.

sai

Biểu thức điều kiện

đúng

. . .

Câu lệnh 1

Câu lệnh n

CT176 – Lập trình Hướng đối tượng

66

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc lặp

Lệnh lặp while

• Lưu ý:

 Điều kiện được kiểm tra trước khi thực hiện thân vòng lặp

⇒ Thân vòng có thể không được thực hiện lần nào cả nếu điều kiện sai từ đầu

 Vòng lặp với số lần lặp vô tận được gọi là vòng lặp vô tận

(infinite loop)

 Để không bị trường hợp lặp vô tận, trong thân vòng lặp phải

có ít nhất 1 lệnh thay đổi giá trị của biểu thức điều kiện  Vòng lặp while thường được sử dụng cho các trường hợp

chưa xác định số lần lặp

int x = 20; while (x > 0)

System.out.println("x is greater than 0");

CT176 – Lập trình Hướng đối tượng 67

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc lặp

Lệnh lặp while

• Ví dụ: Hiển thị các giá trị 2i với 2i <= 2N, N được truyền

qua đối số dòng lệnh.

public class PowersOfTwo {

args[0]

public static void main(String[] args) { int N = Integer.parseInt(args[0]);

$java PowersOfTwo 6

int i = 0; int v = 1; while (i <= N) {

System.out.println(i + "\t" + v); i = i + 1; v = 2 * v;

}

}

}

CT176 – Lập trình Hướng đối tượng 68

TS. Trần Công Án

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp

Lệnh lặp do … while

do {

1. Thực hiện thân vòng lặp

2. Định giá “biểu thức điều

thân vòng lặp

câu lệnh 1; . . . câu lệnh n;

} while (biểu thức điều kiện);

kiện”: a) Nếu đúng, trở lại bước 1 b) Ngược lại, thoát khỏi vòng lặp

Câu lệnh 1

• Nhận xét:

. . .

 Thân vòng lặp luôn được thực

hiện ít nhất 1 lần

Câu lệnh n

tận

 Thường được sử dụng trong

đúng

Biểu thức điều kiện sai

trường hợp số lần lặp chưa xác định

CT176 – Lập trình Hướng đối tượng

69

TS. Trần Công Án

 Chú ý trường hợp vòng lặp vô

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp

Lệnh lặp do … while

// Needed for the Scanner class

import java.util.Scanner; public class DoWhileSqrt {

public static void main(String[] args) {

int n; char repeat; // number that will be calculated the square root // To hold 'y' or 'n'

Scanner keyboard = new Scanner(System.in); do {

System.out.println("SQRT of " + n + " is " + Math.sqrt(n));

System.out.print("Enter a number: "); n = keyboard.nextInt(); keyboard.nextLine();

System.out.print("Continue (y/n)? "); repeat = keyboard.nextLine().charAt(0); // Read a line.

}

} while (repeat == 'Y' || repeat == 'y');

CT176 – Lập trình Hướng đối tượng

70

TS. Trần Công Án

}

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp

Lệnh lặp for

for (init; condition; increment) {

statement 1;

init

...

thân vòng lặp

statement n;

condition?

}

đúng

Statement 1

sai

. . .

Statement n

1. Thực hiện biểu thức khởi tạo 2. Định giá “biểu thức điều kiện”: a) Nếu sai, thoát khỏi vòng lặp b) Nếu đúng, sang bước 3 3. Thực hiện thân vòng lặp

increment

4. Thực hiện biểu thức tăng/lặp

CT176 – Lập trình Hướng đối tượng

71

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc lặp

Lệnh lặp for

• Nhận xét:

 Biểu thức khởi tạo (init) được thực hiện 1 lần duy nhất trước

khi vào vòng lặp.

o Có thể khai báo biến trong biểu thức khởi tạo

 Chức năng của biểu thức điều kiện tương tự lệnh lặp while  Biểu thức lặp/tăng (increment) được thực hiện sau mỗi lần

thực hiện xong thân vòng lặp

 Cả ba biểu thức trong lệnh lặp đều không bắt buộc  Lệnh lặp for thường được sử dụng trong trường hợp biết

trước số lần lặp

 Lệnh lặp for chuyển về lệnh lặp while và ngược lại  Biểu thức khởi tạo và lặp có thể chứa nhiều lệnh, cách nhau

bằng dấu ,

CT176 – Lập trình Hướng đối tượng 72

TS. Trần Công Án

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp

Lệnh lặp for

import java.util.Scanner; // Needed for the Scanner class

public class ForSum_1_N {

public static void main(String[] args) {

int n; Scanner keyboard = new Scanner(System.in);

// Get the maximum value to display. System.out.print("n = "); n = keyboard.nextInt();

// Calculate the sum int sum = 0; for (int i = 1; i <= n; i++)

System.out.println("1 + 2 + ... + " + n + " = " + sum);

sum += i;

}

CT176 – Lập trình Hướng đối tượng

73

TS. Trần Công Án

}

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc lặp

Lệnh lặp for

• Chuyển đổi giữa lệnh lặp for và while

for (init; condition; increment) {

statement 1;

...

statement n;

while (condition) { statement 1; . . . statement n;

}

}

for (; condition; ) {

statement 1;

...

statement n;

}

init; while (condition) { statement 1; . . . statement n; increment;

}

CT176 – Lập trình Hướng đối tượng 74

TS. Trần Công Án

 Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp

Lệnh lặp for

khởi tạo

int i = 0; int v = 1; while (i <= N) {

Biểu thức tăng

System.out.println(i + "\t" + v); v = 2 * v; i = i + 1;

}

for (int i=0, int v=1; i <= N; i++, v *= 2)) {

System.out.println(i + "\t" + v);

}

int v = 1; for (int i=0; i <= N; i++)) {

Thông thường

System.out.println(i + "\t" + v); v = 2 * v;

}

CT176 – Lập trình Hướng đối tượng

75

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

⤷ Cấu trúc lặp

Các cấu trúc điều khiển lồng nhau

• Các cấu trúc điều khiển có thể được lồng nhau:

Giải PT bậc 1

if (a == 0) {

System.out.println(“PT vo nghiem");

if (b == 0)

else

Hiển thị tam giác các dấu *

System.out.println(“PT vo so nghiem");

for (int i=0; i<5; i++) {

} else { ... for (int j=0; j <= i; j++)

} System.out.print("*");

}

System.out.println("");

Tính tổng các số chẵn từ 1..N int sum = 0; for (int i=0; i < N; i++) {

if (i % 2 == 0) sum += i;

* * * * * * * * * * * * * * *

CT176 – Lập trình Hướng đối tượng 76

TS. Trần Công Án

}

 Cấu trúc điều khiển trong Java

Lệnh break và continue

• Lệnh break: Kết thúc một vòng lặp

 Khi gặp lệnh break, vòng lặp sẽ kết thúc ngay lặp tức, bất kể

giá trị của biểu thức điều kiện

 Lệnh này còn được sử dụng trong câu lệnh switch...case

• Lệnh continue: Bắt đầu chu kỳ lặp mới

 Khi gặp lệnh continue, chương trình sẽ trở về đầu vòng lặp

để thực hiện chu kỳ lặp mới

 Các lệnh dưới lệnh continue sẽ bị bỏ qua

• Chú ý: Chỉ sử dụng 2 lệnh này khi thật cần thiết vì

chúng phá vỡ tính cấu trúc của chương trình.

CT176 – Lập trình Hướng đối tượng 77

TS. Trần Công Án

 Cấu trúc điều khiển trong Java

Lựa chọn lệnh lặp

• Lệnh lặp while:

 Kiểm tra điều kiện trước (pre-test loop)  Thường được sử dụng cho vòng lặp không xác định

• Lệnh lặp do…while:

 Kiểm tra điều kiện sau (post-test loop)

• Lệnh lặp for:

 Kiểm tra điều kiện trước (pre-test loop)  Thường được sử dụng trong trường hợp lặp với biến đếm

(counting variable), vòng lặp với số lần lặp xác định

CT176 – Lập trình Hướng đối tượng 78

TS. Trần Công Án

 Đối tượng và lớp

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

CT176 – Lập trình Hướng đối tượng

79

TS. Trần Công Án

 Đối tượng và lớp

Đối tượng và lớp (object & class)

• Đối tượng:

 Đối tượng là một thực thể phần mềm, hay là sự mô hình hóa

của một sự vật hay khái niệm trong thực tế

 Chương trình là một tập các đối tượng “tương tác” lẫn nhau  Một đối tượng tồn tại trong bộ nhớ của chương trình, thực

hiện 1 tác vụ hay chức năng nào đó

 Mỗi đối tượng có 2 thành phần:

o Dữ liệu (thuộc tính, attribute): mô tả cho trạng thái của đối tượng o Hành vi (phương thức, method): thể hiện khả năng của đối tượng

 Đối tượng cũng là 1 biến (variable) trong chương trình

CT176 – Lập trình Hướng đối tượng 80

TS. Trần Công Án

 Đối tượng và lớp

Đối tượng và lớp (object & class)

• Lớp:

 Là kiểu (type/datatype) của đối tượng: mỗi đối tượng phải

thuộc 1 kiểu (loại) nào đó

 Là một đặc tả (specification) của một kiểu dữ liệu mới, nó mô

tả các thành phần của kiểu dữ liệu đó:

o Các dữ liệu mà một đối tượng thuộc lớp đó có thể lưu trữ o Các phương thức của các đối tượng thuộc lớp đó

 Có thể hiểu, lớp là một khuôn mẫu để tạo ra các đối tượng.  Ví dụ: String, Scanner là các lớp được định nghĩa sẵn của Java

o Các đối tượng thuộc lớp String có thể chứa các chuỗi ký tự

(String s = "Hello World";) và các thao tác trên chuỗi ký tự (s.toLowerCase(); s.toUpperCase();)

CT176 – Lập trình Hướng đối tượng 81

TS. Trần Công Án

 Đối tượng và lớp

Đối tượng và lớp (object & class)

• Biến kiểu dữ liệu cơ bản:

int i = 5;

Math.sqrt(i);

 Chứa dữ liệu  Tác động lên dữ liệu: gọi các

hàm

String s = "Hellu World”;

• Đối tượng:

s = s.replace("u", "o");

int len = s.length();

 Chứa dữ liệu + các thao tác (phương thức) trên dữ liệu  Tác động lên dữ liệu của đối tượng: gọi các phương thức của chính đối tượng

CT176 – Lập trình Hướng đối tượng

82

TS. Trần Công Án

 Đối tượng và lớp

Khai báo & tạo đối tượng

• Khai báo đối tượng: ; • Đối tượng cũng là biến  cú pháp giống khai báo biến,

trong đó tên lớp đóng vai trò kiểu dữ liệu.

• Tạo đối tượng: dùng toán tử new: new ; • Một biến đối tượng được gọi là biến tham chiếu

(reference variable):

 Bản thân biến không chứa dữ liệu, chỉ là một tham chiếu đến

đối tượng

 Hay nói cách khác, biến tham chiếu chứa “địa chỉ” của đối

tượng mà nó tham chiếu đến

 Muốn cho biến tham chiếu đến đối tượng, dùng phép gán =

CT176 – Lập trình Hướng đối tượng 83

TS. Trần Công Án

 Đối tượng và lớp

Khai báo và tạo đối tượng

• Biến tham chiếu (reference variable)

• Biến kiểu nguyên thủy (primitive datatype variable)  Lưu trực tiếp dữ liệu vào vùng nó được cấp phát

 Lưu địa chỉ của đối tượng mà nó tham chiếu đến

s

x

int x;

String s;

???

???

x

s

45

&2345

x = 45;

s=new String("Hello");

&2345

Hello

Có thể khai báo ngắn gọn: String s = new String("Hello");

CT176 – Lập trình Hướng đối tượng

84

TS. Trần Công Án

 Đối tượng và lớp

Truy xuất các thành phần của đối tượng

• Một đối tượng được truy xuất thông qua biến tham

chiếu đến nó

s.replace("u", "o");

• Cú pháp: . • Ví dụ:

s.toUpperCase();

• Lưu ý:

 Từ bên ngoài lớp, chỉ được truy xuất đến các thành phần public hoặc default (không khai báo thuộc tính truy cập)  Trong cùng một lớp, 1 phương thức có thể truy xuất tất cả

các thành phần khác

CT176 – Lập trình Hướng đối tượng 85

TS. Trần Công Án

 Đối tượng và lớp

Tạo lớp căn bản

• Cú pháp tạo lớp:

[phạm vi truy cập] class {

//các thành phần của lớp: thuộc tính + phương thức

}

 Phạm vi truy cập: pubic, protected, private.  Trong một tập tin có thể định nghĩa nhiều lớp, tuy nhiên chỉ được có nhiều nhất một lớp có phạm vi truy cập là public

 Các phạm vi truy cập có liên quan đến khái niệm gói

(package) nên sẽ được đề cập sau

 Tên lớp: đặt theo qui tắc đặt tên định danh. Thông thường

đặt theo qui tắc title case (chữ cái đầu tiên của mỗi từ được viết hoa)

CT176 – Lập trình Hướng đối tượng 86

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

Thuộc tính của lớp

• Thuộc tính: tương tự cú pháp khai báo biến

[thuộc tính truy cập] ;

 Thuộc tính truy cập: xác định thuộc tính có thể được truy cập

từ đâu, chỉ bên trong lớp hay có thể từ bên ngoài lớp,… o public: thuộc tính có thể được truy cập từ bất kỳ phạm vi nào o private: thuộc tính chỉ có thể được truy cập từ bên trong lớp  Kiểu dữ liệu: có thể là một kiểu dữ liệu nguyên thủy hay lớp.  Tên thuộc tính: theo qui tắc và qui ước đặt tên biến

 Lưu ý: các thuộc tính thường được khai báo là private và việc

truy xuất các thuộc tính sẽ thông qua các phương thức

CT176 – Lập trình Hướng đối tượng 87

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

Phương thức của lớp

• Phương thức: tương tự cú pháp tạo hàm

[access modifier] ([parameters]) {

//thân phương thức (hàm)

signature (chữ ký hàm)

}

prototype (nguyên mẫu/khai báo)

 Thuộc tính truy cập (modifier): qui định phương thức có thể

được truy cập từ đâu (tương tự như thuộc tính)

 Kiểu dữ liệu trả về (return type): kiểu dữ liệu của giá trị trả về

của hàm, void nếu hàm không trả giá trị về

 Danh sách tham số (parameters): các dữ liệu được truyền

vào cho phương thức

 Thân hàm: các lệnh thực hiện tác vụ của hàm

CT176 – Lập trình Hướng đối tượng 88

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

Lớp Diem2D

• Ví dụ 1: Tạo một lớp điểm trong

không gian hai chiều (2D)

Diem2D

void ganXY(int, int) void hienthi() int layX() int layY() void nhap() float khoangcach(Diem2D) ...

 Dữ liệu: mỗi điểm gồm tọa độ x, y  Phương thức: thiết đặt giá trị x, y; hiển thị tọa độ ra màn hình; lấy giá trị của x, lấy giá trị của y, nhập giá trị cho x, y; tính khoảng cách đến 1 điểm khác;…

int x int y

d(p1, p2)

p2 ●

(x1, y1) p1 ●

CT176 – Lập trình Hướng đối tượng 89

TS. Trần Công Án

(x2, y2)

 Đối tượng và lớp ⤷ Tạo lớp căn bản

Lớp Diem2D

public class Diem2D {

private int x, y; //thuộc tính x, y

public void ganXY(int h, int t) {

/* thân hàm */

}

public void hienthi() {

/* thân hàm */

}

public float khoangcach(Diem2D d) {

/* thân hàm */

} //... Tương tự cho các phương thức khác

}

CT176 – Lập trình Hướng đối tượng

90

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

Thuộc tính truy cập

• Chỉ định phạm vi truy cập tới các thành phần của lớp:  public: có thể truy cập từ bên trong lớp lẫn bên ngoài lớp  private: chỉ có thể được truy cập từ bên trong lớp  protected: có thể truy được truy cập từ bên trong lớp và

các lớp con (trong thừa kế)

 Default (không khai báo): trong cùng gói (package), tương

đương public; khác gói, tương đương private

class A

void funcA() {

obj : class B

B obj = new B();

private String s;

obj.s = …;

public void funcB();

obj.funcB();

int funcD();

a = obj.funcD();

}

CT176 – Lập trình Hướng đối tượng 91

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

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

• Kiểu dữ liệu trả về (return type):

 Phương thức: thực hiện một tác vụ (task) nào đó

⇒ có thể trả về 1 giá trị

 Lệnh return được dùng để trả về 1 giá trị cho lời gọi hàm  Hàm có thể trả về 1 giá trị có kiểu dữ liệu nguyên thủy hoặc

một đối tượng

 Nếu phương thức không trả về giá trị, kiểu dữ liệu trả về phải

được khai báo là void

 Ví dụ:

o Hàm Math.sqrt() tính căn bậc 2 của của 1 số, trả về 1 số thực

⇒ kiểu dữ liệu trả về là double: double sqrt(…);

o Hàm System.out.println() hiển thị 1 chuỗi ra màn hình

⇒ không có giá trị trả về: void println(…);

CT176 – Lập trình Hướng đối tượng 92

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

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

class Test {

public static void main(String []args) {

Test obj = new Test(); System.out.println(obj.random10());

}

//generate a random value in range of [0, 10) public int random10() {

int r = (int)(Math.random() * 10); return r;

Test

}

obj : Test

void main(…) { }

public int random10(){

return ...;

} a random number

• Cú pháp lệnh return: return ;

System.out.println(obj.random10());

}

CT176 – Lập trình Hướng đối tượng 93

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

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

• Tham số của hàm (parameters):

 Một số hàm cần phải được cung cấp dữ liệu để t/hiện tác vụ  Ví dụ: hàm tính căn bậc 2 Math.sqrt() cần phải được truyền vào một giá trị nguyên/thực để nó có thể tính toán

 Đối số: các dữ liệu truyền vào cho hàm

o Cú pháp khai báo 1 đối số: o Các đối số cách nhau bằng dấu phẩy

 Về bản chất, tham số chính là biến cục bộ của phương thức  Ví dụ:

o double sqrt(double n): hàm tính căn bậc hai, nhận vào một số

thực cần tính căn bậc hai

o void PTB1(int a, int b): hàm giải phương trình bậc 1, nhận

2 tham số kiểu int, là hai hệ số a và b

CT176 – Lập trình Hướng đối tượng 94

TS. Trần Công Án

 Đối tượng và lớp

⤷ Tạo lớp căn bản

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

• Tham số của hàm (tt):

 Tham số hình thức: là các tham số trong định nghĩa hay khai

báo hàm

 Tham số thực tế: các biến, biểu thức được truyền vào trong

lời gọi hàm

tham số hình thức

class Math {

//định nghĩa hàm

public static double sqrt(double n) {

}

} class Test {

double a = 2.0, b; b = Math.sqrt(a);

public static void main(String args[]) {

}

tham số thực tế

CT176 – Lập trình Hướng đối tượng 95

TS. Trần Công Án

}

 Đối tượng và lớp

⤷ Tạo lớp căn bản

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

• Tham số của hàm (tt):

 Tham số kiểu dữ liệu nguyên thủy:

o Giá trị của tham số thực tế được truyền vào cho tham số hình thức

⇒ truyền bằng giá trị

o Thay đổi giá trị tham số hình thức không làm thay đổi giá trị của

tham số thực tế

 Tham số kiểu dữ liệu tham chiếu (đối tượng):

o Địa chỉ của đối tượng được tham chiếu bởi tham số thực tế được

truyền vào cho tham số hình thức (cũng là một tham chiếu) ⇒ truyền bằng tham chiếu

o Cả t/số hình thức và t/số thực tế tham chiếu đến cùng 1 đối tượng

⇒ có thể thay đổi giá trị (thuộc tính) của đối tượng được tham chiếu bởi tham số thực tế thông qua tham số hình thức ⇒ là một cách để truyền giá trị trả về cho lời gọi hàm

CT176 – Lập trình Hướng đối tượng 96

TS. Trần Công Án

 Đối tượng và lớp ⤷ Tạo lớp căn bản

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

class Test {

public static void main(String args[]) {

int count = 0; Sinhvien sv1 = new Sinhvien(); test(count, sv1); System.out.println("count = " + count); sv1.hienthi();

}

public static void test(int c, Sinhvien sv) {

c = c + 1; sv.mssv = c; sv.hoten = "Sinh vien " + c;

class Sinhvien {

public int mssv; public String hoten; }

}

public void hienthi() {

System.out.println("MSSV: " + mssv +

", ho ten: " + hoten);

}

CT176 – Lập trình Hướng đối tượng

97

TS. Trần Công Án

}

 Đối tượng và lớp ⤷ Tạo lớp căn bản

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

class Test {

sv1 & count 0 public static void main(String args[]) {

test(count, sv1);

int count = 0; Sinhvien sv1 = new Sinhvien(); mssv = 0 hoten = null

sv c

& 0

}

System.out.println("count = " + count); sv1.hienthi();

sv1 & count 0

public static void test(int c, Sinhvien sv) {

mssv = 1 hoten = “SV 1”

CT176 – Lập trình Hướng đối tượng

98

TS. Trần Công Án

c = c + 1; sv.mssv = c; sv.hoten = "SV " + c; sv c } & 1 }

 Đối tượng và lớp

⤷ Tạo lớp căn bản

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

• Ưu điểm của truyền bằng tham chiếu:

 Tiết kiệm bộ nhớ: tham số kiểu tham chiếu chỉ chứa địa chỉ được truyền vào, không phụ thuộc kích thước của đối tượng

 Có thể sử dụng để trả về nhiều hơn một giá trị cho lời gọi

phương thức

 Tăng tốc độ gọi hàm: chỉ sao chép tham chiếu chứ không sao

chép toàn bộ đối tượng (dữ liệu)

• Lưu ý: việc thay đổi tham chiếu của tham số hình thức không làm thay đổi tham chiếu của tham số thực tế

CT176 – Lập trình Hướng đối tượng 99

TS. Trần Công Án

 Đối tượng và lớp ⤷ Tạo lớp căn bản

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

class Test {

public static void main(String args[]) {

int count = 0; Sinhvien sv1 = new Sinhvien(); test(count, sv1); System.out.println("count = " + count); sv1.hienthi();

}

c = c + 1; sv = new Sinhvien(); sv.mssv = c; sv.hoten = "Sinh vien " + c;

public static void test(int c, Sinhvien sv) {

}

CT176 – Lập trình Hướng đối tượng

100

TS. Trần Công Án

}

 Đối tượng và lớp

⤷ Tạo lớp căn bản

Tái định nghĩa/Chồng phương thức

• Tái định nghĩa phương thức (method overloading): định

nghĩa các phương thức trùng tên

• Các phương thức trùng tên phải khác nhau về tham số

 Khác nhau về số tham số  Khác nhau về kiểu tham số  Khác nhau về thứ tự các tham số

class Point2D {

public void hienthi() {

System.out.println("(" + x + ", " + y + ")");

}

System.out.println(s + "(" + x + ", " + y + ")");

public void hienthi(String s) {

}

CT176 – Lập trình Hướng đối tượng 101

TS. Trần Công Án

}

 Đối tượng và lớp ⤷ Tạo lớp căn bản

Tái định nghĩa/Chồng phương thức

Hợp lệ: public void func1();

Không hợp lệ: public void func2(String);

public void func1(int);

public void func2(String);

public void func1(long);

public int func2(String);

public void func1(String, int);

public void func1(int, String);

public func3(int, long);

public func3(int long);

CT176 – Lập trình Hướng đối tượng

102

TS. Trần Công Án

 Khởi tạo và hủy đối tượng

Khởi tạo và hủy đối tượng

CT176 – Lập trình Hướng đối tượng

103

TS. Trần Công Án

 Khởi tạo và hủy đối tượng

Hàm xây dựng (constructor)

• Là một phương thức đặc biệt của lớp, dùng để khởi tạo

đối tượng (khởi tạo các dữ liệu thành viên)

• Có 2 loại:

 Hàm khởi tạo không có tham số, còn được gọi là hàm xây

dựng mặc nhiên (default constructor)

 Các hàm khởi tạo có tham số

• Cú pháp:

 Phạm vi truy xuất: public  Tên hàm: trùng với tên lớp  Kiểu dữ liệu trả về: không có, kể cả void

CT176 – Lập trình Hướng đối tượng 104

TS. Trần Công Án

 Khởi tạo và hủy đối tượng

Hàm xây dựng (constructor)

class Sinhvien { class Test {

public static void main(String args[]) {

private int mssv; private String hoten;

Sinhvien sv1 = new Sinhvien(); sv1.hienthi();

}

}

} Sinhvien() { mssv = -1; hoten = "unknown";

public void hienthi() {

System.out.println("MSSV: " + mssv +

}

", ho ten: " + hoten);

CT176 – Lập trình Hướng đối tượng

105

TS. Trần Công Án

}

 Khởi tạo và hủy đối tượng

Hàm xây dựng (constructor)

• Một số tính chất:

 Hàm xây dựng sẽ tự động được gọi khi đối tượng được tạo ra  Hàm xây dựng cũng là 1 phương thức của lớp nên nó có thể

được tái định nghĩa (lưu ý qui tắc TĐN phương thức)

 Trong trường hợp có nhiều hàm xây dựng, hàm nào được gọi là tùy vào danh sách tham số truyền vào trong câu lệnh tạo đối tượng

 Lớp có bao nhiêu hàm xây dựng, có bấy nhiêu cách để tạo đối

tượng

 Hàm xây dựng không thể được gọi trực tiếp  Nếu một lớp không có hàm xây dựng, hàm xây dựng không

đối số với thân hàm rỗng sẽ được tự động thêm vào

CT176 – Lập trình Hướng đối tượng 106

TS. Trần Công Án

 Khởi tạo và hủy đối tượng

Hàm xây dựng (constructor)

class Sinhvien {

class TestSinhvien {

public static void main(String args[]) { private int mssv; private String hoten;

Sinhvien sv1 = new Sinhvien(); Sinhvien sv2 = new Sinhvien(1, "NVA"); sv1.hienthi(); sv2.hienthi(); Sinhvien() { mssv = -1; hoten = "unknown"; } } }

mssv = ms; hoten = ht;

Sinhvien(int ms, String ht) {

}

System.out.println("MSSV: " + mssv +

public void hienthi() {

", ho ten: " + hoten);

}

CT176 – Lập trình Hướng đối tượng

107

TS. Trần Công Án

}

 Khởi tạo và hủy đối tượng

Hàm xây dựng (constructor)

class Diem2D { class TestDiem2D { private int x, y; public static void main(String args[]) {

x = y = 0;

public Diem2D() {

Diem2D p1 = new Diem2D(); Diem2D p2 = new Diem2D(5); Diem2D p3 = new Diem2D(2, 1); }

public Diem2D(int th) {

}

x = y = th; p1.hienthi("p1"); p2.hienthi("p2"); p3.hienthi("p3");

}

}

public Diem2D(int h, int t) {

}

x = h; y = t;

public void hienthi(String s) {

System.out.println(s + "(" + x + ", " + y + ")");

}

CT176 – Lập trình Hướng đối tượng

108

TS. Trần Công Án

}

 Khởi tạo và hủy đối tượng

Hàm xây dựng (constructor)

public class TestClock { class Clock { public static void main(String args[]) { private h, m, s;

Clock c1 = new Clock(); Clock c2 = new Clock(5, 10, 20); c1.display(); c2.display();

public Clock() { h = m = s = 0;

}

} }

h = g; m = p; s = gi;

public Clock(int g, int p, int gi) {

}

public void setTime(int g, int p, int gi) {

}

h = g; m = p; s= gi;

public void display() {

System.out.println(h + ":" + m + ":" + s);

}

CT176 – Lập trình Hướng đối tượng

109

TS. Trần Công Án

}

 Khởi tạo và hủy đối tượng

Hàm xây dựng sao chép (copy constructor)

• Là hàm xây dựng với đối số là một đối tượng cùng lớp • Được sử dụng để tạo 1 đối tượng mới “giống” với 1 đối

tượng đã có sẵn

• Cú pháp: public Classname(Classname obj);

 Đây cũng là hàm xây dựng nên cú pháp cũng theo qui tắc

hàm xây dựng: tên hàm trùng tên lớp, không có giá trị trả về

 Hàm luôn có 1 đối số, chính là 1 đối tượng cùng lớp

//hàm xây dựng sao chép của lớp Clock

public Clock(Clock c) {

CT176 – Lập trình Hướng đối tượng 110

TS. Trần Công Án

h = c.h; m = c.m; s = c.s; Clock c1 = new Clock(5, 10, 20); Clock c2 = new Clock(c1); }

 Khởi tạo và hủy đối tượng

Phép gán đối tượng (object assignment)

• Phép gán đối tượng còn được gọi là phép sao chép

tham chiếu (reference copy):

 Cái được sao chép chính là tham chiếu: phép gán

obj1 = obj2 làm cho obj1 và obj2 tham chiếu đến cùng 1 đối tượng  Điều này có thể dẫn đến các lỗi ngoài mong đợi trong chương

trình: obj1 và obj2 luôn có cùng 1 giá trị

obj1

obj1

obj1 = obj2

obj2

obj2

CT176 – Lập trình Hướng đối tượng 111

TS. Trần Công Án

 Khởi tạo và hủy đối tượng

Phép gán đối tượng (object assignment)

Student s1 = new Student(1, "NVA"), s2;

class ObjectAssignment { class Student { public static void main(String []args) {

Student(int i, String n) {

int ID; String name;

ID = i; name = n; s2 = s1; s2.setInfo(2, "NVB"); s1.display("s1"); s2.display("s2"); } }

}

public void display(String s) {

System.out.println(s + " -- ID: " + ID +

", name: " + name);

}

public void setInfo(int i, String n) {

ID = i; name = n;

}

CT176 – Lập trình Hướng đối tượng

112

TS. Trần Công Án

}

 Khởi tạo và hủy đối tượng

Hàm hủy (desctructor)

• Là một phương thức đặc biệt của đối tượng, sẽ tự động được gọi bởi bộ thu hồi rác (garbage collector) khi ra khỏi phạm vi của đối tượng

• Trong Java, hàm hủy được gọi là finalizer (hàm kết thúc) • Cú pháp hàm kết thúc:

 Không có đối số và kiểu dữ liệu trả về, kể cả void  Một lớp chỉ được phép có tối đa 1 hàm kết thúc  Tên của hàm kết thúc: finalizer

• Trong Java, thông thường hàm này ít được sử dụng

CT176 – Lập trình Hướng đối tượng 113

TS. Trần Công Án

 Thêm về lớp và đối tượng

Thêm về lớp và đối tượng (more on class & object)

CT176 – Lập trình Hướng đối tượng

114

TS. Trần Công Án

 Thêm về lớp và Đối tượng

Sao chép cạn (shallow copy)

• Là phép sao chép đối tượng dựa trên phép toán

bitwise  đối tượng mới được tạo ra sẽ “giống y” như đối tượng được sao chép

 Thuộc tính kiểu nguyên thủy: sao chép dữ liệu  Thuộc tính kiểu tham chiếu: sao chép tham chiếu

• Về bản chất:

 Tạo đối tượng mới  Gán lần lượt từng thành phần của đối tượng được sao chép

cho đối tượng mới

CT176 – Lập trình Hướng đối tượng 115

TS. Trần Công Án

 Thêm về lớp và Đối tượng

Sao chép cạn (shallow copy)

• Thực hiện sao chép cạn:

1. Tự viết phương thức sao chép 2. Nạp đè (overriding) và gọi hàm clone() của lớp Object

public Object clone() throws CloneNotSupportedException {

return super.clone();

Date

SinhVien

- int ngay, thang, nam

- String mssv, hoten - Date ngaysinh - Double diemTB

+ …

+ Date() + Date(int, int, int) + void gan(int, int, int) + …

CT176 – Lập trình Hướng đối tượng 116

TS. Trần Công Án

}

 Thêm về lớp và Đối tượng

Sao chép cạn (shallow copy)

class Date {

private int ngay, thang, nam;

public Date(int ngay, int thang, int nam) {

this.ngay = ngay; this.thang = thang; this.nam = nam;

} public void set(int ngay, int thang, int nam) {

this.ngay = ngay; this.thang = thang; this.nam = nam;

} public void hienthi() {

}

System.out.print(ngay + "/" + thang + "/" + nam);

CT176 – Lập trình Hướng đối tượng

117

TS. Trần Công Án

}

 Thêm về lớp và Đối tượng

Sao chép cạn (shallow copy)

class SinhVien implements Cloneable {

private String mssv, hoten; private Date ngaysinh; private double diemTB;

public SinhVien(String mssv, String ht, Date ngsinh, double diemTB) {

this.mssv = mssv; this.hoten = ht; this.ngaysinh = ngsinh; this.diemTB = diemTB;

} public void hienthi() {

System.out.print("{" + mssv + "; " + hoten + "; "); ngaysinh.hienthi(); System.out.println("; " + diemTB + "}");

} public Object clone() throws CloneNotSupportedException {

return super.clone();

}

CT176 – Lập trình Hướng đối tượng

118

TS. Trần Công Án

}

 Thêm về lớp và Đối tượng

Sao chép cạn (shallow copy)

sv1.hienthi(); sv3.hienthi();

public static void main(String []args) throws CloneNotSupportedException { SinhVien sv1 = new SinhVien("111", "NVA", new Date(1,1,2001), 7.0); SinhVien sv3 = new SinhVien("333", "NVB", new Date(2,2,2002), 9.0); System.out.print("SV1: "); System.out.print("SV3: "); System.out.println("-----------------");

//sao chép tham chiếu //sv1 sẽ thay đổi theo

SinhVien sv4 = (SinhVien)sv3.clone(); //sao chép cạn sv4.ganDiemTB(9.5); sv4.layNgaysinh().set(3, 3, 2003);

SinhVien sv2 = sv1; sv2.ganDiemTB(8.0); sv2.layNgaysinh().set(2, 2, 2002);

//sv3 không thay đổi diemTB //sv3 bị thay đổi ngaysinh

sv1.hienthi(); sv2.hienthi();

System.out.println("Gan tham chieu:"); System.out.print("SV1:"); System.out.print("SV2:"); System.out.println("\nSao chep can:"); System.out.print("SV3:"); System.out.print("SV4:"); sv3.hienthi(); sv4.hienthi();

CT176 – Lập trình Hướng đối tượng

119

TS. Trần Công Án

}

 Thêm về lớp và đối tượng

Sao chép sâu (deep copy)

• Sao chép dữ liệu của đối tượng một cách triệt để, cả

các thuộc tính kiểu nguyên thủy lẫn tham chiếu

• Thực hiện: phải tự viết hàm thực hiện • Ví dụ: để thực hiện sao chép hai đối tượng s1 và s2 trong ví dụ trước, ta phải viết thêm phương thức makeCopy() như sau trong lớp Student:

 void makeCopy(Student);  Để sao chép s1 cho s2, ta gọi: s2.makeCopy(s1)

CT176 – Lập trình Hướng đối tượng 120

TS. Trần Công Án

 Thêm về lớp và đối tượng

Sao chép sâu (deep copy)

class ObjectAssignment {

public static void main(String []args) { Student s1 = new Student(1, "NVA"); Student s2 = new Student();

s2.makeCopy(s1); s2.setInfo(2, "NVB");

s1.display("s1"); s2.display("s2"); class Student { }

//dữ liệu //các phương thức

}

public void makeCopy(Student s) {

ID = s.ID; name = s.name;

}

CT176 – Lập trình Hướng đối tượng

121

TS. Trần Công Án

}

 Thêm về lớp và đối tượng

Sao chép sâu (deep copy)

• Một phương pháp khác để sao chép sâu dùng chính phép gán = là tạo một đối tượng mới giống với đối tượng cần được sao chép, sau đó sử dụng phép gán

class ObjectAssignment {

public static void main(String []args) { Student s1 = new Student(1, "NVA"); Student s2 = new Student();

class Student {

s2 = s1.getCopy(); s2.setInfo(2, "NVB");

//dữ liệu //các phương thức

public Student getCopy() { s1.display("s1"); s2.display("s2");

}

}

Student t = new Student(ID, name); return t; }

CT176 – Lập trình Hướng đối tượng 122

TS. Trần Công Án

}

 Thêm về lớp và đối tượng

Thành phần tĩnh (static members)

• Lớp là khuôn mẫu để tạo ra đối tượng

 Các thành phần khai báo trong lớp chỉ tồn tại khi đối tượng

được tạo ra

 Mỗi đối tượng sẽ “sở hữu” các thành phần riêng của mình

⇒ có bao nhiêu đối tượng được tạo ra thì có bấy nhiêu “tập” thành phần trên bộ nhớ

Student

st2:Student st1:Student

2 NVB

1 NVA

- int ID - String name

+ Student() + Student() + display(): void + setInfo(int, String): void

+ Student() + Student() + display(): void + setInfo(int, String): void

+ Student() + Student() + display(): void + setInfo(int, String): void

CT176 – Lập trình Hướng đối tượng 123

TS. Trần Công Án

- ID - name - ID - name

 Thêm về lớp và đối tượng

Thành phần tĩnh (static members)

• Thành phần tĩnh: còn được gọi là thành phần “của lớp”  Khai báo: thêm từ khóa static sau thuộc tính truy xuất  Tồn tại độc lập với các đối tượng: có bao nhiêu đối tượng

được tạo ra thì vẫn chỉ có 1 bản (copy) của thành phần tĩnh trong bộ nhớ

 Thành phần tĩnh được truy xuất trực tiếp thông qua lớp .

 Các phương thức tĩnh chỉ được truy xuất các thành phần tĩnh  Các phương thức không tĩnh có thể truy xuất tất cả các thành

phần tĩnh lẫn không tĩnh

 Các thành phần tĩnh sẽ được khởi tạo các giá trị mặc nhiên

của kiểu dữ liệu của thành phần tĩnh

CT176 – Lập trình Hướng đối tượng 124

TS. Trần Công Án

 Thêm về lớp và đối tượng

Thành phần tĩnh (static members)

class ClockStatic {

class TestClockStatic {

public static void main(String args[]) {

private static int count; private int h, m, s; ClockStatic.noOfInstances());

public ClockStatic() {

ClockStatic c1 = new ClockStatic(); ClockStatic.noOfInstances());

}

h = m = s = 0; count++;

} }

public ClockStatic(int g, int p, int gi) {

h = g; m = p; s = gi; count++;

}

static public void noOfInstances() {

System.out.println("# of instances: " +

count);

}

public void display() {

System.out.println(h + ":" + m + ":" + s);

CT176 – Lập trình Hướng đối tượng

125

TS. Trần Công Án

}}

 Thêm về lớp và đối tượng

Biến tham chiếu this

• Đây là một biến tham chiếu đặc biệt, tồn tại trong tất cả

các phương thức không tĩnh của lớp

• Biến này tham chiếu đến đối tượng đang gọi phương

thức

st2:Student

Student

st1:Student

- ID - name

- int ID - String name

- ID - name

+ . . . + setInfo(int i, String n) {

?

? st1.setInfo(1, "NVA");

ID = i; name = n;

}

CT176 – Lập trình Hướng đối tượng 126

TS. Trần Công Án

 Thêm về lớp và đối tượng

Biến tham chiếu this

• Trong tất cả các phương thức không tĩnh, tất cả các

lệnh truy xuất vào các dữ liệu thành viên không tĩnh sẽ được tự động thêm vào tham chiếu this:

st2:Student

st1:Student

1 NVA

- ID - name

- ID - name

Student

- int ID - String name

sv1.setInfo(1, "NVA");

+ . . . + setInfo(int i, String n) {

+ setInfo(int i, String n) {

ID = i; name = n;

this.ID = i; this.name = n;

}

}

sv1.ID = i; sv1.name = n;

CT176 – Lập trình Hướng đối tượng 127

TS. Trần Công Án

this = sv1

 Thêm về lớp và đối tượng

Biến tham chiếu this

• Biến tham chiếu this có thể được sử dụng một cách

tường minh để tránh trùng tên

public void setInfo(int ID, String name) {

class Student { this.ID = ID; this.name = name;

}

private int ID; private String name;

//...

public void setInfo(int ID, String name) {

ID = ID; name = name;

Hai tham số của phương thức sẽ che đi các dữ liệu thành viên

}

CT176 – Lập trình Hướng đối tượng 128

TS. Trần Công Án

}

 Mảng (array)

Mảng (array)

CT176 – Lập trình Hướng đối tượng

129

TS. Trần Công Án

 Mảng (array)

Mảng (array)

• Là một dãy các phần tử (giá trị) có cùng kiểu dữ liệu • Là một biến kiểu tham chiếu:

 Khai báo: [];  Tạo mảng: = new [];

gpa

0

1

2

3

4

double gpa[]; gpa = new double[5];

• Có thể vừa khai báo vừa khởi tạo int []number = {2, 4, 6, 8}; String []monthName = {"Jan", "Feb", "March",…};

CT176 – Lập trình Hướng đối tượng 130

TS. Trần Công Án

 Mảng (array)

Mảng (array)

• Các phần tử của mảng được truy xuất thông qua chỉ số • Chỉ số của mảng bắt đầu từ 0

public class Fibonaci {

public static void main(String args[]) {

int fibo[] = new int [10];

fibo[0] = fibo[1] = 1;

for (int i=2; i< 10; i++)

fibo[i] = fibo[i-1] + fibo[i-2];

for (int i=0; i< 10; i++)

System.out.print(fibo[i] + " ");

}

}

CT176 – Lập trình Hướng đối tượng 131

TS. Trần Công Án

 Mảng (array)

Mảng (array)

p

• Mảng các đối tượng:

Person []prs;

p

prs = new Person[5];

0

1

2

3

4

  

prs[0] = new Person(); //...

p

prs[0].setName("Tommy"); prs[0].setName("Tommy"); prs[0].setAge(20); prs[0].setAge(20);

0

1

2

3

4

for (Person t : prs) {

System.out.println(t.getName());

Person

CT176 – Lập trình Hướng đối tượng 132

TS. Trần Công Án

}

 Xử lý ngoại lệ

Xử lý ngoại lệ

CT176 – Lập trình Hướng đối tượng

133

TS. Trần Công Án

 Xử lý ngoại lệ

Xử lý ngoại lệ (exception handling)

• Ngoại lệ: là một lỗi xảy ra khi thực thi chương trình:

 Ví dụ: chia cho 0, mở tập tin không tồn tại,…

• Khi một lỗi xảy ra, một đối tượng ngoại lệ sẽ sinh ra và

chương trình phải “bắt” và xử lý ngoại lệ

• Bắt ngoại lệ: dùng câu lệnh try…catch…finally • Xử lý ngoại lệ:

 Truyền tiếp ngoại lệ: “quẳng” ngoại lệ cho nơi khác trong

chương trình xử lý

 Khắc phục lỗi để chương trình có thể tiếp tục

CT176 – Lập trình Hướng đối tượng 134

TS. Trần Công Án

 Xử lý ngoại lệ

Xử lý ngoại lệ (exception handling)

• Bắt ngoại lệ:

• Lưu ý:

 Khối lệnh finally là không

bắt buộc

try {

 Các loại ngoại lệ trong

//các câu lệnh có khả năng //sinh ra lỗi

} catch () {

Java được tổ chức theo dạng cây phân cấp với gốc cây phân cấp là Exception

//xử lý ngoại lệ 1

//xử lý ngoại lệ n

} ... catch () {

} finally {

//các lệnh sẽ được thực hiện //cả trong trường hợp có và //không có ngoại lệ xảy ra

CT176 – Lập trình Hướng đối tượng

135

TS. Trần Công Án

}

 Xử lý ngoại lệ

Xử lý ngoại lệ (exception handling)

CT176 – Lập trình Hướng đối tượng

136

TS. Trần Công Án

 Xử lý ngoại lệ

Xử lý ngoại lệ (exception handling)

import java.util.Scanner; import java.util.InputMismatchException;

class ExceptionHandling {

public static void main(String args[]) {

System.out.print("Nhap a: "); a = s.nextInt(); s.nextLine();

int a, b, x; Scanner s = new Scanner(System.in);

System.out.print("Nhap b: "); b = s.nextInt(); s.nextLine();

//. . .

}

CT176 – Lập trình Hướng đối tượng

137

TS. Trần Công Án

}

 Xử lý ngoại lệ

Xử lý ngoại lệ (exception handling)

import java.util.Scanner; import java.util.InputMismatchException; class ExceptionHandling {

public static void main(String args[]) {

int a, b, x; Scanner s = new Scanner(System.in); while (true) {

try {

System.out.print("Nhap a: "); a = s.nextInt();

} catch (InputMismatchException e) {

System.out.println("Khong hop le, moi ban nhap lai"); continue;

} finally {

s.nextLine();

} break; } //while

//tiếp tục nhập b, ...

} //main

}

CT176 – Lập trình Hướng đối tượng

138

TS. Trần Công Án

 Xử lý ngoại lệ

Truyền tiếp ngoại lệ

• Nếu không muốn xử lý một ngoại lệ sinh ra do một câu

lệnh nào đó trong một phương thức A:

 Phương thức A có thể “truyền tiếp” ngoại lệ cho các phương

thức nào sẽ gọi phương thức A xử lý

 Cú pháp: thêm lệnh

throws

vào sau khai báo phương thức, trước dấu ngoặc nhọn {

public void writeFile(String fname,...) throws IOException {

}

CT176 – Lập trình Hướng đối tượng 139

TS. Trần Công Án

//lệnh đọc/ghi file (có thể sinh ra IOException)

Question?

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

Tổng kết

CT176 – Lập trình Hướng đối tượng

141

TS. Trần Công Án

 Tổng kết

Tổng kết

Interactive map: https://goo.gl/BrfGz5

CT176 – Lập trình Hướng đối tượng 142

TS. Trần Công Án

 Tổng kết

Tổng kết

CT176 – Lập trình Hướng đối tượng 143

TS. Trần Công Án

 Tổng kết

Tổng kết

CT176 – Lập trình Hướng đối tượng 144

TS. Trần Công Án

 Tổng kết

Tổng kết

CT176 – Lập trình Hướng đối tượng 145

TS. Trần Công Án

 Tổng kết

Tổng kết

CT176 – Lập trình Hướng đối tượng 146

TS. Trần Công Án

Quiz

CT176 – Lập trình Hướng đối tượng

147

TS. Trần Công Án

 Quiz

Quiz

1. Chương trình nào sau đây là trình biên dịch Java?

a)

b)

c)

command prompt java javac netbean

2. Cú pháp khai hàm main() nào sau đây là đúng?

d)

a)

b)

c)

d)

public void main(String args) public void main(String []args) public void main(String args[]) public static void main(String args[]) Tất cả đều đúng

CT176 – Lập trình Hướng đối tượng 148

TS. Trần Công Án

e)

 Quiz

Quiz

3. Để dịch chương trình Java sang mã bytecode, ta dùng lệnh:

a)

b)

c)

java javac compile run

4. Chương trình nào sau đây chứa các

d)

a)

b)

c)

d)

do … while for while if … else switch … case

CT176 – Lập trình Hướng đối tượng 149

TS. Trần Công Án

e)

 Quiz

Quiz

5. Chương trình nào sau đây là máy ảo Java?

a)

b)

c)

e)

Command Prompt java javac NetBean Tất cả đều đúng

6. Câu lệnh khai báo mảng nào sau đây là đúng?

d)

CT176 – Lập trình Hướng đối tượng 150

TS. Trần Công Án

a) int []myList = {"1", "2", "3"}; b) int []myList = (5, 8, 2); c) int myList[][] = {4,9,7,0}; d) int myList[] = {4, 3, 7};

 Quiz

Quiz

7. Khai báo biến nào sau đây là đúng?

a)

b)

c)

e)

d)

float f1 = -343; float f2 = 3.14; float f3 = 0x12345; float f4 = 42e7; float f5 = 2001.0D; float f6 = 2.81F;

8. Câu lệnh khai báo mảng nào sau đây là đúng (chọn 3 câu)?

a) int []myScores[]; b) char []myChars; c) int [6]myScores; d) Dog myDogs[]; e) Dog myDogs[7];

CT176 – Lập trình Hướng đối tượng 151

TS. Trần Công Án

f)

 Quiz

Quiz

9. Khai báo biến nào sau đây là đúng?

a)

b)

c)

e)

d)

float f1 = -343; float f2 = 3.14; float f3 = 0x12345; float f4 = 42e7; float f5 = 2001.0D; float f6 = 2.81F;

CT176 – Lập trình Hướng đối tượng 152

TS. Trần Công Án

f)

 Quiz

Quiz

9. Cho đoạn chương trình sau:

switch(x) {

default:

System.out.println("Hello");

Các kiểu dữ liệu nào là hợp lệ với x? a)

b)

c)

d)

e)

byte long char float Tất cả đều đúng

CT176 – Lập trình Hướng đối tượng 153

TS. Trần Công Án

}

 Quiz

Quiz

10. Cho đoạn chương trình sau, chọn câu phát biểu đúng:

public void foo( boolean a, boolean b) {

if (a) {

System.out.println("A"); /* Line 3 */

} else if(a && b) {

/* Line 5 */

System.out.println( "A && B");

} else { /* Line 8 */

if (!b)

{

System.out.println( "notB") ;

của chương trình là “notB”

a) Nếu a = true và b = true, kết xuất của chương trình là “A && B” b) Nếu a = true và b = false, kết xuất

} else {

System.out.println( "ELSE" ) ;

}

của chương trình là “ELSE”

}

c) Nếu a = false và b = true, kết xuất

}

của chương trình là “ELSE”

CT176 – Lập trình Hướng đối tượng 154

TS. Trần Công Án

d) Nếu a = false và b = false, kết xuất

 Quiz

Quiz

11. Cho đoạn chương trình sau, chọn câu phát biểu đúng:

public void test(int x) {

int odd = 1; if(odd) { /* Line 3 */

System.out.println("odd");

} else {

System.out.println("even");

}

CT176 – Lập trình Hướng đối tượng 155

TS. Trần Công Án

} a) Lỗi biên dịch b) Chương trình hiển thị “odd” c) Chương trình hiển thị “even” d) Nếu x chẵn thì hiển thị “even”, nếu x lẻ hiển thị “odd”

 Quiz

Quiz

12. Một phương thức của lớp có thể truy cập những thành phần

nào của lớp đó? a)

b)

d)

public private Protected default

13. Cho một lớp tên Test, khai báo hàm xây dựng nào sau đây của

lớp Test là đúng? a)

c)

b)

d)

Test() public Test() Test(void) public Test(void)

CT176 – Lập trình Hướng đối tượng 156

TS. Trần Công Án

c)

Phụ lục

CT176 – Lập trình Hướng đối tượng

157

TS. Trần Công Án

 Phụ lục

Lớp String

• Trữ các chuỗi và cung cấp các thao tác trên chuỗi

String s = "Hello"; String s = new String("Hello");

• Không thể thay đổi giá trị của chuỗi (immutable)  Các phương thức của lớp này thường trả về 1 chuỗi

s = s.concat("World"); s = s.replace("W", " W");

CT176 – Lập trình Hướng đối tượng 158

TS. Trần Công Án

 Phụ lục

Lớp String

• char charAt(int index)

• int length()

• String substring(int beginIndex)

• String substring(int beginIndex, int endIndex)

• boolean equals(Object another)

• boolean contains(CharSequence s)

• boolean isEmpty()

• String concat(String str)

• String trim()

• String replace(String oldStr, String newStr)

• int indexOf(String substring)

• String toLowerCase()

• int indexOf(String substring, int fromIndex)

CT176 – Lập trình Hướng đối tượng 159

TS. Trần Công Án

• String toUpperCase()

 Phụ lục

Lớp Math

• Cung cấp các hàm toán học • Hầu hết các phương thức là tĩnh (static, gọi từ lớp) • Một số hàm thông dụng như:

• Một số hàm khác: sin, cos, asin, acos, exp,

floor, ceil, pow, min, max

CT176 – Lập trình Hướng đối tượng 160

TS. Trần Công Án

 double/float/int/long abs(double/float/int/long);  double log/log10(double);  long/int round(double/float);  double sqrt(double);  double random();