Xem mẫu
- 9/18/17
Mục tiêu bài học
Bộ môn Công nghệ Phần mềm
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
Viện CNTT & TT khởi tạo
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 trong Java
Bài 04. Các kỹ thuật xây dựng lớp 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
và sử dụng đối tượng 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 2. Thành viên ĐT và thành viên lớp
3. Quản lý bộ nhớ trong Java 3. Quản lý bộ nhớ trong Java
4. Truyền tham số cho phương thức 4. Truyền tham số cho phương thức
5. Một số lớp tiện ích trong Java 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 Mỗi phương thức phải có một chữ ký riêng 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
n Chữ ký của phương thức bao gồm: tên nhưng chữ ký phải khác nhau:
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:
n Phương thức println() trong System.out.println() class MyDate {
int year, month, day;
có 10 khai báo với các tham số khác nhau:
public boolean setMonth(int m) { …}
boolean, char[], char, double, float, int, long, public boolean setMonth(String s) { …}
Object, String, và một không có tham số. }
n Không cần sử dụng các tên khác nhau (chẳng public class Test{
hạn "printString“ hoặc "printDouble“) cho mỗi public static void main(String args[]){
kiểu dữ liệu muốn hiển thị. MyDate d = new MyDate();
d.setMonth(9);
d.setMonth(”September”);
}
7 } 8
2
- 9/18/17
Một số chú ý với chồng phương thức Thảo luận
n Các phương thức chỉ được xem xét là chồng n Cho phương thức sau đây:
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:
n Chỉ nên sử dụng kỹ thuật này với các phương 1. void test(String b, int a)
thức có cùng mục đích, chức năng; tránh lạm 2. public double test(String a)
dụng 3. private int test(int b, String a)
private int test(String a, int b)
Khi dịch, trình dịch căn cứ vào số lượng hoặc
4.
n
5. double test(double a, int b)
kiểu dữ liệu của tham số để quyết định gọi 6. double test(int b)
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 prt(String s) { System.out.println(s); }
void f1(char x) { prt("f1(char)"); } void f2(short x) { prt("f3(short)"); }
void f1(byte x) { prt("f1(byte)"); } void f2(int x) { prt("f3(int)"); }
void f1(short x) { prt("f1(short)"); } void f2(long x) { prt("f5(long)"); }
void f1(int x) { prt("f1(int)"); } void f2(float x) { prt("f5(float)"); }
void f1(long x) { prt("f1(long)"); }
void f1(float x) { prt("f1(float)"); }
n Điều gì xảy ra nếu thực hiện:
n f2(5);
void f1(double x) { prt("f1(double)"); }
n char x=‘a’; f2(x);
n Điều gì xảy ra nếu thực hiện: 5 à int n byte y=0; f2(y);
n f1(5); n float z = 0; f2(z);
char x=‘a’; f1(x);
Điều gì xảy ra nếu gọi f2(5.5)?
n
n
n byte y=0; f1(y); Error: cannot find symbol: method f2(double)
11 12
n float z = 0; f1(z);…
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;
tạo đối tượng theo nhiều cách khác nhau private double balance;
public BankAccount(){owner = “noname”;}
n à Cần xây dựng các phương thức khởi tạo public BankAccount(String o, double b){
khác nhau cho đối tượng theo nguyên lý owner = o; balance = b;
}
chồng phương thức (constructor }
overloading). 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
trong lớp tương ứng với đối tượng muốn tham chiếu. private double speed=1.0, direction=0.0;
public String name;
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) {
public class BankAccount{ this.name = name;
private String owner;
}
public Ship(String name, double x, double y) {
public void setOwner(String owner){
this(name); this.x = x; this.y = y;
this.owner = owner; }
} public Ship(String name, double x, double y,
public BankAccount() { this.setOwner(“noname”); } double speed, double direction) {
… 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: }
n this(danh_sach_tham_so); //neu co tham so 15
//continue… 16
4
- 9/18/17
//(cont.)
Nội dung
private double degreeToRadian(double degrees) {
return(degrees * Math.PI / 180.0);
}
public void move() { 1. Chồng phương thức
move(1);
} 2. Thành viên ĐT và thành viên
public void move(int steps) { lớp
double angle = degreesToRadians(direction);
x = x + (double)steps*speed*Math.cos(angle); 3. Quản lý bộ nhớ trong Java
y = y + (double)steps*speed*Math.sin(angle);
} 4. Truyền tham số cho phương thức
public void printLocation() {
System.out.println(name + " is at (" 5. Một số lớp tiện ích trong Java
+ x + "," + y + ").");
}
} //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ụ:
n Phương thức:
19 20
5
- 9/18/17
Ví dụ - sử dụng thuộc tính và phương Ví dụ - sử dụng thuộc tính và phương
thức static lớp JOptionPane 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
JOptionPane.showConfirmDialog(null,"Ban co chac chan
muon thoat?", "Hay lua chon", s,options[0]);
JOptionPane.YES_NO_OPTION);
21 22
2.1. Thành viên static (2) Ví dụ 1
n Thay đổi giá trị của một thành viên static class TestStatic{
public static int iStatic;
trong một đối tượng của lớp sẽ thay đổi giá }
public int iNonStatic;
trị của thành viên này của tất cả các đối public class TestS {
public static void main(String[] args) {
tượng khác của lớp đó. TestStatic obj1 = new TestStatic();
obj1.iStatic = 10; obj1.iNonStatic = 11;
n Các phương thức static chỉ có thể truy cập System.out.println(obj1.iStatic+”,”+obj1.iNonStatic);
vào các thuộc tính static và chỉ có thể gọi TestStatic obj2 = new TestStatic();
System.out.println(obj2.iStatic+”,”+obj2.iNonStatic);
các phương thức static trong cùng lớp. 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++; }
public static void main(String[] args) { n Cú pháp khai báo:
tang(); chi_dinh_truy_cap final kieu_du_lieu
TEN_HANG = gia_tri;
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 final nhằm giúp truy cập dễ
n Thuộc tính/phương thức n Thuộc tính/phương thức
dàng
chỉ được truy cập thông có thể được truy cập
qua đối tượng thông qua lớp
n Mỗi đối tượng có 1 bản n Các đối tượng có chung
sao riêng của 1 thuộc 1 bản sao của 1 thuộc
tính đối tượng tính lớp
n Giá trị của 1 thuộc tính n Giá trị của 1 thuộc tính
đối tượng của các đối lớp của các đối tượng
tượng khác nhau là khác nhau là giống
khác nhau. 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ỉ
1. Chồng phương thức bộ nhớ không thể bị ghi đè lên một cách
2. Thành viên ĐT và thành viên lớp ngẫu nhiên hoặc cố ý.
3. Quản lý bộ nhớ trong Java 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
4. Truyền tham số cho phương thức trong suốt với lập trình viên.
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
n Bộ nhớ Heap
được tạo bởi sử dụng để
toán tử new.
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”); n Một tiến trình chạy ngầm gọi đến bộ “thu
String t = s; gom rác” để phục hồi lại phần bộ nhớ mà các
int i = 201; đối tượng không tham chiếu đến (tái định vị)
int j = i;
n Các đối tượng không có tham chiếu đến
n Giá trị cục bộ trong bộ được gán null.
nhớ Stack được sử
dụng như con trỏ i 201
n Bộ thu gom rác định kỳ quét qua danh sách
tham chiếu tới Heap
các đối tượng của JVM và phục hồi các tài
n Giá trị của dữ liệu j 201
nguyên thủy được ghi nguyên của các đối tượng không có tham
trực tiếp trong Stack chiếu.
Bộ nhớ Stack Bộ nhớ Heap33 34
3.3. Bộ thu gom rác (2) Phương thức void finalize()
n JVM quyết định khi nào thực hiện thu gom 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
rác: n Thường chỉ sử dụng cho các trường hợp đặc biệt để “tự d
n Thông thường sẽ thực thi khi thiếu bộ nhớ ọn dẹp” các tài nguyên sử dụng khi đối tượng được gc giả
i phóng
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
thu gom rác nhưng có thể yêu cầu thực hiện không có khái niệm này.
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ử n Đối với các đối tượng, toán tử == kiểm tra
== kiểm tra xem chúng có giá trị bằng nhau xem hai đối tượng có đồng nhất hay không,
hay không có cùng tham chiếu đến một đối tượng hay
n Ví dụ: không.
n Ví dụ:
int a = 1; Employee a = new Employee(1);
int b = 1; Employee b = new Employee(1);
if (a==b)... // true if (a==b)... // false
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 {
n Phương thức equals
public static void main(String[] args) {
n Đối với kiểu dữ liệu nguyên thủy à Không tồn Integer n1 = new Integer(47);
tại. Integer n2 = new Integer(47);
n Đối với các đối tượng: Bất kỳ đối tượng nào cũng System.out.println(n1 == n2);
có phương thức này System.out.println(n1.equals(n2));
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 {
Chồng phương thức
int i;
} 1.
public class EqualsMethod2 {
public static void main(String[] args) { 2. Thành viên ĐT và thành viên lớp
Value v1 = new Value();
Value v2 = new Value(); 3. Quản lý bộ nhớ trong Java
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
4. Truyền tham số cho phương
} thức
}
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 Có thể sử dụng bất kỳ kiểu dữ liệu nào cho n Java truyền mọi tham số cho phương thức dưới
tham số của phương thức hoặc constructor dạng giá trị (pass-by-value): Truyền giá trị/bản
n Kiểu dữ liệu nguyên thủy sao của tham số thực
n Kiểu dữ liệu tham chiếu: mảng và đối tượng 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
n Ví dụ vào
public Polygon polygonFrom(Point[] corners) {
n Với tham số có kiểu dữ liệu tham chiếu (mảng và đối tượng):
// method body goes here 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 Các giá trị nguyên thủy không thể thay đổi n Thực ra là truyền bản sao của tham chiếu gốc, chứ
khi truyền như một tham số 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 Phương thức swap này có hoạt động đúng
không?
public void swap(int var1, int var2) {
int temp = var1; n Sau khi truyền cho phương thức, đối tượng có ít nhất 2
var1 = var2;
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 { public class Test {
private int year;
public static void change(Student std){
private String name;
std.setYear(2000);
public Student(String name, int year) { }
this.year = year; public static void main(String[] args) {
this.name = name; Student std = new Student("Nam", 1990);
}
System.out.println(std.getYear());
public int getYear() { change(std);
return year; System.out.println(std.getYear());
} }
public void setYear(int year) {
}
this.year = year;
}
} 47 48
12
- 9/18/17
4.2. Với kiểu dữ liệu tham chiếu-ví dụ 2 Ví dụ
public class Test { public class Point {
public static void change(Student std){ private double x;
private double y;
std = new Student("Hung", 1995);
public Point() { }
}
public Point(double x, double y) {
public static void main(String[] args) { this.x = x; this.y = y;
Student std = new Student("Nam", 1990); }
System.out.println(std.getYear()); public void setX(double x) { this.x = x; }
change(std); public void setY(double y) { this.y = y; }
System.out.println(std.getYear()); 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); n Chỉ có các tham
Point temp = arg1;
arg1 = arg2; arg2 = temp; chiếu của
} phương thức
public static void main(String [] args) { được tráo đổi,
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0); chứ không phải
pnt1.printPoint(); pnt2.printPoint(); các tham chiếu
System.out.println(); tricky(pnt1, pnt2); gốc
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;
n Được gọi là varargs. Cú pháp: squareOfSide1 = (corners[1].x - corners[0].x)
n ten_phuong_thuc(Kieu_dl... ten_tham_so) *(corners[1].x - corners[0].x)
+ (corners[1].y - corners[0].y)
n Ví dụ 1:
*(corners[1].y - corners[0].y) ;
n Khai báo: lengthOfSide1 = Math.sqrt(squareOfSide1);
public PrintStream printf(String format, //create & return a polygon connecting the Points
Object... args) }
n Sử dụng n Nhận xét
n System.out.printf ("%s: %d, %s\n",
name, idnum, address); n corners được coi như một mảng
n System.out.printf ("%s: %d, %s, %s, %s\n", n Phương thức có thể được gọi bằng cách truyền
name, idnum, address, phone, email); 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;
for (int i : arr) { 2. Thành viên ĐT và thành viên lớp
result += i;
}
3. Quản lý bộ nhớ trong Java
return result; 4. Truyền tham số cho phương thức
}
5. Một số lớp tiện ích trong Java
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ử n Tên đầy đủ của lớp bao gồm tên gói và tên
dụng các lớp một cách phù hợp. lớp:
n Tránh cho việc đặt tên lớp bị xung đột (trùng
tê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 Trong cùng 1 package: Sử dụng tên lớp n Lệnh import:
Sử dụng lệnh import để khai báo các package hoặc các
Khác package: Phải cung cấp tên đầy đủ cho
n
n lớp để khi sử dụng không cần nêu tên đầy đủ.
các lớp được định nghĩa trong package khác. n Ví dụ:
import javax.swing.JOptionPane;
n Ví dụ: public class HelloNameDialog{
public class HelloNameDialog{
public static void main(String[] args){
public static void main(String[] args){
String result;
String result;
result = JOptionPane.showInputDialog
result = javax.swing.JOptionPane.showInputDialog
(“Hay nhap ten ban:”);
(“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
•javax.rmi
•javax.security n Các package cơ bản trong Java
•java.beans
•java.io
•javax.sound n java.lang
•javax.sql
•java.lang •javax.swing n Cung cấp các lớp cơ bản cho thiết kế ngôn ngữ lập trình Java
•java.math •javax.transaction n Bao gồm wrapper classes, String và StringBuffer, Object, ...
•java.net •javax.xml
•java.nio n Import ngầm định vào tất cả các lớp
•org.ietf.jgss
•java.rmi •org.omg.CORBA n java.util
•java.security •org.omg.CosNaming
•java.sql
n Bao gồm tập hợp framework, mô hình sự kiện, date time, và
•org.omg.Dynamic
•java.text nhiều tiện ích khác.
•org.omg.IOP
•java.util •org.omg.Messaging n java.io
•javax.accessibility •org.omg.PortableInterceptor
•javax.crypto n Cung cấp khả năng vào/ra hệ thống với các luồng dữ liệu và hệ
•org.omg.PortableServer
•javax.imageio thống file.
•org.omg.SendingContext
•javax.naming •org.omg.stub.java.rmi
•javax.net •org.w3c.dom
•javax.print •org.xml 61 62
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
java.math
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ương thức liên quan đến nó.
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
n Cung cấp các API cho phép truy nhập và xử lý dữ liệu được lưu tương ứng gọi là lớp bao:
trữ trong một nguồn dữ liệu (thường sử dụng cơ sở dữ liệu quan
hệ) n Các lớp bao sẽ “gói” dữ liệu nguyên thủy và cung cấp các
n javax.swing phương thức thích hợp cho dữ liệu đó.
n Cung cấp các lớp và giao diện cho phép tạo ra các ứng dụng đồ n Mỗi đối tượng của lớp bao đơn giản là lưu trữ một biến
họa.
đơn và đưa ra các phương thức để xử lý nó.
n …
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 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() 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”);
65
long l = objF2.longValue(); // l=-36L
66
a. Chuyển đổi kiểu dữ liệu (2) b. Các hằng số
n Boolean n Float
n Boolean FALSE n float MAX_VALUE
n Boolean TRUE n float MIN_VALUE
n Byte n float NaN
n byte MIN_VALUE n float NEGATIVE_INFINITY
n byte MAX_VALUE n float POSITIVE_INFINITY
n Character n Integer
n int MAX_RADIX n int MIN_VALUE
n char MAX_VALUE n int MAX_VALUE
n int MIN_RADIX n Long
n char MIN_VALUE n long MIN_VALUE
n Unicode classification constants n long MAX_VALUE
n Double n Short
n double MAX_VALUE n short MIN_VALUE
n double MIN_VALUE n short MAX_VALUE
n double NaN
n double NEGATIVE_INFINITY
n double POSITIVE_INFINITY
67 68
17
- 9/18/17
Ví dụ 5.3. Xâu (String)
double d = (new Integer(Integer.MAX_VALUE)). n Kiểu String là một lớp và không phải là kiểu
doubleValue();
System.out.println(d); // 2.147483647E9 dữ liệu nguyên thủy
n Một String được tạo thành từ một dãy các ký
String input = "test 1-2-3";
int output = 0; tự nằm trong dấu nháy kép:
for (int index=0;index
- 9/18/17
c. So sánh hai xâu c. So sánh hai xâu (2)
n oneString.equals(anotherString)
n Kiểm tra tính tương đương String name = "Joe"; String s1 = new String(“Hello”); s1
n Trả về true hoặc false if ("Joe".equals(name)) String s2 = s1; Hello
name += " Smith";
(s1==s2) trả về true
n oneString.equalsIgnoreCase(anotherString) s2
n Kiểm tra KHÔNG xét đến ký tự hoa, thường
String s1 = new String(“Hello”);
boolean same = "Joe".equalsIgnoreCase("joe");
String s2 = new String(“Hello”);
n So sánh oneString == anotherString sẽ gây nhập nhằng (s1==s2) trả về false s1 Hello
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 Khởi tạo String theo 2 cách: n String s1 = "Hello"; // String literal
n Gán 1 giá trị literal
n String s2 = "Hello"; // String literal
n Dùng toán tử new (Không khuyến khích dùng)
String s3 = s1; // same reference
Ví dụ:
n
n
n String s4 = new String("Hello"); // String object
n String str1 = "Java is Hot"; // Implicit construction qua string
literal n String s5 = new String("Hello"); // String object
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 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ớ.
n 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"; n String là kiểu bất biến:
String s3 = String.valueOf("test");
System.out.println(s1==s2);
n Đối tượng không thay đổi giá trị sau khi được tạo
System.out.println(s1==s3); ra à Các xâu của lớp String được thiết kế để
System.out.println(s2==s3); không thay đổi giá trị.
n Khi các xâu được ghép nối với nhau một đối
String s4 = new String("test"); tượng mới được tạo ra để lưu trữ kết quả à
String s5 = "test";
String s6 = String.valueOf("test"); Ghép nối xâu thông thường rất tốn kém về bộ
System.out.println(s1==s4); nhớ.
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
77 ra 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.
n String s = new String(“hello”); n Cung cấp các cơ chế hiệu quả hơn cho việc
String t = s; xây dựng, ghép nối các xâu:
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
nguon tai.lieu . vn