CÔNG NGHỆ JAVA

CH4. LỚP, MẢNG VÀ CÁC LỚP THƯỜNG DÙNG

Quang Dieu Tran PhD

03/06/18 03/06/18 1 1

Nội dung

• Xây dựng Lớp • Xử lý chuỗi • Các lớp toán học • Mảng

03/06/18 03/06/18 2 2

Xây dựng lớp

• Khi định nghĩa lớp ta cần định nghĩa:

– Các thuộc tính (biến) – Các hành vi (hàm)

03/06/18 03/06/18 3 3

Định nghĩa đầy đủ của 1 lớp

03/06/18 03/06/18 4 4

Xây dựng lớp

• Hàm dựng (constructor)

– Có cùng tên với lớp mà nó thuộc về – Định nghĩa cú pháp để tạo ra 1 đối tượng

thuộc lớp đó

– Khởi gán các giá trị ban đầu (nếu có)

• Khởi tạo đối tượng: Declaration

Route route = new Route("New York", "Boston");

ClockTime d = new ClockTime(23, 50);

Initialization

Instantiation

03/06/18 03/06/18 5 5

Khai báo

• Cú pháp

Type name;

– Khai báo 1 biến tên name dùng để tham chiếu

tới dữ liệu có kiểu là type

– Type có thể có hai dạng:

• Primitive types • Reference types

– Với kiểu khai báo này giá trị của name hoặc là

giá trị mặc định do Java khởi gán, hoặc là null.

03/06/18 03/06/18 6 6

Ví dụ

• MyClass myObj = new MyClass(); or

MyClass myObj;

• MyParent myObj = new MyClass(); or

MyParent myObj;

• MyInterface myObj = new MyClass(); or

MyInterface myObj;

• Note: MyParent và MyInterface phải là

super class của MyClass

03/06/18 03/06/18 7 7

Khởi tạo đối tượng

03/06/18 03/06/18 8 8

Khởi tạo đối tượng

03/06/18 03/06/18 9 9

Sử dụng đối tượng

• Bạn có thể sử dụng một đối tượng theo 2

cách: – Tham chiếu tới các thuộc tính objectReference.variableName;

System.out.println("Chieu cao cua rectOne: "+

• Ví dụ:

rectOne.height);

– Triệu gọi các phương thức

objectReference.methodName(argumentList);

• Ví dụ: System.out.println(“Dien tich cua rectOne: " + rectOne.area());

03/06/18 03/06/18 10 10

Truyền tham đối

• Java cung cấp 2 cách để truyền tham đối: – Truyền tham trị: (primitive data) chỉ có ý nghĩa và thay đổi trong phương thức. Khi phương thức kết thúc giá trị trở lại giá trị ban đầu – Truyền tham chiếu: (object) thay đổi bên trong

phương thức sẽ ảnh hưởng tới đối tượng dùng làm tham đối.

03/06/18 03/06/18 11 11

Truyền tham đối

Kết quả???

03/06/18 03/06/18 12 12

Kết quả

Before modify() d.height = 10 dim = 11 After modify() d.height = 11

03/06/18 03/06/18 13 13

Truyền tham đối

Kết quả???

03/06/18 03/06/18 14 14

Kết quả

Before modify():Nguyen Van A After modify():Tran Thi B

03/06/18 03/06/18 15 15

Truyền tham đối

Kết quả???

03/06/18 03/06/18 16 16

Kết quả

Before swap a: 1 , b: 2 After swap a: 1 , b: 2

03/06/18 03/06/18 17 17

Truyền tham đối

Kết quả???

03/06/18 03/06/18 18 18

Dọn rác

• Java cung cấp cơ chế gom rác tự động Garbage collection mà người lập trình không cần phải quan tâm xử lý rác.

• Đối tượng khi không còn tham chiếu nào

tới nó nữa  gom rác.

03/06/18 03/06/18 19 19

Dọn rác: nulling a reference

• Cách đầu tiên để dọn rác là set tham

chiếu của đối tượng thành null

Garbage collection sẽ làm việc sau câu lệnh này

03/06/18 03/06/18 20 20

Ví dụ

03/06/18 03/06/18 21 21

Kết quả

Total JVM memory: 5177344 Before Memory = 4974672 After Memory = 4728504 After GC Memory = 5045864

03/06/18 03/06/18 22 22

Xử lý trước khi gom rác

• finally() methods:

– Giải phóng tài nguyên cấp phát trước khi gom

rác đối tượng.

– Không nên overridden lại phương thức này vì bạn không biết chắc chắn lúc nào hàm hủy sẽ được gọi.

03/06/18 03/06/18 23 23

Chuỗi trong Java

03/06/18 24

Khai báo và sử dụng chuỗi

• Java hỗ trợ Unicode  mỗi kí tự dài 16 bit • Ví dụ hằng chuỗi

– System.out.println(“Hello world”);

• Ghép chuỗi:

– Dùng các toán tử + và += để ghép chuỗi. – Ví dụ: double distance = 45.5;

System.out.println("Distance = "+ distance +" miles.");

Distance = 45.5 miles.

Chuỗi

03/06/18 03/06/18 25 25

Chuỗi với vai trò là đối tượng

• Trong Java chuỗi có ba thể hiện

– String: bất biến – StringBuffer: khả biến, multi-thread – StringBuilder: khả biến, single-thread

• Đều là các đối tượng chứ không phải là

các mảng kí tự.

03/06/18 03/06/18 26 26

Khai báo và sử dụng kí tự

• char có độ dài 2 bytes và chứa các số

nguyên không dấu.

• Hằng kí tự được biểu diễn trong dấu nháy

đơn (’)

• Bạn cũng có thể nhập các kí tự đơn bằng dãy escape sequence \uxxx chỉ định thứ tự theo thập lục phân.

char c = '\u0a76'; System.out.println("Char = "+ c);

03/06/18 03/06/18 27 27

Lớp String

• Áp dụng cho các chuỗi có độ dài cố định,

không đổi trong quá trình chạy. • Đối tượng String không đổi được.

03/06/18 03/06/18 28 28

Lệnh dựng chuỗi String

• public String() ; • public String(String original); • public String(char value[]); • public String(char value[], int offset, int count); • public String(int[] codePoints, int offset, int count); • public String(byte bytes[], int offset, int length, String charsetName); • public String(byte bytes[], int offset, int length, Charset charset); (1.6) • public String(byte bytes[], String charsetName); • public String(byte bytes[], Charset charset); (1.6) • public String(byte bytes[], int offset, int length); • public String(byte bytes[]) • public String(StringBuffer buffer); • public String(StringBuilder builder); • public String(byte ascii[], int hibyte, int offset, int count); • public String(byte ascii[], int hibyte);

03/06/18 03/06/18 29 29

String

• Ví dụ:

– String s = new String();

Chiều dài =0

– Chú ý:

• Kí tự trong Java là kí tự 16bit, không phải ASCII 8

bit

• Các encoding (charset): các chế độ mã hóa kí tự

nền được sử dụng trong hệ thống để chuyển đổi kí tự ASCII thành Unicode.

– VD: UTF-8, UTF-16, US-ASCII, ISO-8859-1, …

03/06/18 03/06/18 30 30

Các phương thức chuỗi String

• Demo:

– Phương thức kiểm tra lớp String

• length(), charAt(), getChars(..), getBytes(…), hashCode()

– Phương thức so sánh lớp String

• equals(…), equalsIgnoreCase(…), compareTo(…), compareToIgnoreCase (…), regionMatches(…), startsWith(…), endWith(…) – Phương thức lập chỉ mục lớp String • indexOf(…), lastIndexOf(…) – Phương thức chuyển đổi lớp String

• substring(…), concat(…), replace(…), toLowerCase(…),

toUpperCase(…), trim(), toCharArray(…), intern()

03/06/18 03/06/18 31 31

Lớp StringBuffer

• Áp dụng cho chuỗi có độ dài khả biến, có

thể thay đổi trong quá trình chạy.

• Đối tượng StringBuffer có thể thay đổi

được

• Áp dụng cho đa tiến trình

03/06/18 03/06/18 32 32

Lệnh dựng chuỗi StringBuffer

• public StringBuffer(); • public StringBuffer(int capacity); • public StringBuffer(String str); • public StringBuffer(CharSequence seq);

03/06/18 03/06/18 33 33

Các phương thức chuỗi

• Demo

– Tính dung lượng và chiều dài lớp StringBuffer:

• length(), capacity(), ensureCapacity(…), setLength(…)

– Phương thức char của StringBuffer

• charAt(…), getChars(…), setCharAt(…)

– Nối thêm lớp StringBuffer

• append(…) – Xóa, thay thế

• delete(…), replace(…)

– Chuỗi con

• substring(…)

– Chèn lớp

• insert(…)

– Khác

• reverse(), toString(), readObject(…)

03/06/18 03/06/18 34 34

StringBuilder

• Áp dụng cho các chuỗi khả biến có thể

thay đổi trong quá trình chạy.

• Đối tượng StringBuilder có thể thay đổi

được

• Xử lý nhanh, thay thế cho StringBuffer trong trường hợp chỉ có 1 tiến trình. • Các phương thức tương tự như của

StringBuffer

03/06/18 03/06/18 35 35

Lớp Character

• Là lớp bao của char, nó cung cấp các phương

thức tĩnh (static) hữu ích.

Method

boolean isLetter(char ch)  boolean isDigit(char ch)

Description Determines whether the specified char  value is a letter or a digit, respectively.

boolean isWhiteSpace(char ch)

Determines whether the specified char  value is white space according to the  Java platform.

boolean isUpperCase(char ch)  boolean isLowerCase(char ch)

Determines whether the specified char  value is upper­ or lowercase,  respectively.

char toUpperCase(char ch)  char toLowerCase(char ch)

Returns the upper­ or lowercase form of  the specified char value.

toString(char ch)

Returns a String object representing the  specified character value.

03/06/18 03/06/18 36 36

Ví dụ

03/06/18 03/06/18 37 37

Các kí số Character

• Character rất hữu ích khi: chuyển đổi kí tự

thành số nguyên trong 1 cơ số.

char c = 'F'; int digit = Character.digit(c, 16); System.out.println(c + " = "+ digit);

int digit = 12; char c = Character.forDigit(digit, 16); System.out.println(digit + " = " + c);

03/06/18 03/06/18 38 38

Các lớp số Java

03/06/18 39

Lớp Math

• Lớp Math cung cấp các phương thức hữu ích để thực hiện nhiều thao tác toán học khác nhau.

• Lớp Math tự động nhập vào trình ứng

dụng mà không cần import.

03/06/18 03/06/18 40 40

ủ ớ

Constructor c a l p Math

• private Math(){} : Không thể tạo ra 1 đối

tượng thuộc lớp này

• Các hằng và phương thức đều là static  được dùng trong tham chiếu bản thân lớp mà không cần khởi tạo đối tượng.

03/06/18 03/06/18 41 41

Math field

• Math có 2 trường tĩnh:

– E: cơ số của logarit tự nhiên (2.71828) – PI: giá trị đại diện cho π (3.14159)

03/06/18 03/06/18 42 42

Các phương thức tiện ích của Math

• Demo

– abs(); – min(), max() – rint(), round(), ceil(), floor() – power(), IEEremainder() – sqrt() – sin(), cos(), tan()… – random()

03/06/18 03/06/18 43 43

Lớp Random

• Constructor

– Random r = new Random(); – Random r = new Random(12); • Các phương thức lớp Random

– setSeed() – nextXXX() – nextXXX(max)

03/06/18 03/06/18 44 44

Các lớp bao bọc số

• Lớp bao bọc Boolean • Lớp bao bọc Integer • Lớp bao bọc Long • Lớp bao bọc Byte • Lớp bao bọc Short • Lớp bao bọc Float • Lớp bao bọc Double

03/06/18 03/06/18 45 45

Mảng

Định nghĩa

• Mảng là một cấu trúc giữ không hoặc

nhiều giá trị cùng kiểu dữ liệu.

• Chiều dài của mảng phải được xác định khi khởi tạo mảng và không thay đổi  mảng là 1 cấu trúc fix-length

03/06/18 47

Đặc điểm mảng

• Các phần tử trong mảng có thể là:

– primitive datatype – reference datatype

• Lưu trữ và truy xuất các phần tử theo chỉ mục. • Là lớp con của Object và hiện thực 2 interfaces

Serializable và Cloneable. • Một số đặc tính của mảng:

– random access – linear lookup

03/06/18 48

Tạo mảng

• Khai báo mảng

type[] array_name; int[] anArray = new int[10]; int[] anArray; float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings; …

• Khởi tạo mảng

new elementType[arraySize]

• Khởi tạo giá trị mảng

boolean[] answers = { true, false, true};

03/06/18 49

Ví dụ

String names[] = new String[3]; names[0] = "Leonardo"; names[1] = "da"; names[2] = "Vinci";

Giống nhau

String names[] = {"Leonardo", "da", "Vinci"};

Giống nhau

String names[] = new String []{"Leonardo", "da", "Vinci"};

03/06/18 50

Mảng các dữ liệu nguyên thủy

03/06/18 51

Mảng đối tượng

03/06/18 52

Thao tác trên mảng

• Truy xuất đến các phần tử

for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); }

• Xác định chiều dài arrayname.length

03/06/18 53

Ghi chú

• Mảng rỗng thì chiều dài của nó bằng 0, lúc

này không truy xuất được các phần tử mảng.

• Sau khi khởi tạo, biến mảng sẽ tham chiếu

tới phần tử đầu tiên trong mảng.

03/06/18 54

Mảng nhiều chiều

• Khi mỗi phần tử trong mảng tham chiếu tới một mảng khác  bạn cần tới mảng đa chiều.

• Chỉ cần thêm 1 cặp [] khi muốn có thêm 1

chiều

int coordinates[][]; coordinates[0][0] = 2;

03/06/18 55

Mảng nhiều chiều

03/06/18 56

Ví dụ

03/06/18 57

Ví dụ

03/06/18 58

Sao chép dữ liệu trên mảng

• Java hỗ trợ 3 cách sao chép dữ liệu mảng

– Toán tử gán – clone() – System.arraycopy()

03/06/18 59

Sao chép dữ liệu trên mảng

• Toán tử gán:

Nhận xét: cả hai mảng cùng tham chiếu tới 1 đối tượng mảng khi thay đổi thì cả 2 cùng thay đổi Copy tham chiếu

03/06/18 60

Sao chép dữ liệu trên mảng

• Hàm System.arraycopy():

Nhận xét: hai biến mảng tham chiếu tới 2 đối tượng mảng khác nhau Khi thay đổi trên 1 mảng sẽ không ảnh hưởng tới mảng kia Copy nội dung

03/06/18 61

Sao chép dữ liệu trên mảng

• Hàm clone()

Nhận xét: hai biến mảng tham chiếu tới 2 đối tượng mảng khác nhau Khi thay đổi trên 1 mảng sẽ không ảnh hưởng tới mảng kia Copy nội dung

03/06/18 62

public static void arraycopy(Object source,int srcIndex, Object dest,int destIndex, int length)

Sao chép dữ liệu trong mảng • Hàm System.arraycopy(…) dùng để copy để copy dữ liệu từ mảng này sang mảng khác.

03/06/18 63

Ví dụ

03/06/18 64

Bài tập

• Lỗi gì?

03/06/18 65

Mảng rải rác tam giác (Triangular Sparse Array)

03/06/18 66

Mảng rải rác tam giác (Triangular Sparse Array)

03/06/18 67

Các biệt lệ trên mảng

• Khi thao tác trên mảng có thể gặp 1 số

biệt lệ sau: – NegativeArraySizeException – IndexOutOfBoundsException – ArrayIndexOutOfBoundsException – ArrayStoreException

03/06/18 68