Bài giảng Lập trình hướng đối tượng - Bài 4: Các kỹ thuật xây dựng lớp và sử dụng đối tượng

9/18/17  
Mục tiêu bài học  
n Nêu được bản chất, vai trò và biết sử dụng kỹ  
thuật chồng phương thức, chồng phương thức  
khởi tạo  
Bộ môn Công nghệ Phần mềm  
Viện CNTT & TT  
Trường Đại học Bách Khoa Hà Nội  
n Thành viên đối tượng, thành viên lớp  
n Hiểu về cách thức quản lý bộ nhớ và đối tượng  
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG  
Bài 04. Các kỹ thuật xây dựng lớp  
và sử dụng đối tượng  
trong Java  
n Nắm về cách thức truyền tham số phương thức  
n Biết cách sử dụng package, một số lớp tiện ích  
trong Java: Wrapper class, Math, System, String  
vs. StringBuffer  
2
Nội dung  
Nội dung  
1. Chồng phương thức  
1. Chồng phương thức  
2. Thành viên ĐT và thành viên lớp  
3. Quản lý bộ nhớ trong Java  
4. Truyền tham số cho phương thức  
5. Một số lớp tiện ích trong Java  
2. Thành viên ĐT và thành viên lớp  
3. Quản lý bộ nhớ trong Java  
4. Truyền tham số cho phương thức  
5. Một số lớp tiện ích trong Java  
3
4
1
9/18/17  
Nhắc lại về phương thức  
1.1. Chồng phương thức  
n Chồng phương thức (Method Overloading): Các  
phương thức trong cùng một lớp có thể trùng  
tên nhưng chữ ký phải khác nhau:  
n Mỗi phương thức phải có một chữ ký riêng  
n Chữ ký của phương thức bao gồm:  
n
Tên phương thức  
n
Số lượng tham số khác nhau  
n
Số lượng các đối số và kiểu của chúng  
n
Nếu cùng số lượng tham số thì kiểu dữ liệu các tham  
số phải khác nhau  
n Mục đích:  
n
Tên trùng nhau để mô tả bản chất công việc  
n
Thuận tiện cho lập trình vì không cần phải nhớ quá  
nhiều tên phương thức mà chỉ cần nhớ một tên và  
lựa chọn các tham số cho phù hợp.  
5
6
1.1. Chồng phương thức (2)  
1.1. Chồng phương thức (3)  
n Ví dụ 1:  
n Ví dụ 2:  
class MyDate {  
n
Phương thức println() trong System.out.println()  
int year, month, day;  
có 10 khai báo với các tham số khác nhau:  
boolean, char[], char, double, float, int, long,  
Object, String, và một không có tham số.  
public boolean setMonth(int m) { …}  
public boolean setMonth(String s) { …}  
}
n
Không cần sử dụng các tên khác nhau (chẳng  
hạn "printString“ hoặc "printDouble“) cho mỗi  
kiểu dữ liệu muốn hiển thị.  
public class Test{  
public static void main(String args[]){  
MyDate d = new MyDate();  
d.setMonth(9);  
d.setMonth(”September”);  
}
}
7
8
2
9/18/17  
Thảo luận  
Một số chú ý với chồng phương thức  
n Cho phương thức sau đây:  
n Các phương thức chỉ được xem xét là chồng  
public double test(String a, int b)  
khi chúng thuộc cùng một lớp  
n Hãy chọn ra các phương thức chồng cho phương thức trên:  
1. void test(String b, int a)  
n Chỉ nên sử dụng kỹ thuật này với các phương  
thức có cùng mục đích, chức năng; tránh lạm  
dụng  
2. public double test(String a)  
3. private int test(int b, String a)  
4. private int test(String a, int b)  
5. double test(double a, int b)  
6. double test(int b)  
n Khi dịch, trình dịch căn cứ vào số lượng hoặc  
kiểu dữ liệu của tham số để quyết định gọi  
phương thức nào phù hợp.  
7. public double test(String a, long b)  
à Nếu không chọn được hoặc chọn được  
nhiều hơn 1 phương thức thì sẽ báo lỗi.  
9
10  
Thảo luận  
Thảo luận  
void prt(String s) { System.out.println(s); }  
void f1(char x) { prt("f1(char)"); }  
void f1(byte x) { prt("f1(byte)"); }  
void f1(short x) { prt("f1(short)"); }  
void f1(int x) { prt("f1(int)"); }  
void prt(String s) { System.out.println(s); }  
void f2(short x) { prt("f3(short)"); }  
void f2(int x) { prt("f3(int)"); }  
void f2(long x) { prt("f5(long)"); }  
void f2(float x) { prt("f5(float)"); }  
void f1(long x) { prt("f1(long)"); }  
void f1(float x) { prt("f1(float)"); }  
void f1(double x) { prt("f1(double)"); }  
n Điều gì xảy ra nếu thực hiện:  
n
n
n
n
f2(5);  
char x=‘a’; f2(x);  
byte y=0; f2(y);  
float z = 0; f2(z);  
n Điều gì xảy ra nếu thực hiện:  
5 à int  
n
n
n
n
f1(5);  
char x=‘a’; f1(x);  
byte y=0; f1(y);  
float z = 0; f1(z);…  
Điều gì xảy ra nếu gọ5.5)?  
Error: cannot find symbol: method f2(double)  
11  
12  
3
9/18/17  
1.2. Chồng phương thức khởi tạo  
Ví dụ  
public class BankAccount{  
n Trong nhiều tình huống khác nhau cần khởi  
private String owner;  
private double balance;  
public BankAccount(){owner = “noname”;}  
tạo đối tượng theo nhiều cách khác nhau  
n à Cần xây dựng các phương thức khởi tạo  
khác nhau cho đối tượng theo nguyên lý  
chồng phương thức (constructor  
overloading).  
public BankAccount(String o, double b){  
owner = o; balance = b;  
}
}
public class Test{  
public static void main(String args[]){  
BankAccount acc1 = new BankAccount();  
BankAccount acc2 =  
new BankAccount(“Thuy”, 100);  
}
}
13  
14  
1.3. Từ khóa this  
Ví dụ  
public class Ship {  
n Nhắc lại: Tự tham chiếu đến đối tượng hiện tại, sử dụng bên  
private double x=0.0, y=0.0  
private double speed=1.0, direction=0.0;  
public String name;  
trong lớp tương ứng với đối tượng muốn tham chiếu.  
n Sử dụng thuộc tính hoặc phương thức của đối tượng thông  
qua toán tử “.”, ví dụ:  
public Ship(String name) {  
this.name = name;  
public class BankAccount{  
}
private String owner;  
public void setOwner(String owner){  
this.owner = owner;  
public Ship(String name, double x, double y) {  
this(name); this.x = x; this.y = y;  
}
public Ship(String name, double x, double y,  
double speed, double direction) {  
}
public BankAccount() { this.setOwner(“noname”); }  
this(name, x, y);  
this.speed = speed;  
this.direction = direction;  
}
…
}
n Gọi đến phương thức khởi tạo khác của lớp:  
15  
16  
n
this(danh_sach_tham_so); //neu co tham so  
//continue…  
4
9/18/17  
Nội dung  
//(cont.)  
private double degreeToRadian(double degrees) {  
return(degrees * Math.PI / 180.0);  
}
1. Chồng phương thức  
public void move() {  
move(1);  
2. Thành viên ĐT và thành viên  
lớp  
3. Quản lý bộ nhớ trong Java  
}
public void move(int steps) {  
double angle = degreesToRadians(direction);  
x = x + (double)steps*speed*Math.cos(angle);  
y = y + (double)steps*speed*Math.sin(angle);  
}
public void printLocation() {  
System.out.println(name + " is at ("  
+ x + "," + y + ").");  
4. Truyền tham số cho phương thức  
5. Một số lớp tiện ích trong Java  
}
} //end of Ship class  
17  
18  
2.1. Thành viên static  
Ví dụ lớp JOptionPane trong javax.swing  
n Trong Java  
n Thuộc tính  
n
Các thành viên bình thường là thành viên thuộc về đối  
tượng  
n
Thành viên thuộc về lớp được khai báo là static  
n Cú pháp khai báo thành viên static:  
chi_dinh_truy_cap static kieu_du_lieu tenBien;  
n Ví dụ:  
19  
20  
5
9/18/17  
Ví dụ - sử dụng thuộc tính và phương  
thức static lớp JOptionPane  
Ví dụ - sử dụng thuộc tính và phương  
thức static lớp JOptionPane (2)  
JOptionPane.showMessageDialog(null,"Ban da thao tac  
loi", "Thong bao loi", JOptionPane.ERROR_MESSAGE);  
n Object[] options = { "OK", "CANCEL" };  
n JOptionPane.showOptionDialog(null,“Nhan  
OK de tiep tuc", "Canh bao",  
JOptionPane.DEFAULT_OPTION,  
JOptionPane.WARNING_MESSAGE,null,option  
s,options[0]);  
JOptionPane.showConfirmDialog(null,"Ban co chac chan  
muon thoat?", "Hay lua chon",  
JOptionPane.YES_NO_OPTION);  
21  
22  
2.1. Thành viên static (2)  
Ví dụ 1  
class TestStatic{  
public static int iStatic;  
public int iNonStatic;  
n Thay đổi giá trị của một thành viên static  
trong một đối tượng của lớp sẽ thay đổi giá  
trị của thành viên này của tất cả các đối  
tượng khác của lớp đó.  
n Các phương thức staticchỉ có thể truy cập  
vào các thuộc tính staticvà chỉ có thể gọi  
các phương thức statictrong cùng lớp.  
}
public class TestS {  
public static void main(String[] args) {  
TestStatic obj1 = new TestStatic();  
obj1.iStatic = 10; obj1.iNonStatic = 11;  
System.out.println(obj1.iStatic+”,”+obj1.iNonStatic);  
TestStatic obj2 = new TestStatic();  
System.out.println(obj2.iStatic+”,”+obj2.iNonStatic);  
obj2.iStatic = 12;  
System.out.println(obj1.iStatic+”,”+obj1.iNonStatic);  
}
}
23  
24  
6
9/18/17  
Ví dụ 2  
2.2. Thành viên hằng  
public class Demo {  
n Một thuộc tính/phương thức không thể thay  
int i = 0;  
đổi giá trị/nội dung trong quá trình sử dụng.  
void tang(){ i++; }  
n Cú pháp khai báo:  
public static void main(String[] args) {  
chi_dinh_truy_cap final kieu_du_lieu  
TEN_HANG = gia_tri;  
tang();  
System.out.println("Gia tri cua i la" + i);  
n Ví dụ:  
}
}
final double PI = 3.141592653589793;  
public final int VAL_THREE = 39;  
private final int[] A = { 1, 2, 3, 4, 5, 6 };  
non-static method tang() cannot be referenced from a static  
contex  
non-static variable i cannot be referenced from a static context  
25  
26  
2.2. Thành viên hằng (2)  
Instance member vs. Class member  
n Thông thường các hằng số liên quan đến lớp được  
Thành viên đối tượng  
Thành viên lớp  
khai báo là static finalnhằm giúp truy cập dễ  
n Thuộc tính/phương thức  
chỉ được truy cập thông  
qua đối tượng  
n Thuộc tính/phương thức  
có thể được truy cập  
thông qua lớp  
dàng  
n Mỗi đối tượng có 1 bản  
sao riêng của 1 thuộc  
tính đối tượng  
n Các đối tượng có chung  
1 bản sao của 1 thuộc  
tính lớp  
n Giá trị của 1 thuộc tính  
đối tượng của các đối  
tượng khác nhau là  
khác nhau.  
n Giá trị của 1 thuộc tính  
lớp của các đối tượng  
khác nhau là giống  
nhau.  
27  
28  
7
9/18/17  
Nội dung  
3. Quản lý bộ nhớ trong Java  
n Java không sử dụng con trỏ nên các địa chỉ  
bộ nhớ không thể bị ghi đè lên một cách  
ngẫu nhiên hoặc cố ý.  
n Các vấn đề định vị và tái định vị bộ nhớ,  
quản lý bộ nhớ do JVM kiểm soát, hoàn toàn  
trong suốt với lập trình viên.  
1. Chồng phương thức  
2. Thành viên ĐT và thành viên lớp  
3. Quản lý bộ nhớ trong Java  
4. Truyền tham số cho phương thức  
5. Một số lớp tiện ích trong Java  
n Lập trình viên không cần quan tâm đến việc  
ghi dấu các phần bộ nhớ đã cấp phát trong  
heap để giải phóng sau này.  
29  
30  
3.1. Bộ nhớ Heap  
3.1. Bộ nhớ Heap  
String s = new String(“hello”);  
String s = new String(“hello”);  
String t = s;  
n Bộ nhớ Heap  
sử dụng để  
ghi thông tin  
được tạo bởi  
toán tử new.  
n Bộ nhớ Heap  
sử dụng để  
ghi thông tin  
được tạo bởi  
toán tử new.  
Bộ nhớ Heap  
Bộ nhớ Heap  
31  
32  
8
9/18/17  
3.2. Bộ nhớ Stack  
3.3. Bộ thu gom rác (Garbage Collector)  
String s = new String(“hello”);  
String t = s;  
n Một tiến trình chạy ngầm gọi đến bộ “thu  
gom rác” để phục hồi lại phần bộ nhớ mà các  
đối tượng không tham chiếu đến (tái định vị)  
int i = 201;  
int j = i;  
n Các đối tượng không có tham chiếu đến  
n Giá trị cục bộ trong bộ  
nhớ Stack được sử  
dụng như con trỏ  
được gán null.  
n Bộ thu gom rác định kỳ quét qua danh sách  
các đối tượng của JVM và phục hồi các tài  
nguyên của các đối tượng không có tham  
chiếu.  
i
201  
201  
tham chiếu tới Heap  
n Giá trị của dữ liệu  
nguyên thủy được ghi  
trực tiếp trong Stack  
j
Bộ nhớ Stack  
Bộ nhớ Heap  
33  
34  
3.3. Bộ thu gom rác (2)  
Phương thức void finalize()  
n
n
Lớp nào cũng có phương thức finalize() – được thực thi  
ngay lập tức khi quá trình thu gom xảy ra  
n JVM quyết định khi nào thực hiện thu gom  
rác:  
Thường chỉ sử dụng cho các trường hợp đặc biệt để “tự d  
ọn dẹp” các tài nguyên sử dụng khi đối tượng được gc giả  
i phóng  
n
Thông thường sẽ thực thi khi thiếu bộ nhớ  
n
Tại thời điểm không dự đoán trước  
n
Ví dụ cần đóng các socket, file,... nên được xử lý trong luồng  
chính trước khi các đối tượng bị ngắt bỏ tham chiếu.  
n Không thể ngăn quá trình thực hiện của bộ  
n
Có thể coi là hàm hủy (destructor) của lớp mặc dù Java  
không có khái niệm này.  
thu gom rác nhưng có thể yêu cầu thực hiện  
sớm hơn:  
System.gc(); hoặc Runtime.gc();  
35  
36  
9
9/18/17  
3.4. So sánh đối tượng  
3.4. So sánh đối tượng (2)  
n Đối với các kiểu dữ liệu nguyên thủy, toán tử  
== kiểm tra xem chúng có giá trị bằng nhau  
hay không  
n Đối với các đối tượng, toán tử == kiểm tra  
xem hai đối tượng có đồng nhất hay không,  
có cùng tham chiếu đến một đối tượng hay  
không.  
n Ví dụ:  
n Ví dụ:  
Employee a = new Employee(1);  
Employee b = new Employee(1);  
if (a==b)... // false  
int a = 1;  
int b = 1;  
if (a==b)... // true  
Employee a = new Employee(1);  
Employee b = a;  
if (a==b)... // true  
37  
38  
3.4. So sánh đối tượng (3)  
Ví dụ == và equals – Lớp Integer  
public class Equivalence {  
public static void main(String[] args) {  
Integer n1 = new Integer(47);  
Integer n2 = new Integer(47);  
System.out.println(n1 == n2);  
System.out.println(n1.equals(n2));  
}
n Phương thức equals  
n
Đối với kiểu dữ liệu nguyên thủy à Không tồn  
tại.  
n
Đối với các đối tượng: Bất kỳ đối tượng nào cũng  
có phương thức này  
n
So sánh giá trị của đối tượng  
}
39  
40  
10  
9/18/17  
Ví dụ 3 – equals của lớp tự viết  
Nội dung  
class Value {  
int i;  
}
public class EqualsMethod2 {  
public static void main(String[] args) {  
Value v1 = new Value();  
Value v2 = new Value();  
v1.i = v2.i = 100;  
1. Chồng phương thức  
2. Thành viên ĐT và thành viên lớp  
3. Quản lý bộ nhớ trong Java  
4. Truyền tham số cho phương  
thức  
System.out.println(v1.equals(v2));  
}
}
5. Một số lớp tiện ích trong Java  
41  
42  
4. Truyền tham số cho phương thức  
4. Truyền tham số cho phương thức (2)  
n Java truyền mọi tham số cho phương thức dưới  
dạng giá trị (pass-by-value): Truyền giá trị/bản  
sao của tham số thực  
n Có thể sử dụng bất kỳ kiểu dữ liệu nào cho  
tham số của phương thức hoặc constructor  
n
Kiểu dữ liệu nguyên thủy  
n
Với tham số có kiểu dữ liệu tham trị (kiểu dữ liệu nguyên  
thủy): Truyền giá trị/bản sao của các biến nguyên thủy truyền  
vào  
n
Kiểu dữ liệu tham chiếu: mảng và đối tượng  
n Ví dụ  
public Polygon polygonFrom(Point[] corners) {  
// method body goes here  
n
Với tham số có kiểu dữ liệu tham chiếu (mảng và đối tượng):  
Truyền giá trị/bản sao của tham chiếu gốc truyền vào  
}
à Thay đổi tham số hình thức không làm ảnh  
hưởng đến tham số thực  
43  
44  
11  
9/18/17  
4.1. Với kiểu dữ liệu tham trị  
4.2. Với kiểu dữ liệu tham chiếu  
n
Thực ra là truyền bản sao của tham chiếu gốc, chứ  
không phải truyền tham chiếu gốc hoặc truyền đối  
tượng (pass the references by value, not the original  
reference or the object)  
n Các giá trị nguyên thủy không thể thay đổi  
khi truyền như một tham số  
n Phương thức swap này có hoạt động đúng  
không?  
public void swap(int var1, int var2) {  
int temp = var1;  
var1 = var2;  
n
Sau khi truyền cho phương thức, đối tượng có ít nhất 2  
tham chiếu  
var2 = temp;  
45  
}
46  
4.2. Với kiểu dữ liệu tham chiếu-ví dụ 1  
4.2. Với kiểu dữ liệu tham chiếu-ví dụ 1  
public class Student {  
private int year;  
public class Test {  
public static void change(Student std){  
std.setYear(2000);  
private String name;  
}
public Student(String name, int year) {  
this.year = year;  
this.name = name;  
}
public static void main(String[] args) {  
Student std = new Student("Nam", 1990);  
System.out.println(std.getYear());  
change(std);  
public int getYear() {  
return year;  
System.out.println(std.getYear());  
}
}
}
public void setYear(int year) {  
this.year = year;  
}
47  
48  
}
12  
9/18/17  
Ví dụ  
4.2. Với kiểu dữ liệu tham chiếu-ví dụ 2  
public class Point {  
public class Test {  
private double x;  
private double y;  
public Point() { }  
public Point(double x, double y) {  
public static void change(Student std){  
std = new Student("Hung", 1995);  
}
public static void main(String[] args) {  
Student std = new Student("Nam", 1990);  
System.out.println(std.getYear());  
change(std);  
System.out.println(std.getYear());  
}
this.x = x; this.y = y;  
}
public void setX(double x) { this.x = x; }  
public void setY(double y) { this.y = y; }  
public void printPoint() {  
System.out.println("X: " + x + " Y: " + y);  
}
}
}
49  
50  
public class Test {  
public static void tricky(Point arg1, Point arg2) {  
arg1.setX(100); arg1.setY(100);  
Point temp = arg1;  
n Chỉ có các tham  
chiếu của  
arg1 = arg2; arg2 = temp;  
}
phương thức  
được tráo đổi,  
chứ không phải  
các tham chiếu  
gốc  
public static void main(String [] args) {  
Point pnt1 = new Point(0,0);  
Point pnt2 = new Point(0,0);  
pnt1.printPoint(); pnt2.printPoint();  
System.out.println(); tricky(pnt1, pnt2);  
pnt1.printPoint(); pnt2.printPoint();  
}
}
51  
52  
13  
9/18/17  
n Ví dụ 2  
4.3. Truyền số lượng tham số tùy ý  
public Polygon polygonFrom(Point... corners) {  
int numberOfSides = corners.length;  
double squareOfSide1, lengthOfSide1;  
squareOfSide1 = (corners[1].x - corners[0].x)  
*(corners[1].x - corners[0].x)  
n Được gọi là varargs. Cú pháp:  
n
ten_phuong_thuc(Kieu_dl... ten_tham_so)  
+ (corners[1].y - corners[0].y)  
n Ví dụ 1:  
*(corners[1].y - corners[0].y) ;  
lengthOfSide1 = Math.sqrt(squareOfSide1);  
//create & return a polygon connecting the Points  
n
n
Khai báo:  
public PrintStream printf(String format,  
Object... args)  
}
Sử dụng  
n Nhận xét  
n
System.out.printf ("%s: %d, %s\n",  
n
cornersđược coi như một mảng  
name, idnum, address);  
n
System.out.printf ("%s: %d, %s, %s, %s\n",  
name, idnum, address, phone, email);  
n
Phương thức có thể được gọi bằng cách truyền  
một mảng hoặc một loạt các tham số truyền vào  
53  
54  
Bài tập: Tính tổng số lượng các số  
nguyên bất kỳ  
Nội dung  
public class Test {  
public static int plus(int... arr) {  
1. Chồng phương thức  
int result = 0;  
2. Thành viên ĐT và thành viên lớp  
3. Quản lý bộ nhớ trong Java  
4. Truyền tham số cho phương thức  
5. Một số lớp tiện ích trong Java  
for (int i : arr) {  
result += i;  
}
return result;  
}
public static void main(String[] args) {  
System.out.println(plus(1, 2, 3, 4, 5));  
}
}
55  
56  
14  
9/18/17  
5.1. Package trong Java  
5.1. Package trong Java (2)  
n Package giống như thư mục giúp:  
n
Tổ chức và xác định vị trí lớp dễ dàng và sử  
dụng các lớp một cách phù hợp.  
Tránh cho việc đặt tên lớp bị xung đột (trùng  
tên)  
n Tên đầy đủ của lớp bao gồm tên gói và tên  
lớp:  
n
n
Các package khác nhau có thể chứa các lớp có cùng  
tên  
n
Bảo vệ các lớp, dữ liệu và phương thức ở mức  
rộng hơn so với mối quan hệ giữa các lớp.  
n Một package cũng có thể chứa các package  
khác  
57  
58  
a. Tham chiếu giữa các lớp  
a. Tham chiếu giữa các lớp (2)  
n
Lệnh import:  
n Trong cùng 1 package: Sử dụng tên lớp  
n
Sử dụng lệnh importđể khai báo các package hoặc các  
n Khác package: Phải cung cấp tên đầy đủ cho  
lớp để khi sử dụng không cần nêu tên đầy đủ.  
n
Ví dụ:  
các lớp được định nghĩa trong package khác.  
import javax.swing.JOptionPane;  
public class HelloNameDialog{  
public static void main(String[] args){  
String result;  
n Ví dụ:  
public class HelloNameDialog{  
public static void main(String[] args){  
String result;  
result = JOptionPane.showInputDialog  
(“Hay nhap ten ban:”);  
result = javax.swing.JOptionPane.showInputDialog  
(“Hay nhap ten ban:”);  
JOptionPane.showMessageDialog(null,  
javax.swing.JOptionPane.showMessageDialog(null,  
”Xin chao “+ result + “!”);  
”Xin chao “+ result + “!”);  
System.exit(0);  
}
}
}
}
59  
60  
15  
9/18/17  
b. Các package trong Java  
b. Các package trong Java (2)  
•java.applet  
•java.awt  
•java.beans  
•java.io  
•java.lang  
•java.math  
•java.net  
•java.nio  
•java.rmi  
•javax.rmi  
•javax.security  
•javax.sound  
•javax.sql  
•javax.swing  
•javax.transaction  
•javax.xml  
•org.ietf.jgss  
n Các package cơ bản trong Java  
n
java.lang  
n
n
n
Cung cấp các lớp cơ bản cho thiết kế ngôn ngữ lập trình Java  
Bao gồm wrapper classes, String và StringBuffer, Object, ...  
Import ngầm định vào tất cả các lớp  
n
n
java.util  
•org.omg.CORBA  
•java.security  
•java.sql  
•java.text  
•org.omg.CosNaming  
•org.omg.Dynamic  
•org.omg.IOP  
•org.omg.Messaging  
•org.omg.PortableInterceptor  
•org.omg.PortableServer  
•org.omg.SendingContext  
•org.omg.stub.java.rmi  
•org.w3c.dom  
n
Bao gồm tập hợp framework, mô hình sự kiện, date time, và  
nhiều tiện ích khác.  
•java.util  
java.io  
•javax.accessibility  
•javax.crypto  
•javax.imageio  
•javax.naming  
•javax.net  
n
Cung cấp khả năng vào/ra hệ thống với các luồng dữ liệu và hệ  
thống file.  
•javax.print  
61  
62  
•org.xml  
b. Các package trong Java (3)  
5.2. Các lớp bao (Wrapper class)  
n Các package cơ bản trong Java  
n Các kiểu dữ liệu nguyên thủy không có các  
n
java.math  
phương thức liên quan đến nó.  
n
Cung cấp các lớp thực thi các phép toán với số nguyên và các  
phép toán thập phân  
n Mỗi kiểu dữ liệu nguyên thủy có một lớp  
n
java.sql  
tương ứng gọi là lớp bao:  
n
Cung cấp các API cho phép truy nhập và xử lý dữ liệu được lưu  
trữ trong một nguồn dữ liệu (thường sử dụng cơ sở dữ liệu quan  
hệ)  
n
n
n
Các lớp bao sẽ “gói” dữ liệu nguyên thủy và cung cấp các  
phương thức thích hợp cho dữ liệu đó.  
n
n
javax.swing  
n
Cung cấp các lớp và giao diện cho phép tạo ra các ứng dụng đồ  
họa.  
Mỗi đối tượng của lớp bao đơn giản là lưu trữ một biến  
đơn và đưa ra các phương thức để xử lý nó.  
…
Các lớp bao là một phần của Java API  
63  
64  
16  
9/18/17  
5.2. Các lớp bao (2)  
a. Chuyển đổi kiểu dữ liệu  
n Sử dụng toString()để chuyển các giá trị số thành xâu.  
n Sử dụng <type>Value() để chuyển từ đối tượng của lớp  
bao thành giá trị nguyên thủy của đối tượng tương ứng  
Float objF = new Float(“4.67”);  
float f = objF.floatValue(); // f=4.67F  
int i = objF.intValue(); //i=4  
n Sử dụng parse<type>()và valueOf() để chuyển xâu  
thành các giá trị số.  
int i = Integer.parseInt(“123”); //i=123  
double d = Double.parseDouble(“1.5”) ; // d=1.5  
Double objF2 = Double.valueOf(“-36.12”);  
long l = objF2.longValue(); // l=-36L  
65  
66  
a. Chuyển đổi kiểu dữ liệu (2)  
b. Các hằng số  
n
n
n
Boolean  
n
Float  
n
Boolean FALSE  
n
n
n
n
n
float MAX_VALUE  
n
Boolean TRUE  
float MIN_VALUE  
float NaN  
float NEGATIVE_INFINITY  
float POSITIVE_INFINITY  
Byte  
n
byte MIN_VALUE  
byte MAX_VALUE  
n
n
n
n
Integer  
Character  
n
int MIN_VALUE  
int MAX_VALUE  
n
n
n
n
n
int MAX_RADIX  
char MAX_VALUE  
int MIN_RADIX  
char MIN_VALUE  
n
Long  
n
long MIN_VALUE  
long MAX_VALUE  
Unicode classification constants  
n
n
Double  
Short  
n
n
n
n
n
double MAX_VALUE  
double MIN_VALUE  
double NaN  
double NEGATIVE_INFINITY  
double POSITIVE_INFINITY  
n
short MIN_VALUE  
short MAX_VALUE  
n
67  
68  
17  
9/18/17  
Ví dụ  
5.3. Xâu (String)  
double d = (new Integer(Integer.MAX_VALUE)).  
doubleValue();  
System.out.println(d); // 2.147483647E9  
n Kiểu String là một lớp và không phải là kiểu  
dữ liệu nguyên thủy  
n Một String được tạo thành từ một dãy các ký  
tự nằm trong dấu nháy kép:  
String a = "A String";  
String input = "test 1-2-3";  
int output = 0;  
for (int index=0;index<input.length();index++) {  
char c = input.charAt(index);  
if (Character.isDigit(c))  
String b = "";  
n Đối tượng String có thể khởi tạo theo nhiều  
output = output * 10 + Character.digit(c, 10);  
}
cách:  
System.out.println(output); // 123  
String c = new String();  
String d = new String("Another String");  
String e = String.valueOf(1.23);  
69  
70  
String f = null;  
a. Ghép xâu  
b. Các phương thức của xâu  
String name = "Joe Smith";  
name.toLowerCase();  
n Toán tử + có thể nối các String:  
// "joe smith"  
// "JOE SMITH"  
// "Joe Smith"  
// 2  
// 9  
// 'm'  
String a = "This" + " is a " + "String";  
name.toUpperCase();  
"Joe Smith ".trim();  
//a = “This is a String”  
"Joe Smith".indexOf('e');  
"Joe Smith".length();  
"Joe Smith".charAt(5);  
"Joe Smith".substring(5);  
"Joe Smith".substring(2,5);  
n Các kiểu dữ liệu cơ bản sử dụng trong lời gọi  
println() được chuyển đổi tự động sang kiểu  
String  
// "mith"  
// "e S"  
System.out.println("answer = " + 1 + 2 + 3);  
System.out.println("answer = " + (1+2+3));  
à Hai câu lệnh trên có in ra cùng một kết quả?  
71  
72  
18  
9/18/17  
c. So sánh hai xâu  
c. So sánh hai xâu (2)  
n
n
n
oneString.equals(anotherString)  
n
Kiểm tra tính tương đương  
Trả về truehoặc false  
s1  
String name = "Joe";  
if ("Joe".equals(name))  
name += " Smith";  
String s1 = new String(“Hello”);  
n
String s2 = s1;  
Hello  
(s1==s2) trả về true  
s2  
oneString.equalsIgnoreCase(anotherString)  
n
Kiểm tra KHÔNG xét đến ký tự hoa, thường  
String s1 = new String(“Hello”);  
String s2 = new String(“Hello”);  
boolean same = "Joe".equalsIgnoreCase("joe");  
So sánh oneString == anotherStringsẽ gây nhập nhằng  
(s1==s2) trả về false  
Hello  
s1  
n
So sánh 2 đối tượng  
s2  
Hello  
73  
74  
d. Điểm đặc biệt của String  
String Literal vs. String Object  
n
n
Khởi tạo String theo 2 cách:  
n
n
n
n
n
String s1 = "Hello";  
String s2 = "Hello";  
String s3 = s1;  
// String literal  
// String literal  
// same reference  
n
Gán 1 giá trị literal  
n
Dùng toán tử new (Không khuyến khích dùng)  
Ví dụ:  
String s4 = new String("Hello"); // String object  
String s5 = new String("Hello"); // String object  
n
String str1 = "Java is Hot"; // Implicit construction qua string  
literal  
n
str1 is được khai báo là 1 String reference và được khởi tạo 1 giá trị  
String literal "Java is Hot"  
n
String str2 = new String("I'm cool"); // Explicit construction  
qua toán tử new  
n
str2 được khai báo là 1 String reference và được khởi tạo qua toán  
tử new.  
n
n
String literals được chứa trong 1common pool.  
n
à Cho phép chia sẻ lưu trữ các String với cùng nội dung để  
tiết kiệm bộ nhớ.  
String objects lưu trữ giá trị trong heap, không tiết kiệm  
được bộ nhớ  
75  
76  
19  
9/18/17  
d. Điểm đặc biệt của String (2)  
5.4. StringBuffer  
String s1 = new String("test");  
String s2 = "test";  
String s3 = String.valueOf("test");  
System.out.println(s1==s2);  
System.out.println(s1==s3);  
System.out.println(s2==s3);  
n String là kiểu bất biến:  
n
Đối tượng không thay đổi giá trị sau khi được tạo  
ra à Các xâu của lớp String được thiết kế để  
không thay đổi giá trị.  
n
Khi các xâu được ghép nối với nhau một đối  
tượng mới được tạo ra để lưu trữ kết quả à  
Ghép nối xâu thông thường rất tốn kém về bộ  
nhớ.  
String s4 = new String("test");  
String s5 = "test";  
String s6 = String.valueOf("test");  
System.out.println(s1==s4);  
System.out.println(s2==s5);  
System.out.println(s3==s6);  
n StringBuffer là kiểu biến đổi:  
n
Đối tượng có thể thay đổi giá trị sau khi được tạo  
ra  
77  
78  
5.4. StringBuffer (2)  
5.4. StringBuffer (3)  
n StringBuffer:  
n
Cung cấp các đối tượng xâu có thể thay đổi  
giá trị à Sử dụng StringBuffer khi:  
n
Dự đoán các ký tự trong xâu có thể thay đổi.  
n
Khi xử lý các xâu một cách linh động, ví dụ như  
đọc dữ liệu text từ một tệp tin.  
String s = new String(“hello”);  
n
Cung cấp các cơ chế hiệu quả hơn cho việc  
xây dựng, ghép nối các xâu:  
String t = s;  
s = new String(“goodbye”);  
n
Việc ghép nối xâu thường được các trình biên dịch  
chuyển sang thực thi trong lớp StringBuffer  
79  
80  
20  
Tải về để xem bản đầy đủ
pdf 22 trang yennguyen 21960 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Bài 4: Các kỹ thuật xây dựng lớp và sử dụng đối tượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_bai_4_cac_ky_thuat_xay_d.pdf