1
Bài 5: Các kỹ thuật xây dựng
lớp và sử dụng đối tượng
!
1
Nội dung
1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyn tham s cho phương thc
4. Một số lp tin ích trong Java
5. dụ và bài tập
2
2
Nội dung
1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyn tham s cho phương thc
4. Một số lp tin ích trong Java
5. dụ và bài tập
3
3
Nhắc lại về phương thức
v !"#$%&'()*$+&,-$%&.#$-/$01+$-&2$34$5#6)*
v 7&2$34$-89$%&'()*$+&,-$:9;$*<0=
§ !"#$%&' (# )$*&+,
§ -.$/'0#)$,1,$2.3$4.$56$7389$,:;$,&<#)
4
4
2
1.1. Chồng phương thức
v 7&<)*$%&'()*$+&,-$>!?+&;@$AB?5C;9@#)*D= 7E-$
%&'()*$+&,-$+5;)*$-F)*$01+$CG%$-/$+&H$+5F)*$+6)$
)&')*$-&2$34$%&.#$3&E-$)&9I=
§ -.$/'0#)$*&;=$4.$7&1,$#&;9
§ >?9$,@#)$4.$/'0#)$*&;=$4.$*&A$7389$BC$/3D9$,1,$*&;=$4.$%&E3$
7&1,$#&;9
v !J-$KL-&=
§ !"#$*F@# )$#&;9$28$= G$*E$HE#$,&I*$,G# )$53D,
§ !&9J#$KD#$,&L$/J%$*FA#&$5A$7&G#)$,M#$%&E3$#&N$O91$#&3P9$
*"#$%&'(#)$*&+,$=6$,&Q$,M#$#&N$=R*$*"#$56$/S;$,&T#$,1,$
*&;=$4.$,&L$%&@$&0%U
5
5
1.1. Chồng phương thức (2)
v ML$@J$N=
§ V&'(#)$*&+,$%F3#*/#WX$*FL#)$-Y4*Z=UL9*U%F3#*/#WX$,[$\]$7&;3$
H1L$5N3$,1,$*&;=$4.$7&1,$#&;9^$HLL/Z;#_$,&;F`a_$,&;F_$
BL9H/Z_$b/L;*_$3#*_$/L#)_$cHdZ,*_$-*F3#)_$56$=R*$7&G#)$,[$*&;=$
4.U
§ e&G#)$,M#$4f$Bg#)$,1,$*"#$7&1,$#&;9$W,&h#)$&i#$
j%F3#*-*F3#)k$&Ll,$j%F3#*mL9H/ZkX$,&L$=n3$7389$BC$/3D9$
=9.#$&38#$*&oU
6
6
1.1. Chồng phương thức (3)
v ML$@J$O=
7
class
MyDate {
int
year, month, day;
public boolean
setMonth(
int
m) { …}
public boolean
setMonth(String s) { …}
}
public class
Test{
public static void
main(String args[]){
MyDate d =
new
MyDate();
d.setMonth(9);
d.setMonth(”September”);
}
}
7
Một số chú ý với chồng phương thức
v 7E-$%&'()*$+&,-$-&P$K'Q-$R?0$RS+$CT$-&<)*$3&#$
-&U)*$+&I1-$-F)*$01+$CG%
v 7&P$)6)$VW$@J)*$3X$+&IY+$)TZ$BG#$-E-$%&'()*$+&,-$
-/$-F)*$0J-$KL-&[$-&,-$)\)*]$+5E)&$C^0$@J)*
v _&#$@`-&[$+5a)&$@`-&$-\)$-,$BT;$Vb$C'Q)*$&;c-$3#HI$
@2$C#dI$-89$+&90$Vb$KH$eIZf+$K`)&$*g#$%&'()*$
+&,-$)T;$%&F$&Q%h
à ifI$3&j)*$-&g)$K'Q-$&;c-$-&g)$K'Q-$)&#kI$
&()$N$%&'()*$+&,-$+&a$Vl$:E;$C"#h
8
8
3
Thảo luận
v Cho phương thức sau đây:
public double test(String a, int b)
v 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)
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)
7. public double test(String a, long b)
9
9
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 f1(long x) { prt("f1(long)"); }
void f1(float x) { prt("f1(float)"); }
void f1(double x) { prt("f1(double)"); }
v m#kI$*a$R.Z$59$)fI$+&n-$&#d)=
§ f1(5);
§ char x=‘a’; f1(x);
§ byte y=0; f1(y);
§ float z = 0; f1(z);…
10
o$à #)+
10
Thảo luận
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)"); }
v m#kI$*a$R.Z$59$)fI$+&n-$&#d)=
§ f2(5);
§ char x=‘a’; f2(x);
§ byte y=0; f2(y);
§ float z = 0; f2(z);
v m#kI$*a$R.Z$59$)fI$*g#$pO>ohoDq
11
Error: cannot find symbol: method f2(double)
11
Ví dụ
class pYq/;44$r
public void =YpZ*&LBWint ;_$long HX$r
s
public void =YpZ*&LBWlong ;_$int HX$r$tt$L5ZF/L;B3#)
s
s
public class !Z 4* $r
public static void =;3#W-*F3#)$;F)4`aX$r
pYq/;44$= u$new pYq/;44WXv
=U=YpZ*&LBWXv$tt$ZFFLF$BL$7&G#)$,[$=Z*&LB$%&@$&0%
=U=YpZ*&LBWw_$\]Xv$tt$ZFFLF$BL$,[$x$%&3"#$HE#$=Z*&LB$%&@$&0%
s
s
12
12
4
1.2. Chồng phương thức khởi tạo
v r5;)*$)&#kI$+a)&$&Ib)*$3&E-$)&9I$-s)$3&t#$+^;$
Kb#$+'Q)*$+&?;$)&#kI$-E-&$3&E-$)&9I$
v à 7s)$RuZ$@n)*$-E-$%&'()*$+&,-$3&t#$+^;$3&E-$
)&9I$-&;$Kb#$+'Q)* t&?;$)*IZ6)$C4$-&<)*$%&'()*$
+&,-$>-;)V+5I-+;5$;B?5C;9@#)*Dh
13
13
Ví dụ
public class
BankAccount{
private
String owner;
private double
balance;
public
BankAccount(){owner = “noname”;}
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);
}
}
14
14
1.3. Từ khóa this
v >&y,$/i3^$!S$*&;=$,&3?9$2?#$2.3$*'0#)$&3D#$*i3_$4f$Bg#)$H"#$
*FL#)$/N%$*'(#)$+#)$5N3$2.3$*'0#)$=9.#$*&;=$,&3?9U
v -f$Bg#)$*&9R,$*z#&$&Ll,$%&'(#)$*&+,$,:;$2.3$*'0#)$*&G#)$O9;$
*L1#$*f$kU{_$5z$Bg^
public class BankAccount{
private String owner;
public void setOwner(String owner){
this.owner = owner;
}
public BankAccount() { this.setOwner(“noname”); }
}
v |T3$2?#$%&'(#)$*&+,$7&}3$*iL$7&1,$,:;$/N%^
§ this(danh_sach_tham_so); //neu co tham so
15
15
Ví dụ
public class Ship {
private double x=0.0, y=0.0
private double speed=1.0, direction=0.0;
public String name;
public Ship(String name) {
this.name = name;
}
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) {
this(name, x, y);
this.speed = speed;
this.direction = direction;
}
//continue…
16
16
5
//(cont.)
private double degreeToRadian(double degrees) {
return(degrees * Math.PI / 180.0);
}
public void move() {
move(1);
}
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 + ").");
}
} //end of Ship class
17
17
Nội dung
1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyn tham s cho phương thc
4. Một số lp Nện ích trong Java
5. dụ và bài tập
19
19
2.1. Thành viên static
v r5;)* v9B9
§ q1, *&6#& 53"# HA#& *&'~#) /6 *&6#& 53"# *&9R, 5P 2.3
*'0#)
§ !&6#& 53"# *&9R, 5P /N% 2'0, 7&;3 H1L /6 4*;K,
v Cú pháp khai báo +&T)& B#6) V+9w-:
§ ,&3•B3#&•*F9Y•,;% static 73Z9•B9•/3Z9 tenBienv
v ML @J=
20
Ví dụ lớp JOptionPane trong javax.swing
v r&I1-$+L)&
v x&'()*$+&,-=
21
21
6
Ví dụ - sử dụng thuộc tính và phương thức
static lớp JOptionPane
JOptionPane.showMessageDialog(null,"Ban da thao
tac loi", "Thong bao loi",
JOptionPane.ERROR_MESSAGE);
JOptionPane.showConfirmDialog(null,"Ban co chac
chan muon thoat?", "Hay lua chon",
JOptionPane.YES_NO_OPTION);
22
22
Ví dụ - sử dụng thuộc tính và phương thức
static lớp JOptionPane (2)
v A:y?-+z{$;%w;)V$|$}$~A_~[$~7•i7€•~$‚]
v vA%w;)x9)?hV&;ƒA%w;)„#9C;*>)ICC[…i&9)$A_$@?$
w?%$+I-~[$~79)&$:9;~[$
vA%w;)x9)?h„€•‡rˆAxr‰Ai[$
vA%w;)x9)?hŠ•‹i‰iŒˆ!€•••Œ€[)ICC[;%w;)V[;%
w;)VzŽ{D]
23
23
2.1. Thành viên static (2)
v r&9Z$K•#$*#E$+5`$-89$01+$+&T)&$B#6)$static +5;)*$
01+$Kb#$+'Q)*$-89$CG%$Vl$+&9Z$K•#$*#E$+5`$-89$
+&T)&$B#6)$)TZ$-89$+•+$-.$-E-$Kb#$+'Q)*$3&E-$-89$
CG%$K/h
v 7E-$%&'()*$+&,-$static -&P$-/$+&H$+5IZ$-Y%$BT;$
-E-$+&I1-$+L)&$static BT$-&P$-/$+&H$*g#$-E-$
%&'()*$+&,-$static +5;)*$-F)*$CG%h
24
24
Ví d 1
25
class
TestStatic{
public static int
iStatic
;
public int
iNonStatic;
}
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);
}
}
25
7
Ví dụ 2
public class Demo {
int i = 0;
void tang(){ i++; }
public static void main(String[] args) {
tang();
System.out.println("Gia tri cua i la" +
i);
}
}
26
#L#4*;K,$=Z*&LB$*;#)WX$,;##L*$HZ$FZbZFZ#,ZB$bFL=$;$4*;K,$,L#*Z•
#L#4*;K,$5;F3;H/Z$3$,;##L*$HZ$FZbZFZ#,ZB$bFL=$;$4*;K,$,L#*Z•*
26
2.2. Thành viên hằng
v !1+ +&I1- +L)&%&'()* +&,- 3&j)* +&H +&9Z K•#
*#E +5`)1# @I)*$+5;)* eIE +5a)& VW @J)*h
v 7U %&E% 3&9# :E;=
chi_dinh_truy_cap final kieu_du_lieu
TEN_HANG = gia_tri;
v ML @J=
final double PI = 3.141592653589793;
public final int VAL_THREE = 39;
private final int[] A = { 1, 2, 3, 4, 5, 6 };
27
27
2.2. Thành viên hằng (2)
v r&j)*$+&'’)*$-E-$&“)*$Vb$C#6)$eI9)$Kf)$CG%$K'Q-$
3&9#$:E;$CT$static final )&“0$*#U%$+5IZ$-Y%$
@”$@T)*
28
28
Instance member vs. Class member
Thành viên đối tượng
v r&I1-$•)&‘%&'()*$
+&,-$-&P$K'Q-$+5IZ$-Y%$
+&j)*$eI9$đối tượng
v !"#$Kb#$+'Q)*$-/$1
bản sao riêng -89$N$
thuộc 6nh đối tượng
v Giá tr-89$N$+&I1-$
•)&$Kb#$+'Q)*$-89$-E-$
đối tượng khác nhau
CT$khác nhauh
Thành viên lớp
v Thuộc tính/phương
thức có thể được truy
cập thông qua lớp
v Các đối tượng có
chung 1 bản sao của
1 thuộc tính lớp
v Giá trị của 1 thuộc
tính lớp của các đối
tượng khác nhau
giống nhau.
29
29
8
Nội dung
1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyn tham s cho phương thc
4. Một số lp tin ích trong Java
5. dụ và bài tập
30
30
3. Truyền tham số cho phương thức
v 7/$+&H$VW$@J)*$:•+$3–$3#HI$@2$C#dI$)T;$-&;$+&90$
Vb$-89$%&'()*$+&,-$&;c-$-;)V+5I-+;5
§ e389$BC$/3D9$#)9Y"#$*&:Y
§ e389$BC$/3D9$*&;=$,&3?9^$=E#)$56$2.3$*'0#)
v ML$@J
31
public
Polygon polygonFrom(Point[] corners) {
// method body goes here
}
31
3. Truyn tham s cho phương thức (2)
v v9B9$+5IZk)$0g#$+&90$Vb$-&;$%&'()*$+&,-$@'G#$
@^)*$*#E$+5`$>%9VV:ZB9CI?D=$r5IZk)$*#E$+5`:.)$V9;$
-89$+&90$Vb$+&n-
§ Với tham s có kiu d liu tham tr (kiu d liu
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
§ Với tham s có kiu d liu tham chiếu (mng và đi
tượng): Truyền giá trị/bản sao của tham chiếu gốc
truyền vào
à r&9Z$K•#$+&90$Vb$&a)&$+&,-$3&j)*$CT0$.)&$&'t)*$
Kf)$+&90$Vb$+&n-
32
32
3.1. Với kiu d liu tham trị
v 7E-$*#E$+5`$)*IZ6)$+&8Z$3&j)*$+&H$+&9Z$K•#$3&#$
+5IZk)$)&'$01+$+&90$Vb
v x&'()*$+&,-$Vƒ9%$)TZ$-/$&;^+$K1)*$KU)*$3&j)*q
33
public void
swap(
int
var1,
int
var2) {
int
temp = var1;
var1 = var2;
var2 = temp;
}
33
9
3.2. Với kiu d liu tham chiếu
v Thực ra là truyền bản sao của tham chiếu gốc, chứ
không phải truyn tham chiếu gốc hoc truyn đối
tượng (pass the references by value, not the original
reference or the object)
v Sau khi truyền cho phương thức, đối tượng có ít nhất
2 tham chiếu
34
34
3.2. Với kiu d liệu tham chiếu-ví dụ 1
public class
Student {
private int
year;
private
String name;
public
Student(String name,
int
year) {
this
.year = year;
this
.name = name;
}
public int
getYear() {
return
year;
}
public void
setYear(
int
year) {
this
.year = year;
}
}
35
35
3.2. Với kiu d liệu tham chiếu-ví dụ 1
public class
Test {
public static void
change(Student std){
std.setYear(2000);
}
public static void
main(String[] args) {
Student std =
new
Student("Nam", 1990);
System.
out
.println(std.getYear());
change
(std);
System.
out
.println(std.getYear());
}
}
36
36
4.2. Với kiu d liệu tham chiếu-ví dụ 2
public class
Test {
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());
}
}
37
37
10
Ví dụ
public class
Point {
private double
x;
private double
y;
public
Point() { }
public
Point(
double
x,
double
y) {
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);
}
}
38
38
39
public class
Test {
public static void
tricky(Point arg1, Point arg2) {
arg1.setX(100); arg1.setY(100);
Point temp = arg1;
arg1 = arg2; arg2 = temp;
}
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();
}
}
39
v 7&P$-/$-E-$+&90$
-&#fI$-89$%&'()*$
+&,-$K'Q-$+5E;$K•#[$
-&,$3&j)*$%&.#$-E-$
+&90$-&#fI$*b-
40
40
3.3. Truyền số lượng tham số tùy ý
v m'Q- *g# CT varargsh$7U %&E%=
§ ten_phuong_thuc(Kieu_dl... ten_tham_so)
v ML @J N=
§ e&;3 H1L^
public PrintStream printf(String format,
Object... args)
§ -f Bg#)
System.out.printf ("%s: %d, %s\n",
name, idnum, address);
System.out.printf ("%s: %d, %s, %s, %s\n",
name, idnum, address, phone, email);
41
41
11
v ML @J O
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)
+ (corners[1].y - corners[0].y)
*(corners[1].y - corners[0].y) ;
lengthOfSide1 = Math.sqrt(squareOfSide1);
//create & return a polygon connecting the Points
}
v i&Y) RS+
§ corners 2'0, ,L3 #&' =R* =E#)
§ V&'(#) *&+, ,[ *&8 2'0, )T3 H‚#) ,1,& *F9YP# =R* =E#) &Ll,
=R* /Li* ,1, *&;= 4. *F9YP# 56L
42
42
Bài tập: Tính tổng số lượng các số nguyên
bất kỳ
public class
Test {
public static int
plus(
int
... arr) {
int
result = 0;
for
(
int
i : arr) {
result += i;
}
return
result;
}
public static void
main(String[] args) {
System.
out
.println(
plus
(1, 2, 3, 4, 5));
}
}
43
43
Nội dung
1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyn tham s cho phương thc
4. Một số lớp Eện ích trong Java
5. dụ và bài tập
44
44
4.1. Package trong Java
v x9-39*?$*#b)*$)&'$+&'$0J-$*#U%=$
§ $,&+,$56$1,$2o#&$5o$*Fz$/N%$B$B6#) $56$4f$Bg#)$,1,$/N %$
=R*$,1,&$%&@$&0%U
§ !F1#&$,&L$53D,$2l*$*"#$/N%$Ho$9#)$2R*$W*F@#)$*"#X
!"#$%&#'&()$'*"#$+*&,$#-$.*/$#*0&$#"#$12%$#-$#3+($.4+
§ …EL$5D$,1,$/N%_$BC$/3D9$56$%&'(#)$*&+,$}$=+,$FR#)$&(#$4L$
5N3$=.3$O9;#$&D$)3C;$,1,$/N%U
v !1+$%9-39*?$-˜)*$-/$+&H$-&,9$-E-$%9-39*?$3&E-
45
45
12
4.1. Package trong Java (2)
v r6)$KsZ$K8$-89$CG%$:9;$*<0$+6)$*/#$BT$+6)$CG%=
46
46
a. Tham chiếu giữa các lớp
v r5;)*$-F)*$N$%9-39*?=$W$@J)*$+6)$CG%
v _&E-$%9-39*?=$x&.#$-I)*$-•%$+6)$KsZ$K8$-&;$-E-$
CG%$K'Q-$K`)&$)*&™9$+5;)*$%9-39*?$3&E-h
v ML$@J=
47
public class
HelloNameDialog {
public static void
main(String[] args){
String result;
result = javax.swing.JOptionPane.
showInputDialog
("Hay nhap ten ban:");
javax.swing.JOptionPane.
showMessageDialog
(
null
,
"Xin chao "+ result + "!");
}
}
47
a. Tham chiếu giữa các lớp (2)
v Lệnh import:
§ Sử dụng lệnh import để khai báo các package hoặc
các lớp để khi sử dụng không cần nêu tên đầy đủ.
§ Ví dụ:
48
import
javax.swing.JOptionPane;
public class
HelloNameDialog {
public static void
main(String[] args){
String result;
result = JOptionPane.
showInputDialog
("Hay nhap ten ban:");
JOptionPane.
showMessageDialog
(
null
, "Xin chao "+ result + "!");
}
}
48
b. Các package trong Java
java.applet
java.awt
java.beans
java.io
java.lang
java.math
java.net
java.nio
java.rmi
java.security
java.sql
java.text
java.util
javax.accessibility
javax.crypto
javax.imageio
javax.naming
javax.net
javax.print
49
javax.rmi
javax.security
javax.sound
javax.sql
javax.swing
javax.transaction
javax.xml
org.ietf.jgss
org.omg.CORBA
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
org.xml
49
13
b. Các package trong Java (2)
v 7E-$%9-39*?$-($:.)$+5;)*$v9B9
§ java.lang
q9#)$,I%$,1,$/N%$,($HE#$,&L$*&3?*$7?$#)G#$#)C$/J%$*FA#&$†;5;
…;L$)‡=$ˆF;%%ZF$,/;44Z4_$-*F3#)$56$-*F3#)…9bbZF_$cHdZ,*_$UUU
‰=%LF*$#)M=$2o#&$56L$*I*$,E$,1,$/N%
§ java.util
…;L$)‡=$*J%$&0%$bF;=ZˆLF7_$=G$&A#&$4S$73D#_$B;*Z$*3=Z_$56$
#&3P9$*3D#$z,&$7&1,U
§ java.io
q9#)$,I%$7&E$#Š#)$56LtF;$&D$*&.#)$5N3$,1,$/9‡#)$BC$/3D9$56$
&D$*&.#)$b3/ZU
50
50
b. Các package trong Java (3)
v 7E-$%9-39*?$-($:.)$+5;)*$v9B9
§ java.math
q9#)$,I%$,1,$/N%$*&S,$*&3$,1,$%&‹%$*L1#$5N3$4.$#)9Y"#$56$,1,$
%&‹%$*L1#$*&J%$%&Œ#
§ java.sql
q9#)$,I%$,1,$•V‰$,&L$%&‹%$*F9Y$#&J%$56$•f$/Ž$BC$/3D9$2'0,$
/'9$*FC$*FL#)$=R*$#)9‡#$BC$/3D9$W*&'~#)$4f$Bg#)$,($4}$BC$
/3D9$O9;#$&DX
§ javax.swing
q9#)$,I%$,1,$/N%$56$)3;L$B3D#$,&L$%&‹%$*iL$F;$,1,$+#)$Bg#)$
2‡$&T;U
§
51
51
4.2. Các lớp bao (Wrapper class)
v 7E-$3#HI$@2$C#dI$)*IZ6)$+&8Z$3&j)*$-/$-E-$
%&'()*$+&,-$C#6)$eI9)$Kf)$)/h
v !"#$3#HI$@2$C#dI$)*IZ6)$+&8Z$-/$01+$CG%$+'()*$
,)*$*g#$CT$CG%$:9;=
§ 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 đó.
§ 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
52
52
4.2. Các lớp bao (2)
53
53
14
a. Chuyển đổi kiểu dữ liệu
v -f$Bg#)$toString() 28$,&9Y8#$,1,$)31$*Fo$4.$*&6#&$•Œ9U
v -f$Bg#)$<type>Value() 28$,&9Y8#$*•$2.3$*'0#)$,:;$/N%$
H;L$*&6#&$)31$*Fo$#)9Y"#$*&:Y$,:;$2.3$*'0#)$*'(#)$+#)
Float objF = new Float(“4.67”);
float f = objF.floatValue(); // f=4.67F
int i = objF.intValue(); //i=4
v -f$Bg#)$parse<type>() 56$valueOf() 28$,&9Y8#$•Œ9$
*&6#&$,1,$)31$*Fo$4.U
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
54
54
a. Chuyển đổi kiểu dữ liệu (2)
55
55
b. Các hằng số
56
v Boolean
§ "##$%&'()*+,-
§ "##$%&'(./0-
v Byte
§ 123%(45678*+0-
§ 123%(4*978*+0-
v Character
§ :'3(4*97/*;59
§ <=&>(4*978*+0-
§ :'3(4567/*;59
§ <=&>(45678*+0-
§ 0':<#?%(<$&@@:A<&B#'(<#'@3&'3@
v Double
§ ?#C1$%(4*978*+0-
§ ?#C1$%(45678*+0-
§ ?#C1$%(6&6
§ ?#C1$%(6-D*.58-756)565.E
§ ?#C1$%(FG,5.58-756)565.E
v Float
§ H#&3(4*978*+0-
§ H#&3(45678*+0-
§ H#&3(6&6
§ H#&3(6-D*.58-756)565.E
§ H#&3(FG,5.58-756)565.E
v Integer
§ :'3(45678*+0-
§ :'3(4*978*+0-
v Long
§ $#'I(45678*+0-
§ $#'I(4*978*+0-
v Short
§ @=#>3(45678*+0-
§ @=#>3(4*978*+0-
56
Ví dụ
double
d = (
new
Integer(Integer.MAX_VALUE)).
doubleValue();
System.out.println(d); // 2.147483647E9
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))
output = output * 10 + Character.digit(c, 10);
}
System.out.println(output);
57
// 123
57
15
4.3. Xâu (String)
v _#HI$•+5#)*$CT$01+$CG%$BT$3&j)*$%&.#$CT$3#HI$@2$C#dI$
)*IZ6)$+&8Z
v !1+$•+5#)*$K'Q-$+^;$+&T)&$+š$01+$@›Z$-E-$34$+n$)“0$
+5;)*$@•I$)&EZ$3S%=
String a = "A String";
String b = "";
v mb#$+'Q)*$•+5#)*$-/$+&H$3&t#$+^;$+&?;$)&#kI$-E-&=
String c = "A String";
String d = new String("Another String");
String e = null;
58
58
a. Ghép xâu
v r;E) +W œ$-/ +&H )b# -E- •+5#)*=
String a = "This" + " is a " + "String";
//a = “This is a String”
v 7E- 3#HI @2 C#dI -( :.) VW @J)* +5;)* C’# *g#
%5#)+C)>D$K'Q- -&IZH) K•# +n K1)* V9)*$3#HI •+5#)*
System.out.println("answer = " + 1 + 2 + 3);
System.out.println("answer = " + (1+2+3));
à •9#$-uI Cd)& +56) -/ #)$59$-F)* 01+ 3f+ eI.q
59
59
b. Các phương thức của xâu
String name = "Joe Smith";
name.toLowerCase(); // "joe smith"
name.toUpperCase(); // "JOE SMITH"
"Joe Smith ".trim(); // "Joe Smith"
"Joe Smith".indexOf('e'); // 2
"Joe Smith".length(); // 9
"Joe Smith".charAt(5); // 'm'
"Joe Smith".substring(5); // "mith"
"Joe Smith".substring(2,5); // "e S"
60
60
c. So sánh hai xâu
v oneString.equals(anotherString)
§ e38= *F; •#& *'(#) 2'(#)
§ !FE 5P true &Ll, false
v oneString.equalsIgnoreCase(anotherString)
§ e38= *F; e‘’>|$•‹* 2?# *S &L;_$*&'~#)
v -L$41#& oneString == anotherString 4“ )ŒY #&J%
#&‚#)
§ -L$41#& x$2.3 *'0#)
61
String name = "Joe";
if ("Joe".equals(name))
name += " Smith";
boolean same = "Joe".equalsIgnoreCase("joe");
61
16
c. So sánh hai xâu (2)
String s1 = new String(“Hello”);
String s2 = s1;
(s1==s2) *FE 5P *F9Z
String s1 = new String(“Hello”);
String s2 = new String(“Hello”);
(s1==s2) *FE 5P b;/4Z
62
Hello
s1
s2
Hello
s1
s2
Hello
62
d. Điểm đặc biệt của String
v _&t# +^; •+5#)*$+&?; O$-E-&=
§ |1# \$)31 *Fo /3*ZF;/
§ m@#) *L1# *f #Zˆ$We&G#) 7&9Y?# 7&z,& B@#)X
v ML @J=
§ -*F3#)$4*F\$u$j†;5;$34$‘L*jv$tt$‰=%/3,3*$,L#4*F9,KL#$O9;$4*F3#)$/3*ZF;/
5.67$85$9:;# '*&8 <"= 1> 7$?.68+($6)@)6)+#)$A> 9:;# '*B8 .C= 7$(8" .6D ?.68+($
18.)6&1$EF&A&$85$G=.E
§ -*F3#)$4*Fx$u$#Zˆ$-*F3#)Wj‰”=$,LL/jXv$tt$••%/3,3*$,L#4*F9,KL#$O9;$
*L1# *f #Zˆ$
5.6H$9:;# '*&8 <"= 1> 7$?.68+($6)@)6)+#)$A> 9:;# '*B8 .C= I,&$.="+ .J +)KL
v •+5#)*$C#+?59CV$K'Q- -&,9 +5;)* Ncommon poolh$
§ à q&L$%&‹% ,&3;$4– /'9 *FC ,1, -*F3#)$5N3 ,@#) #R3 B9#)$28 K?*
73D= HR #&NU
v •+5#)*$;:y?-+V$C'I +52 *#E +5` +5;)* &?9%[$3&j)* wf+ 3#d0
K'Q- :1 )&G
63
63
String Literal vs. String Object
v String s1 = "Hello"; // String literal
v String s2 = "Hello"; // String literal
v String s3 = s1; // same reference
v String s4 = new String("Hello"); // String object
v String s5 = new String("Hello"); // String object
64
64
d. Điểm đặc biệt của String (2)
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);
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);
65
65
17
4.4. StringBuffer
v •+5#)*$CT$3#HI$:•+$:#f)=$
§ —.3$*'0#)$7&G#)$*&;Y$2ƒ3$)31$*Fo$4;9$7&3$2'0,$*iL$F;$à q1,$
•Œ9$,:;$/N%$-*F3#)$2'0,$*&3?*$7?$28$7&G#)$*&;Y$2ƒ3$)31$*FoU
§ e&3$,1,$•Œ9$2'0,$)&‹%$#.3$5N3$#&;9$=R*$2.3$*'0#)$=N3$
2'0,$*iL$F;$28$/'9$*FC$7?*$O9E$à |&‹%$#.3$•Œ9$*&G#)$
*&'~#)$FI*$*.#$7‹=$5P$HR$#&NU
v •+5#)*žIpp?5$CT$3#HI$:#f)$K•#=$
§ —.3$*'0#)$,[$*&8$*&;Y$2ƒ3$)31$*Fo$4;9$7&3$2'0,$*iL$F;
66
66
4.4. StringBuffer (2)
67
v String s = new String(“hello”);
String t = s;
s = new String(“goodbye”);
67
4.4. StringBuffer (3)
68
v StringBuffer=
§ q9#)$,I%$,1,$2.3$*'0#)$•Œ9$,[$*&8$*&;Y$2ƒ3$)31$*Fo$à -f$Bg#)$
StringBuffer 7&3^
MN$9="+$#"#$'O$.N$.6=+($PQ,$#-$.*/$.*&R$9S8L$
T*8$PJ$1O$#"#$PQ,$UV.$#"#*$18+*$9V+(W$AX$YZ$+*:$9[#$Y\$18],$.)P.$.^$UV.$
.]%$_+L
§ q9#)$,I%$,1,$,($,&?$&3D9$O9E$&(#$,&L$53D,$•ŒY$BS#)_$)&‹%$#.3$
,1,$•Œ9^
`8]#$(*a%$+b8$PQ,$.*:c+($9:;#$#"#$.6d+*$<84+$YD#*$#*,R/+$5&+($.*N#$.*8$
.6=+($12%$?.68+(e,f)6
68
4.4. StringBuffer (4)
v rL)&$:#f)$K•#=$ifI$01+$Kb#$+'Q)*$:`$:#f)$K•#[$+&a$
+•+$-.$-E-$eI9)$&d$BG#$Kb#$+'Q)*$Vl$)&Y)$*#E$+5`$
0G#h
69
69
18
4.4. StringBuffer (5)
v ifI$+^;$RuI$$+&j)*$eI9$BŸ)*$Cc%$+&a$VW$@J)*$
StringBuffer
70
StringBuffer buffer = new StringBuffer(15);
buffer.append("This is ") ;
buffer.append("String") ;
buffer.insert(7," a") ;
buffer.append('.');
System.out.println(buffer.length()); // 17
System.out.println(buffer.capacity()); // 32
String output = buffer.toString() ;
System.out.println(output); // "This is a String."
70
4.5. Lớp Math
v y9B9hC9)*h!9+&$-I)*$-•%$-E-$+&T)&$%&s)$
V+9w-=
§ q1,$&‚#)$*L1#$&T,^
g&.*Lh
g&.*Lij
§ q1,$&6=$*L1#$&T,^
U&PW$U8+LLL
&<5W$k==6W$#)81l
5I6.W$%=KW$1=(W$)P%l
#=5W$58+W$.&+W$&#=5W$&58+W$&.&+l
6&+Y=U
71
71
4.5. Lớp Math (2)
v •sI$&f+$-E-$&T0$)&Y)$+&90$Vb$3#HI$
double BT$*#E$+5`$+5.$Bk$)*$-/$3#HI$
double
§ ˜z$Bg$^
Math.pow(Math.E,
Math.sqrt(2.0*Math.PI))
Hoặc:
Math.exp(Math.sqrt(2.0*Math.PI))
72
72
4.6. Lớp System
v y9B9hC9)*h•ZV+?0$-&,9$)&#kI$&T0$wd)$L-&$&2I$
@J)*
§ e38=$4L1*$56L$F;$W‰tcX$,&9™#
!"#$1,m+($j+%,.?.6)&U$inW$i68+.?.6)&U5$out A>$err 1>$#"#$.*,V#$
n+*$#o&$12%$?R5.)UL
!-$.*/$.*8p.$1q%$1C8$+*c$#"#$*>U$setIn()W$setOut() A>$
setErr()
§ arraycopy(): -;L$,&‹%$=E#)$&Ll,$*J%$,L#$5N3$&3D9$#Š#)$
,;LU
73
19
4.6. Lớp System (2)
v currentTimeMillis(): Tr v thi gian hin ti
theo millisecond
v exit(): Kết tc hoạt đng của Java Virtual
Machine
v gc(): u cu b thu gom rác hot đng
v Các phương thức liên quan đến thuộc _nh của hệ
thống: Lấy c tng `n thuộc _nh n phiên bản của
Java Run`me Environment version, thư mục cài đặt
Java,...
74
4.6. Lớp System (3)
import
java.util.Properties;
public class
PropertiesTest {
public static void
main(String[] args) {
System.
out
.println(System.
getProperty
("path.separator"));
System.
out
.println(System.
getProperty
("file.separator"));
System.
out
.println(System.
getProperty
("java.class.path"));
System.
out
.println(System.
getProperty
("os.name"));
System.
out
.println(System.
getProperty
("os.version"));
System.
out
.println(System.
getProperty
("user.dir"));
System.
out
.println(System.
getProperty
("user.home"));
System.
out
.println(System.
getProperty
("user.name"));
}
}
75
4.6. Lớp System (4)
76
Nội dung
1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyn tham s cho phương thc
4. Một số lp Nện ích trong Java
5. Ví dụ và bài tập
77
77
20
Bài tập 1
v r#f%$:T#$+Y%$O$-89$:T#$&g-$+5ưG-[$VW$@J)*$+&T)&$
B#6)$CG%$KH$-T#$Kc+$Kf0$Vb$Kb#$+'Q)*$-89$CG%$
i&9)M#?)$K'Q-$+^;$59$+^#$:•+$3–$+&’#$K#H0$)T;[$t$
:•+$3–$KuIh$7T#$Kc+$0#)&$&g9$-E-&$+&,-$VW$@J)*h
78
78
Bài tập 2
v 7T#$Kc+$%&'()*$+&,-[$KsI$BT;$CT$Vb$C'Q)*$:•+$3–$
-E-$Kb#$+'Q)*$CG%$i&9)M#?)[$KsI$59$CT$+•)*$C'()*$
-89$-E-$Kb#$+'Q)*$)TZh
79
79
Bài tập 3
v •W$@J)*$CG%$•ZV+?0$Kf0$+&’#$*#9)$%&S%$-1)*$RuI$
)&#kI$Cs)$BG#$•+5#)*[$BT$@F)*$%&'()*$+&,-$9%%?)@$
BG#$•+5#)*žI ?5$KH$V;$VE)&$&#dI$)\)*h
80
80

Preview text:

Nội dung 1. Chồng phương thức
Bài 5: Các kỹ thuật xây dựng
2. Thành viên ĐT và thành viên lớp
lớp và sử dụng đối tượng
3. Truyền tham số cho phương thức
4. Một số lớp tiện ích trong Java 5. Ví dụ và bài tập 1 2 1 2 Nội dung
Nhắc lại về phương thức
v Mỗi phương thức phải có một chữ ký riêng
v Chữ ký của phương thức bao gồm:
1. Chồng phương thức § Tên phương thức
2. Thành viên ĐT và thành viên lớp
§ Số lượng các đối số và kiểu của chúng
3. Truyền tham số cho phương thức
4. Một số lớp tiện ích trong Java 5. Ví dụ và bài tập 3 4 3 4 1
1.1. Chồng phương thức
1.1. Chồng phương thức (2)
v Chồng phương thức (Method Overloading): Các v Ví dụ 1:
phương thức trong cùng một lớp có thể trùng tên
§ Phương thức println() trong System.out.println() có 10 khai
nhưng chữ ký phải khác nhau:
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ố lượng tham số khác nhau số.
§ Nếu cùng số lượng tham số thì kiểu dữ liệu các tham số phải
§ Không cần sử dụng các tên khác nhau (chẳng hạn khác nhau
"printString“ hoặc "printDouble“) cho mỗi kiểu dữ liệu v Mục đích: muốn hiển thị.
§ Tên trùng nhau để mô tả bản chất công việc
§ Thuận Kệ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 5 6
1.1. Chồng phương thức (3)
Một số chú ý với chồng phương thức v Ví dụ 2:
v Các phương thức chỉ được xem xét là chồng khi
chúng thuộc cùng một lớp
v Chỉ nên sử dụng kỹ thuật này với các phương thức class MyDate {
có cùng mục đích, chức năng; tránh lạm dụng int year, month, day;
v Khi dịch, trình dịch căn cứ vào số lượng hoặc kiểu
public boolean setMonth(int m) { …}
public boolean setMonth(String s) { …}
dữ liệu của tham số để quyết định gọi phương } thức nào phù hợp. public class Test{
à Nếu không chọn được hoặc chọn được nhiều
public static void main(String args[]){
hơn 1 phương thức thì sẽ báo lỗi. MyDate d = new MyDate(); d.setMonth(9); d.setMonth(”September”); } } 7 8 7 8 2 Thảo luận Thảo luận
v Cho phương thức sau đây:
void prt(String s) { System.out.println(s); }
public double test(String a, int b)
void f1(char x) { prt("f1(char)"); }
v Hãy chọn ra các phương thức chồng cho phương thức
void f1(byte x) { prt("f1(byte)"); } trên:
void f1(short x) { prt("f1(short)"); }
1. void test(String b, int a)
void f1(int x) { prt("f1(int)"); }
2. public double test(String a)
void f1(long x) { prt("f1(long)"); }
3. private int test(int b, String a)
void f1(float x) { prt("f1(float)"); }
4. private int test(String a, int b)
void f1(double x) { prt("f1(double)"); }
5. double test(double a, int b)
v Điều gì xảy ra nếu thực hiện: 6. double test(int b) 5 à int § f1(5);
7. public double test(String a, long b) § char x=‘a’; f1(x); § byte y=0; f1(y);
§ float z = 0; f1(z);… 9 10 9 10 Thảo luận Ví dụ
void prt(String s) { System.out.println(s); } class MyClass {
void f2(short x) { prt("f3(short)"); }
public void myMethod(int a, long b) { }
void f2(int x) { prt("f3(int)"); }
public void myMethod(long a, int b) { // overloading
void f2(long x) { prt("f5(long)"); } }
void f2(float x) { prt("f5(float)"); } }
v Điều gì xảy ra nếu thực hiện: public class Test { § f2(5);
public static void main(String args[]) {
§ char x=‘a’; f2(x);
MyClass m = new MyClass(); § byte y=0; f2(y); §
m.myMethod(); // error do không có method phù hợp float z = 0; f2(z);
m.myMethod(9, 10); // error do có 2 phiên bản method phù hợp
v Điều gì xảy ra nếu gọi f2(5.5)? } }
Error: cannot find symbol: method f2(double) 11 12 11 12 3
1.2. Chồng phương thức khởi tạo Ví dụ
v Trong nhiều tình huống khác nhau cần khởi tạo public class BankAccount{
đối tượng theo nhiều cách khác nhau private String owner; private double balance;
v à Cần xây dựng các phương thức khởi tạo khác
public BankAccount(){owner = “noname”;}
nhau cho đối tượng theo nguyên lý chồng phương
public BankAccount(String o, double b){
thức (constructor overloading). 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 13 14 1.3. Từ khóa this Ví dụ
v Nhắc lại: Tự tham chiếu đến đối tượng hiện tại, sử dụng bên
trong lớp tương ứng với đối tượng muốn tham chiếu. public class Ship {
v Sử dụng thuộc tính hoặc phương thức của đối tượng thông qua
private double x=0.0, y=0.0 toán tử “.”, ví dụ:
private double speed=1.0, direction=0.0; public String name;
public class BankAccount{
public Ship(String name) { private String owner; this.name = name;
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 BankAccount() { this.setOwner(“noname”); }
public Ship(String name, double x, double y, double
speed, double direction) { this(name, x, y); } this.speed = speed;
v Gọi đến phương thức khởi tạo khác của lớp:
this.direction = direction; § }
this(danh_sach_tham_so); //neu co tham so //continue… 15 16 15 16 4 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 }
public void move(int steps) {

3. Truyền tham số cho phương thức
double angle = degreesToRadians(direction);
x = x + (double)steps*speed*Math.cos(angle);

4. Một số lớp Nện ích trong Java
y = y + (double)steps*speed*Math.sin(angle); } 5. Ví dụ và bài tập
public void printLocation() {
System.out.println(name + " is at (" + x + "," + y + ")."); } } //end of Ship class 17 19 17 19
2.1. Thành viên static
Ví dụ lớp JOptionPane trong javax.swing v Trong Java v Thuộc tính
§ Các thành viên bình thường là thành viên thuộc về đối tượng
§ Thành viên thuộc về lớp được khai báo là staKc
v Cú pháp khai báo thành viên stawc:
§ chi_dinh_truy_cap static kieu_du_lieu tenBien; v Ví dụ: v Phương thức: 21 20 21 5
Ví dụ - sử dụng thuộc tính và phương thức
Ví dụ - sử dụng thuộc tính và phương thức
static lớp JOptionPane
static lớp JOptionPane (2)
JOptionPane.showMessageDialog(null,"Ban da thao
v Object[] opwons = { "OK", "CANCEL" };
tac loi", "Thong bao loi",
JOptionPane.ERROR_MESSAGE);
v JOpwonPane.showOpwonDialog(nul ,“Nhan OK de wep tuc", "Canh bao", JOpwonPane.DEFAULT_OPTION,
JOpwonPane.WARNING_MESSAGE,nul ,opwons,op wons[0]);
JOptionPane.showConfirmDialog(null,"Ban co chac
chan muon thoat?", "Hay lua chon",
JOptionPane.YES_NO_OPTION); 22 23 22 23
2.1. Thành viên static (2) Ví dụ 1
v Thay đổi giá trị của một thành viên static trong class TestStatic{
một đối tượng của lớp sẽ thay đổi giá trị của public static int iStatic;
thành viên này của tất cả các đối tượng khác của public int iNonStatic; } lớp đó. public class TestS { v Các phương thức
public static void main(String[] args) {
static chỉ có thể truy cập vào
TestStatic obj1 = new TestStatic();
các thuộc tính static và chỉ có thể gọi các
phương thức static trong cùng lớp.
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); } } 24 25 24 25 6 Ví dụ 2
2.2. Thành viên hằng public class Demo {
v Một thuộc tính/phương thức không thể thay đổi int i = 0;
giá trị/nội dung trong quá trình sử dụng. void tang(){ i++; } v Cú pháp khai báo:
public static void main(String[] args) {
chi_dinh_truy_cap final kieu_du_lieu tang(); TEN_HANG = gia_tri;
System.out.println("Gia tri cua i la" + v Ví dụ: i);
final double PI = 3.141592653589793; }
public final int VAL_THREE = 39; }
private final int[] A = { 1, 2, 3, 4, 5, 6 };
non-staKc method tang() cannot be referenced from a staKc contex
non-staKc variable i cannot be referenced from a staKc context 26 27 26 27
2.2. Thành viên hằng (2)
Instance member vs. Class member
v Thông thường các hằng số liên quan đến lớp được
khai báo là static final nhằm giúp truy cập
Thành viên đối tượng Thành viên lớp dễ dàng v Thuộc •nh/phương v Thuộc tính/phương
thức chỉ được truy cập
thức có thể được truy
thông qua đối tượng cập thông qua lớp
v Mỗi đối tượng có 1 v Các đối tượng có
bản sao riêng của 1
chung 1 bản sao của
thuộc 6nh đối tượng 1 thuộc tính lớp
v Giá trị của 1 thuộc
v Giá trị của 1 thuộc
•nh đối tượng của các
tính lớp của các đối
đối tượng khác nhau
tượng khác nhau giống nhau. là khác nhau. 28 29 28 29 7 Nội dung
3. Truyền tham số cho phương thức
v 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 1. Chồng phương thức
§ Kiểu dữ liệu nguyên thủy
§ Kiểu dữ liệu tham chiếu: mảng và đối tượng
2. Thành viên ĐT và thành viên lớp v Ví dụ
3. Truyền tham số cho phương thức
4. Một số lớp tiện ích trong Java
public Polygon polygonFrom(Point[] corners) { // method body goes here 5. Ví dụ và bài tập } 30 31 30 31
3. Truyền tham số cho phương thức (2)
3.1. Với kiểu dữ liệu tham trị
v Java truyền mọi tham số cho phương thức dưới
v Các giá trị nguyên thủy không thể thay đổi khi
dạng giá trị (pass-by-value): Truyền giá trị/bản sao truyền như một tham số của tham số thực
v Phương thức swap này có hoạt động đúng không?
§ 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
public void swap(int var1, int var2) { int temp = var1; nguyên thủy truyền vào var1 = var2;
§ Với tham số có kiểu dữ liệu tham chiếu (mảng và đối var2 = temp; }
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 32 33 32 33 8
3.2. Với kiểu dữ liệu tham chiếu
3.2. Với kiểu dữ liệu tham chiếu-ví dụ 1
v Thực ra là truyền bản sao của tham chiếu gốc, chứ public class Student { private int year;
không phải truyền tham chiếu gốc hoặc truyền đối private String name;
tượng (pass the references by value, not the original
public Student(String name, int year) { reference or the object) this.year = year; this.name = name; } public int getYear() { return year; }
public void setYear(int year) { this.year = year;
v Sau khi truyền cho phương thức, đối tượng có ít nhất } } 2 tham chiếu 34 35 34 35
3.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ụ 2 public class Test { public class Test {
public static void change(Student std){
public static void change(Student std){ std.setYear(2000);
std = new Student("Hung", 1995); } }
public static void main(String[] args) {
public static void main(String[] args) {
Student std = new Student("Nam", 1990);
Student std = new Student("Nam", 1990);
System.out.println(std.getYear());
System.out.println(std.getYear()); change(std); change(std);
System.out.println(std.getYear()); }
System.out.println(std.getYear()); } } } 36 37 36 37 9 Ví dụ public class Test {
public static void tricky(Point arg1, Point arg2) { public class Point {
arg1.setX(100); arg1.setY(100); private double x; Point temp = arg1; private double y; arg1 = arg2; arg2 = temp; public Point() { } }
public static void main(String [] args) {
public Point(double x, double y) { Point pnt1 = new Point(0,0); this.x = x; Point pnt2 = new Point(0,0); this.y = y;
pnt1.printPoint(); pnt2.printPoint(); }
System.out.println(); tricky(pnt1, pnt2); public void setX(double x) {
pnt1.printPoint(); pnt2.printPoint(); this.x = x; } } } public void setY(double y) { this.y = y; } public void printPoint() {
System.out.println("X: " + x + " Y: " + y); } } 38 39 38 39
3.3. Truyền số lượng tham số tùy ý
v Được gọi là varargs. Cú pháp: v Chỉ có các tham
§ ten_phuong_thuc(Kieu_dl... ten_tham_so) chiếu của phương v Ví dụ 1: thức được tráo đổi, chứ không phải các § Khai báo: tham chiếu gốc
public PrintStream printf(String format, Object... args) § Sử dụng
System.out.printf ("%s: %d, %s\n", name, idnum, address);
System.out.printf ("%s: %d, %s, %s, %s\n",
name, idnum, address, phone, email); 40 41 40 41 10 v Ví dụ 2
Bài tập: Tính tổng số lượng các số nguyên
public Polygon polygonFrom(Point... corners) { bất kỳ
int numberOfSides = corners.length; public class Test {
double squareOfSide1, lengthOfSide1;
public static int plus(int... arr) {
squareOfSide1 = (corners[1].x - corners[0].x) int result = 0;
*(corners[1].x - corners[0].x)
+ (corners[1].y - corners[0].y) for (int i : arr) {
*(corners[1].y - corners[0].y) ; result += i;
lengthOfSide1 = Math.sqrt(squareOfSide1); }
//create & return a polygon connecting the Points return result; } } v Nhận xét
public static void main(String[] args) {
§ corners được coi như một mảng
System.out.println(plus(1, 2, 3, 4, 5));
§ 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 } 42 43 42 43 Nội dung 4.1. Package trong Java
v Package giống như thư mục giúp:
§ Tổ chức và xác định vị trí lớp dễ dàng và sử dụng các lớp 1. Chồng phương thức một cách phù hợp.
§ Tránh cho việc đặt tên lớp bị xung đột (trùng tên)
2. Thành viên ĐT và thành viên lớp
• Các package khác nhau có thể chứa các lớp có cùng tên
§ Bảo vệ các lớp, dữ liệu và phương thức ở mức rộng hơn so
3. Truyền tham số cho phương thức
với mối quan hệ giữa các lớp.
v Một package cũng có thể chứa các package khác
4. Một số lớp Eện ích trong Java 5. Ví dụ và bài tập 44 45 44 45 11
4.1. Package trong Java (2)
a. Tham chiếu giữa các lớp
v Trong cùng 1 package: Sử dụng tên lớp
v Tên đầy đủ của lớp bao gồm tên gói và tên lớp:
v Khác package: Phải cung cấp tên đầy đủ cho các
lớp được định nghĩa trong package khác. v Ví dụ: public class HelloNameDialog {
public static void main(String[] args){ String result;
result = javax.swing.JOptionPane.
showInputDialog("Hay nhap ten ban:");
javax.swing.JOptionPane.showMessageDialog (null, "Xin chao "+ result + "!"); } } 46 47 46 47
a. Tham chiếu giữa các lớp (2)
b. Các package trong Java v Lệnh import: •java.applet •javax.rmi •java.awt •javax.security
§ Sử dụng lệnh import để khai báo các package hoặc •java.beans •javax.sound
các lớp để khi sử dụng không cần nêu tên đầy đủ. •java.io •javax.sql § Ví dụ: •java.lang •javax.swing •java.math •javax.transaction •java.net •javax.xml •java.nio •org.ietf.jgss
import javax.swing.JOptionPane; •java.rmi •org.omg.CORBA public class HelloNameDialog { •java.security •org.omg.CosNaming
public static void main(String[] args){ •java.sql String result; •org.omg.Dynamic •java.text
result = JOptionPane.showInputDialog("Hay nhap ten ban:"); •org.omg.IOP •java.util
JOptionPane.showMessageDialog (null, "Xin chao "+ result + "!"); •org.omg.Messaging •javax.accessibility }
•org.omg.PortableInterceptor •javax.crypto }
•org.omg.PortableServer •javax.imageio
•org.omg.SendingContext •javax.naming
•org.omg.stub.java.rmi •javax.net •org.w3c.dom •javax.print •org.xml 48 49 48 49 12
b. Các package trong Java (2)
b. Các package trong Java (3)
v Các package cơ bản trong Java
v Các package cơ bản trong Java § java.lang § java.math
• Cung cấp các lớp cơ bản cho thiết kế ngôn ngữ lập trình Java
• Cung cấp các lớp thực thi các phép toán với số nguyên và các
• Bao gồm wrapper classes, String và StringBuffer, Object, . . phép toán thập phân
• Import ngầm định vào tất cả các lớp § java.sql § java.util
• Cung cấp các API cho phép truy nhập và xử lý dữ liệu được
• Bao gồm tập hợp framework, mô hình sự kiện, date time, và
lưu trữ trong một nguồn dữ liệu (thường sử dụng cơ sở dữ nhiều tiện ích khác. liệu quan hệ) § java.io § javax.swing
• Cung cấp khả năng vào/ra hệ thống với các luồng dữ liệu và
• Cung cấp các lớp và giao diện cho phép tạo ra các ứng dụng hệ thống file. đồ họa. § … 50 51 50 51
4.2. Các lớp bao (Wrapper class) 4.2. Các lớp bao (2)
v Các kiểu dữ liệu nguyên thủy không có các
phương thức liên quan đến nó.
v Mỗi kiểu dữ liệu nguyên thủy có một lớp tương ứng gọi là lớp bao:
§ 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 đó.
§ 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 52 53 52 53 13
a. Chuyển đổi kiểu dữ liệu
a. Chuyển đổi kiểu dữ liệu (2)
v Sử dụng toString() để chuyển các giá trị số thành xâu.
v 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

v Sử dụng parse() 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
54 55 54 55 b. Các hằng số Ví dụ
double d = (new Integer(Integer.MAX_VALUE)). doubleValue(); v Boolean v Float § Boolean FALSE § float MAX_VALUE
System.out.println(d); // 2.147483647E9 § Boolean TRUE § float MIN_VALUE v Byte § float NaN § byte MIN_VALUE § float NEGATIVE_INFINITY String input = "test 1-2-3"; § byte MAX_VALUE § float POSITIVE_INFINITY int output = 0; v Character v Integer § int MAX_RADIX § int MIN_VALUE for (int index=0;index§ char MAX_VALUE § int MAX_VALUE § int MIN_RADIX char c = input.charAt(index); § char MIN_VALUE v Long §
Unicode classificaBon constants § long MIN_VALUE if (Character.isDigit(c)) v Double § long MAX_VALUE
output = output * 10 + Character.digit(c, 10); § double MAX_VALUE v Short § double MIN_VALUE } § short MIN_VALUE § double NaN § short MAX_VALUE § double NEGATIVE_INFINITY
System.out.println(output); // 123 § double POSITIVE_INFINITY 56 57 56 57 14 4.3. Xâu (String) a. Ghép xâu
v Toán tử + có thể nối các String:
v Kiểu String là một lớp và không phải là kiểu dữ liệu
String a = "This" + " is a " + "String"; nguyên thủy
//a = “This is a String”
v Một String được tạo thành từ một dãy các ký tự nằm
v Các kiểu dữ liệu cơ bản sử dụng trong lời gọi trong dấu nháy kép:
println() được chuyển đổi tự động sang kiểu String String a = "A String";
System.out.println("answer = " + 1 + 2 + 3); String b = "";
System.out.println("answer = " + (1+2+3));
v Đối tượng String có thể khởi tạo theo nhiều cách: String c = "A String";
à Hai câu lệnh trên có in ra cùng một kết quả?
String d = new String("Another String"); String e = null; 58 59 58 59
b. Các phương thức của xâu c. So sánh hai xâu String name = "Joe Smith";
v oneString.equals(anotherString) name.toLowerCase(); // "joe smith"
§ Kiểm tra •nh tương đương String name = "Joe"; name.toUpperCase(); // "JOE SMITH"
§ Trả về true hoặc false if ("Joe".equals(name)) "Joe Smith ".trim(); // "Joe Smith" name += " Smith";
"Joe Smith".indexOf('e'); // 2
v oneString.equalsIgnoreCase(anotherString) "Joe Smith".length(); // 9
§ Kiểm tra KHÔNG xét đến ký tự hoa, thường "Joe Smith".charAt(5); // 'm'
"Joe Smith".substring(5); // "mith"
boolean same = "Joe".equalsIgnoreCase("joe");
"Joe Smith".substring(2,5); // "e S"
v So sánh oneString == anotherString sẽ gây nhập nhằng § So sánh 2 đối tượng 60 61 60 61 15
c. So sánh hai xâu (2)
d. Điểm đặc biệt của String
v Khởi tạo String theo 2 cách:
String s1 = new String(“Hello”); § Gán 1 giá trị literal String s2 = s1; s1
§ Dùng toán tử new (Không khuyến khích dùng)
(s1==s2) trả về true Hello v Ví dụ:
§ String str1 = "Java is Hot"; // Implicit construcKon qua string literal s2
• str1 is được khai báo là 1 String reference và được khởi tạo 1 giá trị String
String s1 = new String(“Hello”); literal "Java is Hot"
§ String str2 = new String("I'm cool"); // Explicit construcKon qua
String s2 = new String(“Hello”); toán tử new
(s1==s2) trả về false
• str2 được khai báo là 1 String reference và được khởi tạo qua toán tử new. s1 Hello
v String literals được chứa trong 1common pool.
§ à Cho phép chia sẻ lưu trữ các String với cùng nội dung để Kết kiệm bộ nhớ. s2 Hello
v String objects lưu trữ giá trị trong heap, không wết kiệm được bộ nhớ 62 63 62 63
String Literal vs. String Object
d. Điểm đặc biệt của String (2)
v String s1 = "Hello"; // String literal
String s1 = new String("test");
v String s2 = "Hello"; // String literal String s2 = "test";
v String s3 = s1; // same reference
String s3 = String.valueOf("test");
v String s4 = new String("Hello"); // String object
System.out.println(s1==s2); v
System.out.println(s1==s3);
String s5 = new String("Hello"); // String object
System.out.println(s2==s3);
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);
64 65 64 65 16 4.4. StringBuffer 4.4. StringBuffer (2)
v String là kiểu bất biế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ị.
§ 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ớ.
v StringBuffer là kiểu biến đổi:
§ Đối tượng có thể thay đổi giá trị sau khi được tạo ra v
String s = new String(“hello”); String t = s;
s = new String(“goodbye”);
66 67 66 67 4.4. StringBuffer (3) 4.4. StringBuffer (4)
v Tính biến đổi: Nếu một đối tượng bị biến đổi, thì
tất cả các quan hệ với đối tượng sẽ nhận giá trị v StringBuffer: mới.
§ Cung cấp các đối tượng xâu có thể thay đổi giá trị à Sử dụng StringBuffer khi:
• Dự đoán các ký tự trong xâu có thể thay đổi.
• 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 _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:
• 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 68 69 68 69 17 4.4. StringBuffer (5) 4.5. Lớp Math
v Nếu tạo xâu thông qua vòng lặp thì sử dụng StringBuffer
v java.lang.Math cung cấp các thành phần stawc:
StringBuffer buffer = new StringBuffer(15); § Các hằng toán học:
buffer.append("This is ") ; • Math.E
buffer.append("String") ; • Math.PI buffer.insert(7," a") ; § Các hàm toán học: buffer.append('.'); • max, min. .
System.out.println(buffer.length()); // 17 • abs, floor, ceil…
System.out.println(buffer.capacity()); // 32 • sqrt, pow, log, exp…
String output = buffer.toString() ;
• cos, sin, tan, acos, asin, atan…
System.out.println(output); // "This is a String." • random 70 71 70 71 4.5. Lớp Math (2) 4.6. Lớp System
v java.lang.System chứa nhiều hàm wện ích hữu dụng
v Hầu hết các hàm nhận tham số kiểu
§ Kiểm soát vào ra (I/O) chuẩn
double và giá trị trả về cũng có kiểu
• Các luồng InputStream in, PrintStreams out và err là các thuộc double nnh của lớp System. § Ví dụ :
• Có thể thiết lập lại nhờ các hàm setIn(), setOut() và setErr()
§ arraycopy(): Sao chép mảng hoặc tập con với hiệu năng cao. Math.pow(Math.E, Math.sqrt(2.0*Math.PI)) Hoặc:
Math.exp(Math.sqrt(2.0*Math.PI)) 72 72 73 18 4.6. Lớp System (2) 4.6. Lớp System (3)
v currentTimeMillis(): Trả về thời gian hiện tại import java.util.Properties; theo mil isecond public class PropertiesTest {
v exit(): Kết thúc hoạt động của Java Virtual
public static void main(String[] args) { Machine
System.out.println(System.getProperty("path.separator"));
v gc(): Yêu cầu bộ thu gom rác hoạt động
System.out.println(System.getProperty("file.separator"));
System.out.println(System.getProperty("java.class.path"));
v Các phương thức liên quan đến thuộc _nh của hệ
System.out.println(System.getProperty("os.name"));
thống: Lấy các thông `n thuộc _nh như phiên bản của
System.out.println(System.getProperty("os.version"));
Java Run`me Environment version, thư mục cài đặt
System.out.println(System.getProperty("user.dir")); Java,...
System.out.println(System.getProperty("user.home"));
System.out.println(System.getProperty("user.name")); } } 74 75 4.6. Lớp System (4) Nội dung 1. Chồng phương thức
2. Thành viên ĐT và thành viên lớp
3. Truyền tham số cho phương thức
4. Một số lớp Nện ích trong Java
5. Ví dụ và bài tập 77 76 77 19 Bài tập 1 Bài tập 2
v Tiếp bài tập 2 của bài học trước, sử dụng thành
v Cài đặt phương thức, đầu vào là số lượng bất kỳ
viên lớp để cài đặt đếm số đối tượng của lớp
các đối tượng lớp NhanVien, đầu ra là tổng lương
NhanVien được tạo ra tại bất kỳ thời điểm nào, ở
của các đối tượng này.
bất kỳ đâu. Cài đặt minh họa cách thức sử dụng. 78 79 78 79 Bài tập 3
v Sử dụng lớp System đếm thời gian phép cộng xâu
nhiều lần với String, và dùng phương thức append
với StringBuffer để so sánh hiệu năng. 80 80 20