Bài giảng Công nghệ Java - Chương 4: Lớp, mảng và các lớp thường dùng - Trần Quang Diệu

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:

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

ClockTime d = new ClockTime(23, 50);

Declaration

Instantiation

Initialization

• Cú pháp

– 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.

pdf 68 trang kimcuc 2300
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Công nghệ Java - Chương 4: Lớp, mảng và các lớp thường dùng - Trần Quang Diệu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Công nghệ Java - Chương 4: Lớp, mảng và các lớp thường dùng - Trần Quang Diệu

Bài giảng Công nghệ Java - Chương 4: Lớp, mảng và các lớp thường dùng - Trần Quang Diệu
CÔNG NGHỆ JAVA
CH4. LỚP, MẢNG VÀ CÁC LỚP THƯỜNG DÙNG
Quang Dieu Tran PhD
4/7/2018 1
Nội dung
• Xây dựng Lớp
• Xử lý chuỗi
• Các lớp toán học
• Mảng
4/7/2018 2
4/7/2018 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)
4/7/2018 3
Định nghĩa đầy đủ của 1 lớp
4/7/2018 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:
Route route = new Route("New York", "Boston");
ClockTime d = new ClockTime(23, 50);
Declaration
Instantiation
Initialization
4/7/2018 5
Khai báo
• Cú pháp 
– 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.
Type name;
4/7/2018 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
4/7/2018 7
Khởi tạo đối tượng
4/7/2018 8
Khởi tạo đối tượng
4/7/2018 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
• Ví dụ: System.out.println("Chieu cao cua rectOne: "+ rectOne.height);
– Triệu gọi các phương thức
• Ví dụ: System.out.println(“Dien tich cua rectOne: " + rectOne.area());
objectReference.variableName;
objectReference.methodName(argumentList); 
4/7/2018 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.
4/7/2018 11
Truyền tham đối 
Kết quả???
4/7/2018 12
Kết quả
Before modify() d.height = 10
dim = 11
After modify() d.height = 11
4/7/2018 13
Truyền tham đối
Kết 
quả???
4/7/2018 14
Kết quả
Before modify():Nguyen Van A
After modify():Tran Thi B
4/7/2018 15
Truyền tham đối
Kết 
quả???
4/7/2018 16
Kết quả
Before swap a: 1 , b: 2
After swap a: 1 , b: 2
4/7/2018 17
Truyền tham đối
Kết 
quả???
4/7/2018 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.
4/7/2018 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
4/7/2018 20
Ví dụ
4/7/2018 21
Kết quả
Total JVM memory: 5177344
Before Memory = 4974672
After Memory = 4728504
After GC Memory = 5045864
4/7/2018 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.
4/7/2018 23
Chuỗi trong Java
4/7/2018 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
4/7/2018 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ự.
4/7/2018 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);
4/7/2018 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.
4/7/2018 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);
4/7/2018 29
String
• Ví dụ:
– String s = new String();
– 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, 
Chiều dài =0
4/7/2018 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()
4/7/2018 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
4/7/2018 32
Lệnh dựng chuỗi StringBuffer
• public StringBuffer();
• public StringBuffer(int capacity);
• public StringBuffer(String str);
• public StringBuffer(CharSequence seq);
4/7/2018 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()
4/7/2018 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
4/7/2018 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 Description
boolean isLetter(char ch) 
boolean isDigit(char ch) 
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. 
4/7/2018 36
Ví dụ
4/7/2018 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ố.
int digit = 12;
char c = Character.forDigit(digit, 16);
System.out.println(digit + " = " + c);
char c = 'F';
int digit = Character.digit(c, 16);
System.out.println(c + " = "+ digit);
4/7/2018 38
Các lớp số Java
4/7/2018 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. 
4/7/2018 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.
4/7/2018 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)
4/7/2018 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()
4/7/2018 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)
4/7/2018 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
4/7/2018 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
4/7/2018 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
4/7/2018 48
Tạo mảng
• Khai báo mảng
• Khởi tạo mảng
• Khởi tạo giá trị mảng
type[] array_name;
int[] anArray = new int[10];
int[] anArray; 
float[] anArrayOfFloats;
boolean[] anArrayOfBooleans;
Object[] anArrayOfObjects;
String[] anArrayOfStrings;
new elementType[arraySize]
boolean[] answers = { true, false, true};
4/7/2018 49
Ví dụ
String names[] = new String[3];
names[0] = "Leonardo";
names[1] = "da";
names[2] = "Vinci";
String names[] = {"Leonardo", "da", "Vinci"};
Giống nhau
String names[] = new String []{"Leonardo", "da", "Vinci"};
Giống nhau
4/7/2018 50
Mảng các dữ liệu nguyên thủy
4/7/2018 51
Mảng đối tượng
4/7/2018 52
Thao tác trên mảng
• Truy xuất đến các phần tử
• Xác định chiều dài
for (int i = 0; i < anArray.length; i++) {
anArray[i] = i;
System.out.print(anArray[i] + " ");
}
arrayname.length
4/7/2018 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.
4/7/2018 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;
4/7/2018 55
Mảng nhiều chiều
4/7/2018 56
Ví dụ
4/7/2018 57
Ví dụ
4/7/2018 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()
4/7/2018 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
4/7/2018 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
4/7/2018 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
4/7/2018 62
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.
public static void arraycopy(Object source,int srcIndex, Object dest,int destIndex, int length)
4/7/2018 63
Ví dụ
4/7/2018 64
Bài tập
• Lỗi gì?
4/7/2018 65
Mảng rải rác tam giác (Triangular Sparse Array)
4/7/2018 66
Mảng rải rác tam giác (Triangular Sparse Array)
4/7/2018 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
4/7/2018 68

File đính kèm:

  • pdfbai_giang_cong_nghe_java_chuong_4_lop_mang_va_cac_lop_thuong.pdf