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