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 đủ
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:
bai_giang_lap_trinh_huong_doi_tuong_bai_4_cac_ky_thuat_xay_d.pdf

