lO MoARcPSD| 45467232
ÔN TP CUI K MÔN LP TRÌNH ỚNG ĐI TƯỢNG
Mc lc
Bài 1: Tổng quan v OOP...................................................................................................... .......3
Bài 2: Cơ bản về Java và UML....................................................................................................4
Bài 3: Trừu tượng hóa và đóng gói..............................................................................................4
1. Trừu tượng hóa.....................................................................................................................4
2. Đóng gói (Encapsulation).....................................................................................................6
Bài 4+5: Đi tượng (Object) và Lớp (Class)...............................................................................6
1. Khởi tạo và s dng đi tượng..............................................................................................6
2. Nạp chồng phương thức (Overloading).................................................................................7
3. Tnh viên ca đi tượng và thành vn ca lớp (Tkhóa static và final)............................8
4. Truyn số lượng tham sy ý vào một method...................................................................9
Bài 6: Kết tp và kế tha............................................................................................................10
1. Skết tập (Aggregation).....................................................................................................10
2. Kế thừa (Inheritance)..........................................................................................................10
Bài 7: Một s k thut trong kế thừa.........................................................................................12
1. Quy tắc ghi đè (Overriding).................................................................................................12
2. Lớp trừu tượng (abstract class)...........................................................................................13
3. Interface (Giao diện)...........................................................................................................13
Bài 8: Đa nh..............................................................................................................................14
1. Upcasting và Downcasting..................................................................................................14
2. Đa hình (Polymorphism).....................................................................................................16
Bài 9: Lập trình tổng quát..........................................................................................................16
1. Định nghĩa và sdng Template........................................................................................16
2. Java Collections Framework...............................................................................................17
2.1. Các Interfa ce con kế thừa Interface Collection.........................................................18
2.2. Các lớp thc thi giao diện Collection........................................................................19
2.3. Giao diện iterator và comparator..............................................................................19
3. tđi diện ? (Wildcard)................................................................................................20
Bài 10: Ngoại l và xử lý ngoi l...............................................................................................21
1. Xử lý ngoi l trong Java....................................................................................................21
1.1. Khối try/catch...........................................................................................................21
1.2. Cây phân cấp ngoại lệ...............................................................................................21
1.3. Khối try….catch lồng nhau.......................................................................................22
1.4. Khối finally...............................................................................................................22
lO MoARcPSD| 45467232
2. Ủy nhim ngoi l...............................................................................................................22
3. To ngoi l t đnh nghĩa..................................................................................................23
Bài 11: Lập trình giao din vi JavaFx.....................................................................................23
Bài 12: Pn ch thiết kế hướng đi tượng biu đ lp......................................................25
1. Phương pháp OOAD (phân tích thiết kế ớng đi tượng)................................................25
2. Biểu đ lớp..........................................................................................................................25
Bài 1: Tng quan v OOP
Alan Kay đã tổng hợp các đc tính ca LT HĐT:
1. Tất c đu là đi tưng
2. Chương trình phn mềm có thể coi là một tp hợp các đi tượng tương tác với nhau
3. Mỗi đi tượng trong ctr có các d liu đc lp ca mình và chiếm bộ nh riêng ca
mình.
4. Mỗi đi tượng đu có dng đặc trưng của lp các đối tượng đó
5. Tất c các đi tượng thuộc v cùng một lớp đu các nh vi ging nhau
ớng đi tượng: objects + messages = Program (Đối tượng + Thông điệp = Chương
trình)
Các nguyên cơ bn ca OOP
Trừu tượng hóa (abstract)
Là quá trình loi bỏ đi các thông tin/tính cht cth và giữ li những thông
tin/tính cht chung.
Tp trung vào các đc điểm cơ bn của thực thể, các đặc điểm phân biệt nó vi
các loại thực thể khác.
lO MoARcPSD| 45467232
Đóng gói (Encapsulation)
Che giấu, n đi chi tiết thực hiện bên trong
Cung cp cho thế giới bên ngoài một giao diện
Kế thừa (Inheritance)
Lớp con kế thừa các tính chất của lớp cha : extends, implements
Đa hình (Polymorphism)
Overriding, Overloading, Up-casting, Down-casting
Ngôn nglp trình Java
m 1991, James Gosling viết ra Oak. m 1995, Oak đổi n thành Java
Write once, run everywhere Viết một lần, chạy mọi nơi”.
Code Java (file .java) chcn viết một lần và được biên dch thành Bytecode (file
.class). Bytecode có thể chy trên bt k nn tảng nào chcn cói đt y ảo
Java (thông dch bởi JVM Java Virtual Machine).
Tính năng của Java
Đơn giản, hướng đối tượng và quen thuộc.
Mạnh m và an toàn.
Kiến trúc trung lập và di đng. Thực thi với hiệu sut cao.
Thông dịch, đa luồng và đng.
Dễ sdng cho người dùng Java.
Bài 2: Cơ bn v Java UML
Mt s chú ý v kiu d liu trong Java:
Giá tr hng Literal gm 5 loi: integer (7); floating point (7.0f); boolean (true);
character (‘A’); string (“A”)
Kiu d liu long kết thúc là L (ví d long lg = 26L; ) float kết thúc là f/F (ví d: 7.0f)
double kết thúc là d/D (7.0D) nếu s thc không có kết thúc mặc định là double
Ép kiu d liu: mặc định ép kiu t hp lên rng, t rng
v hp cn ép kiu tường minh (ví d: int a, b; short c; khi
đó : a = b + c; c = (short) a; )
float f = 12.35; // o li do 12.35 là hng s double
( sa: float f = (float) 12.35 )
long lg = 999999999999; // Báo li: integer number
too large (vượt quá phm vi ca integer nên ko th
ép kiu n thành long) (sa: long lg =
999999999999L; )
System.out.println(“Hello\b\b\bWorld”); HeWorld
System.out.print("Hello\rWorld"); World
Th t ưu tiên của toán t
[] . () x++, x-- ++x, --x, +x, -x khi tạo (new) nhân chia, cng, tr dịch bit
so sánh hơn, ss bằng → &(AND), ^(OR), | (XOR),
lO MoARcPSD| 45467232
Mảng (trong thư vin java.util.Arrays)
Khai báo
Type_data[] name_array = new type_data[ size ];
Type_data name_array[] = new type_data[ size ];
Type_data[] name_array = { danh_sach_gia_tri };
Các hàm thao tác mng: arr.length Arrays.equals(arr1, arr2)
Arrays.sort(arr) Arrays.toString(arr) Arrays.binarySearch(arr, value)
Arrays.copyOf(arr, number_elements) Arrays.fill(arr, value)
u đồ lp (class diagram) trong UML (Unified Modeling Language ngôn ng
hình hóa đưc thng nht) *
https://monhoc.weebly.com/uploads/1/6/9/3/16936172/lab02.pdf Chi tiết xem ti Bài 12
phn 2 : Biểu đồ lp Cách đc UML class diagram:
https://codegym.vn/blog/2022/02/17/cach-doc-uml-class-
diagram/
Bài 3: Trừu tượng hóa đóng gói
1. Trừu tượng hóa
Tru tượng hóa là quá trình loi b đi các thông tin ít quan trng và gi li nhng thông
tin quan trọng, có ý nghĩa.
Lp (Class) là cách phân loại các đối tượng da tn đặc điểm chung của các đối tượng
đó. Lớp chính là kết qu ca quá trình trừu tượng hóa d liu. Lớp định nghĩa mt kiu
d liu mi, trừu tượng hóa mt tập các đối tượng. Một đối tượng gi là mt th hin
ca lp. Lp gm các phương thc thuc tính chung của các đối tượng cùng mt
loi.
Lp s gm có 3 thành phn: tên lp, các thuộc tính, các phương thc
Ví d: public class sinhVien { // name_class private String name;
//attribute_class public String getName() { //method_class return this.name;
}
public / private / protected / default (none) dùng đ th hin phm vi s dng
lO MoARcPSD| 45467232
package(gói) dùng để nhóm các lp liên quan vi nhau package name_package;
đưc đặt đầu ca mỗi class package đó cha
Lp trừu tượng (abstract class)
Gi s chúng ta có mt h thng qun hình hc, và chúng ta mun to ra mt lp tru
ợng Shape để biu din các hình học khác nhau như hình vuông, nh ch nht và hình
tròn.
Trong d tn, lớp Shape được khai báo lp trừu tượng bng cách s dng t khóa
abstract. định nghĩa hai phương thc trừu tượng calculateArea()
calculatePerimeter() mà không cung cp trin khai c th cho chúng.
y gi, chúng ta có th to các lp con t lớp Shape để trin khai các phương thc tru
ng theo cách rng bit cho tng hình hc c th:
2. Đóng gói (Encapsulation)
Đóng gói (encapsulation) là cho phép che giu thông tin và hành vi bên trong một đối
ng, và ch tiết l các phương thc và thuộc tính công khai (public) để tương tác vi
đối tượng đó. Đóng gói giúp bo v và duy trì tính toàn vn của đối tượng, bo v tính
toàn vn và bo mt ca d liu, đồng thi ẩn đi các chi tiết cài đặt và trin khai c
th.
Sau khi đóng gói, mt đối tượng có hai khung nhìn:
n trong: Chi tiết v các thuc tính và các phương thc
ca lp tương ng với đối tượng
n ngoài: Các dch v mà một đối tượng có th cung cp
cách đối tượng đó tương tác vi phn còn li ca h
thng
Che giu d liu: D liệu đưc che giu bên trong lp bng ch gán phm vi truy
cp private. D liu ch th đưc truy cp t các phương thức bên trong lp. Các
đối tượng khác mun truy nhp vào d liu riêng tư này phải thông qua c phương
thc ca lp có phm vi truy cp public (getter ly DL and setter cp nht DL).
lO MoARcPSD| 45467232
Trong ví d bên, thuộc tính name và age được khai
báo là
private, ch có th truy cp t bên trong lớp Person. Điu này giúp che giu thông tin
chi tiết v tên và tui ca một Person và đảm bo rằng các thay đổi trong các thuc
nh này ch có th đưc thc hin thông qua các phương thc công khai (getName(),
setName(), getAge(), setAge()).
Bài 4+5: Đối tượng (Object) và Lp (Class)
1. Khi to s dụng đối tượng
Có hai phương thc khi tạo đối tượng (Constructor) trùng tên vi Class
Phương thức khi to mặc định (Phương thc khi to không tham s)
Phương thức khi to có tham s
Khai báo đối tượng
Cú pháp: name_class name_ object = new name_class(....................);
Ví d: Person person1 = new Person();
Person person2 = new Person(“Trinh Van Hau”, 20);
Dùng toán t . để s dng các phương thc và thu ca d liu
nguyên thy đưc ghi trc tiếp trong Stack.
Giá tr của đối tượng đưc khi to bi toán t new đưc ghi trong Heap.
So sánh hai d liu kiu nguyên thy th s dng toán t ==. Tuy nhiên, nếu
so sánh hai đối tượng dùng “== s đưa ra kết qu sai lch, vì thế cn s dng
equals”. c đối tượng Integer, Double, String đã được xây dng sn equals, các
đối tượng khác do người dùng t to cn phi to method “equals”.
Ví d: Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1 == n2); // false
System.out.println(n1.equals(n2)); // true
Code ví d cho class Person: https://onlinegdb.com/sfKxVCFDJ
lO MoARcPSD| 45467232
2. Np chồng phương thức (Overloading)
Chồng phương thức (Method Overloading): c phương thc trong cùng mt lp
th trùng tên nhưng chữ phi khác nhau: (ví d constructor phía tn)
S ng tham s khác nhau
Nếu cùng s ng tham s thì kiu d liu các tham s phi khác nhau
Mục đích:
n trùng nhau để mô t bn cht công vic
Thun tin cho lp trình vì không cn phi nh quá nhiu tên phương thc
mà ch cn nh mt tên và la chn các tham s cho phù hp.
Mt s chú ý v overloading
Vi method: public void prin(float
x)
{ System.out.println(x)); }. Khi gi prin(5.5) s báo li 5.5 là kiu
double, cn to method prin overload
cho kiu double: public void prin(double x)
{System.out.println(x)); }
class MyClass {
public void myMethod(int a, long b) {
}
public void myMethod(long a, int b) { // overloading }
}
public class Test { public static void main(String args[])
{
MyClass m = new MyClass();
m.myMethod(); // error do không có method
phù hp
m.myMethod(9, 10); // error do có 2 phiên bn
method phù hp
}
}
3. Tnh viên của đốing thành viên ca lp (T khóa static final)
Trong Java, t khóa static đưc s dụng đ ch ra rng mt thành phn ca lp (thuc tính,
phương thc hoc khi) thuc v lp ch không thuc v mỗi đối tượng c th ca lớp đó. Điu
này nghĩa là, c tnh phần static được chia s gia tt c các đối tượng ca lp và th
đưc truy cp mà kng cn to một đi tượng t lp đó.
Thuc tính static (Static Fields): Thuc tính static là mt biến đưc chia s gia tt c
các đối tượng ca lp. Mt thuc tính static ch đưc khai báo mt ln và giá tr ca
nó được duy trì nguyên vn trong sut thi gian chạy chương trình.
lO MoARcPSD| 45467232
https://onlinegdb.com/08LNfXlEZ
Phương thức static (Static method): Phương thc static thuc v lp ch không thuc
v các đối tượng ca lp. Chúng có th đưc gi trc tiếp t lp mà không cn tạo đối
ng t lớp đó.
Ví d:
public class MathUtils {
public static int sum(int a, int b) { // Phương thc static
return a + b;
}
}
int result = MathUtils.sum(3, 5);
System.out.println(result); // Kết qu: 8
Thay đổi giá tr ca mt thành viên static trong một đối tượng ca lp s thay đổi giá
tr ca thành vn này ca tt c các đối tượng khác ca lp đó.
Các phương thức static ch th truy cp vào các thuc nh static và ch th gi
các phương thc static trong cùng lp.
Trong Java, t khóa final đưc s dụng để ch ra rng mt thành phn (biến, phương thc hoc
lp) không th thay đổi sau khi được khi to hoc định nghĩa.
Biến final: Mt biến final là mt biến không th thay đổi giá tr sau khi được khi to.
Điu này có nghĩa là mt ln gán giá tr duy nhất được thc hin và không th thay đi
sau đó.
lO MoARcPSD| 45467232
Trong ví d trên, biến MAX_VALUE mt biến final được khai báo trong lp
Constants. Sau khi gán giá tr cho MAX_VALUE, giá tr này không th thay đổi. Biến
final thường được s dụng đ định nghĩa các hng s trong chương trình.
Phương thc final: Một phương thc final không th b ghi đè (override) bi c lp
con. Khi một phương thức đưc khai báo là final trong lp gc, các lp con không th
thay đổi hoc m rộng phương thức đó.
lớp final đó.
S dng kết hp statisc và final: giá tr hng s th truy cp trc tiếp t class mà
không cn tạo đối tượng của class đó.
4. Truyn s ng tham s tùy ý vào mt method
Java truyn mi tham s cho phương thức dưới dng giá tr (pass-byvalue): Truyn giá
tr/bn sao ca tham s thc. Có th truyn s ng tham s tùy ý, được gi varargs
lO MoARcPSD| 45467232
Cú pháp: [public] [static] return_type name_method (type_data … parameter) {..}
Bài 6: Kết tp kế tha
1. S kết tp (Aggregation)
Kết tp (aggregaton): Tạo ra các đối tượng ca các lp sn trong lp mi, là thành
viên ca lp mi. Kết tp tái s dng c thành phn d liu và các hành vi ca lp thành
phần thông qua đối tượng thành phn. Lp mi gi lp toàn th, lp gi lp
thành phn.
Ví d: mt t giác là s kết tp ca bốn điểm
Biu din kết tp trong UML
S dng "hình thoi" tại đầu ca lp toàn th
S dng bi s quan h (multiplicity) tại 2 đu: 1 s nguyên dương: 1, 2,... // Dải s (0..1,
2..4) //*: Bt k s nào // Không có: Mặc định là 1
n vai t(rolename): Nếu không tmặc định tên ca lp (b viết hoa ch cái
đu)
2. Kế tha (Inheritance)
Kế tha (Inherit, Derive) to lp mi bng cách phát trin lp đã có. Lớp mi kế tha
những đã trong lớp cũ và phát trin những tính năng mi, chi tiết hóa cho phù hp
vi mục đích s dng mi
Lớp cũ : Lớp cha (parent, superclass), lp cơ s (base class)
Lp mi: Lp con (child, subclass), lp dn xut (derived class)
Biu din kế tha trong UML s dụng đưng thẳng mũi tên tam giác rng
Ngun lý kế tha
Ch đnh truy cp protected
Thành vn protected trong lớp cha được truy cp trong:
Các thành viên l p cùng
thuc 1 package vi l p con có th kế tha đưc ?
lO MoARcPSD| 45467232
Kế tha được các thành vn được khai báo là public và protected ca lp cha.
Không kế thừa đưc các thành viên private.
Các thành viên có ch định truy cp mặc đnh nếu lp cha cùng gói vi lp con
publ ic
protec
ted
default(n
one)
priva
te
Cùng lp cha
YES
YES
YES
YES
Lp con cùng gói vi lp cha
YES
YES
YES
NO
Lp con khác gói vi lp cha
YES
YES
NO
NO
Khác gói, không kế YES NO NO NO
tha
ế tha trên Java: <Lp con> extends <Lớp cha> { …. } Lớp cha nếu được đnh
nghĩa là final thì không th có lp dn xut/kế tha t nó.
Ví d: class HinhVuong extends TuGiac { ......................... }
Khi to (constructor) ca lp con
động gi constructor mặc định ca lp cha (nếu có)
nh đầu tn trong phương thc khi to ca lp con gọi phương thức khi
to ca lp cha super(Danh_sach_tham_so);
Điu này là bt buc nếu lớp cha không có phương thc khi to mặc định
Đã viết phương thức khi to ca lp cha vi mt s tham s
Phương thức khi to ca lp con không bt buc phi có tham s.
lO MoARcPSD| 45467232
Và còn có th truy cp thuc tính ca lp cha: T khóa
super cũng có th đưc s dụng để truy cp thuc tính
ca lp cha t lp con. Điu này cho phép lp con truy
cp và s dng các thuc tính ca lp cha mà không
cần định nghĩa lại chúng. ví d bên, super(value) là
đang gọi đến phương thc khi to (constructor)
lp cha. // super(list_para);
Bài 7: Mt s k thut trong kế tha
1. Quy tc
ghi đè
(Overriding)
Phương thức ghi đè trong lp con phi
Có danh sách tham s ging hệt phương thức kế tha trong lp cha.
Có cùng kiu tr v vi phương thức kế tha trong lp cha
lO MoARcPSD| 45467232
Có ch đnh truy cp không gii hn cht hơn phương thức trong lp cha. Ví d, nếu
ghi đè một phương thức protected, tphương thc mi có th protected hoc
public, mà không được là private
Không được phép ghi đè:
Các phương thc static trong lp cha
Các phương thc private trong lp cha
Các phương thc hng (final) trong lp cha
Nếu biết trước s không định nghĩa lại phương thc ca lớp s thì nên dùng t khóa
final đi với phương thc. Mc đích nhằm đm bảo tính đúng đắn và tính hiu qu
Ví d: public final String baseName () { return
“Person”;
}
2. Lp tru tượng (abstract class)
ặc điểm ca lp trừu tượng
Không th to đốing trc tiếp t các lp trừu tượng
Thưng lp trừu tượng được ng để định nghĩa các "khái nim chung", đóng vai t
làm lp cơ s (base class) cho các lp "c th" khác (concrete class)
Chưa đầy đủ, thường đưc s dng làm lp cha. Lp con kế tha s hoàn thin
nt.
Lp trừu tượng thường cha các phương thức tru tượng (phương thức không được
cài đặt). Lp con khi kế tha phi i đt c th cho các phương thức trừu ng
ca lp cha. Nếu không ghi đè các phương thc này tlp con cũng tr thành mt
lp trừu tượng. Phương thc tru tượng không th khai báo final hoc static.
p trừu tượng: Khai báo vi t khóa abstract public
abstract class Shape { } // Ni dung lp
}
Shape = new Shape(); //Compile
error
Phương thức trừu tượng:
public abstract float
calculateArea();
Biu din trong UML lp trừu tượng (không th tạo đối tượng c th)
Chứa phương thức trừu tượng
n lp / tên phương thc: Ch nghiêng
3. Interface (Giao din)
Giao din (interface) là kiu d liu trừu tượng, đưc
dùng để đặc t c hành vi các lp phi thc thi.
Cha các ch ký phương thc (Mọi phương thức đu
phương thc trừu ng) các hng. Gii quyết
bài toán đa thừa kế, tránh các rc ri nhp nhng ng
nghĩa
S dng t khóa interface để định nghĩa mt giao din ch đưc bao gm:
lO MoARcPSD| 45467232
Ch ký c phương thứ c tính khai báo hng (static
& final)
Không th hin, ch đưc thc thi m rng
Cú pháp khai báo giao din trên Java
interface <n giao din> { }
<Giao din con> extends <Giao din cha> { }
Lp thc thi giao din (implements name_interface) bt buc phải i đặt chi tiết toàn b
các phương thc trong giao din nếu là lp c th
Ví d: public class HinhVuong extends TuGiac implements DoiXung, DiChuyen {}
Mt interface có th được coi n mt dạng “classmà:
Phương thức và thuc nh là public không tường minh
Các thuc tính là static và final
Các phương thc là abstract
Không th th hin hóa (instante) trc tiếp
Khi nào n cho mt lp lp độc lp, lp con, lp trừu tượng, hay nên biến thành
interface?
Mt lp n lớp độc lập, nghĩa không tha kế lp nào (ngoi tr Object)
nếu nó không tha mãn quan h IS-A đối vi bt c loi nào khác
Mt lp nên là lp con nếu cn cho nó làm mt phiên bn chuyên biệt hơn của mt
lp khác và cần ghi đè hành vi có sn hoc b sung hành vi mi
Mt lp n lp cha nếu muốn định nghĩa mt khuôn mu cho mt nhóm các
lớp con, và có mã cài đặt mà tt c các lp con kia có th s dng
ớp đó làm lp trừu tượng nếu muốn đảm bo rằng không ai được to
đối tượng thuc lớp đó
t interface nếu muốn định nghĩa mt vai trò mà các lp khác th nhn,
bt k các lp đó thuộc cây tha kế nào
Bài 8: Đa hình
1. Upcasting Downcasting
Upcasting
Upcasting quá trình ép kiu một đối tượng t lp con n lp cha tương ng
trong quá trình kế tha. cho pp ta gán một đối tượng ca lp con cho mt
biến ca lp cha mà không cn s dng toán t ép kiu (casting).
lO MoARcPSD| 45467232
Trong lập trình hướng đối tượng, upcasting được thc hin t đng ngm đnh
khi lp con được gán cho biến ca lp cha. Điều này nghĩa là ta có th s dng
một đối tượng ca lp con như là một đối tượng ca lp cha mà không cn phi
thc hin bt k thao tác ép kiu nào.
Đối vi method: Khi A b = new B() vi B lp con ca A; lúc này b là đối tượng thuc
lp A tc b s ly method lp A (khi method lp A lớp B trùng nhau (nhưng
không static)
Downcasting
Downcasting quá trình ép kiu một đối tượng t lp cha xung lp con tương
ng trong quá trình kế tha. cho phép ta gán mt đối tượng ca lp cha cho
mt biến ca lớp con, nhưng cn s dng toán t ép kiu (casting) ng.
Nếu đối tượng gc thc s là mt phiên bn ca lp con, thì downcasting s thành
công và ta th truy cp các thành phần đặc bit ca lp con. Tuy nhiên, nếu đối
ng gc kng phi mt phiên bn ca lp con hoc mt lp con kc, t
downcasting s gây ra li ClassCastException ti thi điểm chy (runtime error). Lưu
ý rng vic s dng toán t instanceof (kim tra xem mt đối tượng có phi là th
hin ca mt lp nào đó không?) kim tra kiu trước khi thc hin downcasting
quan trọng để tránh li ClassCastException. Nếu không chc chn v kiu thc tế
của đối tượng, ta nên kiểm tra trước khi thc hin downcasting.
Ví d down-casting: Animal (superclass) method sound(); còn Cat (subclass)
method sound() và method play(). Một đối tượng Animal nếu mun gi play thì cn
down-casting như sau: Animal animal1 = new Cat();
( (Cat) animal1 ). play(); hoc làm
như sau
lO MoARcPSD| 45467232
Variable hiding (biến n)
Tc là khi Superclass và Subclasscùng mt thuc tính trùng tên thì hai thuc tính này là
đc lp
Ví d: class Superclass { int x = 10; }
class Subclass { int x = 20; }
Thì hai thuc tính x hai lớp hoàn toàn độc lp
Khi up-casting Superclass a = new Subclass();
Gi a.x kết qu vn là 10 vì thuc tính x vn thuc v Superclass
Nhưng nếu down-casting như này ((Subclass)a).x tkết qu s là 20
2. Đa hình (Polymorphism)
Polymorphism: Nhiu hình thc thc hin, nhiu kiu tn ti (one things in many forms)
là kh năng của mt biến tham chiếu thay đổi hành vi theo đối tượng mà đang tham
chiếu ti
Đa hình trong lp trình
Đa hình phương thc
Phương thức trùng tên, phân bit bi danh sách tham s. (Overriding, Overloading)
Đa hình đối tượng
Nhìn nhận đối tượng theo nhiu kiu khác nhau (Upcasting, Downcasting)
Các đối tượng khác nhau cùng đáp ứng chung danh sách các thông đip (method) gii
nghĩa thông điệp theo cách thc khác nhau. (Liên kết động, nhiu class khác nhau
tên các phương thc ging với nhau nhưng mi method of class thc hin khác nhau)
Bài 9: Lp trình tng quát
Lp trình tng quát(Generic programming): Tổng quát hóa chương trình đ th hoạt đng vi
các kiu d liu khác nhau, k c kiu d liệu trong tương lai
1. Định nghĩa và s dng Template
Lớp tổng quát (Generic Class)
Lớp tng quát (generic class) lớp có th nhn kiểu d liệu một lớp bt kỳ. T Java
1.5 trở đi, h trợ s dụng template <T>.
lO MoARcPSD| 45467232
Chú ý: Không sử dụng các kiu dliệu nguyên thy cho các lớp tng quát Information<int>
integer = new Information<int>(2023); // Error
Information<Integer> integer = new Information<Integer>(2023); // OK
Phương thức tổng quát (Generic method)
Phương thức tổng quát (generic method) là các phương thức tđịnh nghĩa kiểu tham số
ca nó. Có th được viết trong lớp bt kỳ (tổng quát hoc không)
Giới hn kiểu dữ liệu tổng quát
Có th giới hn các kiểu d liệu tng quát sdng phi là dn xut (con) của mt hoặc
nhiều lớp
Giới hạn 1 lớp <type_param extends bound>
Giới hạn nhiều lớp <type_param extends bound_1 & bound_2 & …..>
lO MoARcPSD| 45467232
Collection là đi tượng có kh ng chứa các đối tượng khác. c collection đu tiên ca Java gm
có Mng - Vector: Mảng đng - Hastable: Bảng băm.
Collections Framework (từ Java 1.2) là một kiến trúc hợp nht đ biểu diễn và thao tác tn các
collection, giúp cho vic xcác collection đc lập với biểu diễn chi tiết bên trong ca chúng.
Collections Framework bao gồm
Interfaces: các giao tiếp th hiện tính cht ca các kiểu collection khác nhau như
List, Set, Map.
Implementations: Là các lớp collection có sn được cài đt các collection interfaces.
Algorithms: là các phương thức tĩnh đ xtrên collection, VD sp xếp danh sách,
m phn tử lớn nht...
Các giao diện và lớp thc thi trong Collection framework ca Java đều được xây dựng theo
Template <T>
2.1. c Interface con kế tha Interface Collection
a. Giao din Set
Set là mt tp hợp các phần tkhông đưc trùng lp. Set không có thêm phương thức rng
ngoài các phương thức kế thừa tCollection.
SortedSet: kế thừa giao diện Set, các phn tử được sp xếp theo một thứ tự. c đi
tượng đưa vào trong một SortedSet phi cài đt giao din Comparable hoc lớp cài đt
SortedSet phi nhn một Comparator trên kiểu ca đi tượng đó Một s phương thức:
first( ): lấy phn tử đầu tn (nhnht)
last( ): lấy phn tử cui cùng (lớn nht)
SortedSet subSet(Object e1, Object e2): lấy một tập các phn tử nằm trong khoảng từ
e1 tới e2
lO MoARcPSD| 45467232
b. Giao din List
List kế thừa từ Collection. List cung cp thêm các phương thức đ x Collection
kiểu danh sách. Danh sách là một collection với các phn t được xếp theo chs Một s
phương thức ca List
Object get(int index);
Object set(int index, Object
o);
void add(int index, Object o);
Object remove(int index); int indexOf(Object o);
int lastIndexOf(Object o);
c. Giao din Map
c đnh giao diện cơ bản đ thao tác với một tập hợp bao gm cp khóa-giá tr (K-V)
Giao diện Map cung cp các thao tác xtrên các bảng ánh xạ. Bảng ánh x lưu các
phần tử theo khoá và không được có 2 khoá trùng nhau.
Một số pơng thức ca Map
Object put(Object key, Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
Giao diện SortedMap: thừa kế giao din Map, các
phần tử được sắp xếp theo tht
2.2. Các lp thc thi giao din Collection
Java đã xây dựng sn một số lớp thực thi các giao diện Set, List
và Map và cài đt các phương thức tương ứng.
ArrayList: Mảng đng, nếu các phn tthêm vào vượt
q kích cỡ mảng, mảng s tự đng tăng kích c
LinkedList: Danh sách ln kết. H
tr thao tác tn đu và cui danh
sách, được sdng để to ngăn xếp,
hàng đợi, cây...
HashSet: Bảng băm. Lưu các phần tử
trong một bảng băm, không cho pp
lưu trùng lp, cho phép phn tử null
LinkedHashSet: Bảng băm kết hợp
với linked list nhm đm bảo thứ tự
các phần tử, thừa kế HashSet và thực
thi giao din Set. Khác HashSet ở chỗ
nó lưu trữ trong một danh sách móc
ni đôi. Thtự các phn tđược sắp
xếp theo th tự được insert vào tp
hợp.
lO MoARcPSD|45467232
TreeSet: Cho phép lấy các phần ttrong tp hợp theo thtđã sp xếp. c phn tử được
thêm vào TreeSet tự đng được sp xếp. Thông thường, ta có th thêm các phn tvào
HashSet, sau đó convert v TreeSet đ duyt theo thtự nhanh hơn
HashMap, LinkedHashMap, TreeMap: cài đặt của Map
2.3. Giao din iterator comparator
a. Iterator
Iterator cung cp cơ chế thuận tiện đ duyệt (lặp) qua toàn b ni dung ca tp hợp,
mỗi lần là một đi tượng trong tp hợp.
Iterator : c phương thức
iterator( ): yêu cu container trả v một iterator
next( ): tr v phn tử tiếp theo
hasNext( ): kiểm tra có tn ti phần tử tiếp theo hay không
remove( ): xóa phần tử gần nht ca iterator
Định nghĩa iterator
public interface Iterator {
boolean
hasNext(); Object
next(); void
remove();
}
Sdụng iterator
Collection c;
Iterator i = c.iterator();
while (i.hasNext()) {
Object o = i.next();
// Process this object
}
Tương tự vòng lp for: for (String name : names) { System.out.println(name); } b.
Comparator
Giao diện Comparator được sdụng đcho phép so sánh hai đi tượng trong tp hợp
Một Comparator phải đnh nghĩa một phương thức compare( ) lấy 2 tham s Object
và tr v -1, 0 hoc 1
Ví d cài đt Comparator class
AgeComparator implements
Comparator { public int
compare(Object ob1, Object ob2) { int
ob1Age = ((Person)ob1).getAge(); int
ob2Age = ((Person)ob2).getAge();
if(ob1Age > ob2Age)
return 1; else if(ob1Age <
ob2Age) return -1;
else return 0; }

Preview text:

lO M oARcPSD| 45467232
ÔN TẬP CUỐI KỲ MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Mục lục
Bài 1: Tổng quan về OOP...................................................................................................... .......3
Bài 2: Cơ bản về Java và UML................................................................................................. ...4
Bài 3: Trừu tượng hóa và đóng gói...................................................................................... ........4

1. Trừu tượng hóa............................................................................................................... ......4
2. Đóng gói (Encapsulation).....................................................................................................6
Bài 4+5: Đối tượng (Object) và Lớp (Class)...............................................................................6
1. Khởi tạo và sử dụng đối tượng..............................................................................................6
2. Nạp chồng phương thức (Overloading).................................................................................7
3. Thành viên của đối tượng và thành viên của lớp (Từ khóa static và final)............................8
4. Truyền số lượng tham số tùy ý vào một method...................................................................9
Bài 6: Kết tập và kế thừa............................................................................................................10
1. Sự kết tập (Aggregation)..................................................................................................... 10
2. Kế thừa (Inheritance)....................................................... ...................................................10
Bài 7: Một số kỹ thuật trong kế thừa.........................................................................................12
1. Quy tắc ghi đè (Overriding).................................................................................................12
2. Lớp trừu tượng (abstract class)...........................................................................................13
3. Interface (Giao diện)...........................................................................................................13
Bài 8: Đa hình..............................................................................................................................14
1. Upcasting và Downcasting..................................................................................................14
2. Đa hình (Polymorphism).....................................................................................................16
Bài 9: Lập trình tổng quát..........................................................................................................16
1. Định nghĩa và sử dụng Template........................................................................................16
2. Java Collections Framework...............................................................................................17 2.1.
Các Interface con kế thừa Interface Collection.........................................................18 2.2.
Các lớp thực thi giao diện Collection........................................................................19 2.3.
Giao diện iterator và comparator..............................................................................19
3. Ký tự đại diện ? (Wildcard).............................................. ..................................................20
Bài 10: Ngoại lệ và xử lý ngoại lệ...............................................................................................21
1. Xử lý ngoại lệ trong Java....................................................................................................21 1.1.
Khối try/catch...........................................................................................................21 1.2.
Cây phân cấp ngoại lệ...............................................................................................21 1.3.
Khối try….catch lồng nhau.......................................................................................22 1.4.
Khối finally...............................................................................................................22 lO M oARcPSD| 45467232
2. Ủy nhiệm ngoại lệ............................................................................................................ ...22
3. Tạo ngoại lệ tự định nghĩa..................................................................................................23
Bài 11: Lập trình giao diện với JavaFx.....................................................................................23
Bài 12: Phân tích thiết kế hướng đối tượng và biểu đồ lớp......................................................25
1. Phương pháp OOAD (phân tích thiết kế hướng đối tượng)................................................25
2. Biểu đồ lớp..........................................................................................................................25
Bài 1: Tổng quan về OOP
• Alan Kay đã tổng hợp các đặc tính của LT HĐT:
1. Tất cả đều là đối tượng
2. Chương trình phần mềm có thể coi là một tập hợp các đối tượng tương tác với nhau
3. Mỗi đối tượng trong ctr có các dữ liệu độc lập của mình và chiếm bộ nhớ riêng của mình.
4. Mỗi đối tượng đều có dạng đặc trưng của lớp các đối tượng đó
5. Tất cả các đối tượng thuộc về cùng một lớp đều có các hành vi giống nhau
• Hướng đối tượng: objects + messages = Program (Đối tượng + Thông điệp = Chương trình)
• Các nguyên lý cơ bản của OOP
Trừu tượng hóa (abstract)
Là quá trình loại bỏ đi các thông tin/tính chất cụ thể và giữ lại những thông tin/tính chất chung.
Tập trung vào các đặc điểm cơ bản của thực thể, các đặc điểm phân biệt nó với
các loại thực thể khác. lO M oARcPSD| 45467232 Đóng gói (Encapsulation)
Che giấu, ẩn đi chi tiết thực hiện bên trong
Cung cấp cho thế giới bên ngoài một giao diện Kế thừa (Inheritance)
Lớp con kế thừa các tính chất của lớp cha : extends, implements Đa hình (Polymorphism)
Overriding, Overloading, Up-casting, Down-casting…
• Ngôn ngữ lập trình Java
Năm 1991, James Gosling viết ra Oak. Năm 1995, Oak đổi tên thành Java
“Write once, run everywhere” – “Viết một lần, chạy mọi nơi”.
Code Java (file .java) chỉ cần viết một lần và được biên dịch thành mã Bytecode (file
.class). Mã Bytecode có thể chạy trên bất kỳ nền tảng nào chỉ cần có cài đặt máy ảo
Java (thông dịch bởi JVM – Java Virtual Machine). Tính năng của Java
Đơn giản, hướng đối tượng và quen thuộc. Mạnh mẽ và an toàn.
Kiến trúc trung lập và di động. Thực thi với hiệu suất cao.
Thông dịch, đa luồng và động.
Dễ sử dụng cho người dùng Java.
Bài 2: Cơ bản về Java và UML
• Một số chú ý về kiểu dữ liệu trong Java:
Giá trị hằng Literal gồm 5 loại: integer (7); floating point (7.0f); boolean (true);
character (‘A’); string (“A”)
Kiểu dữ liệu long kết thúc là L (ví dụ long lg = 26L; ) – float kết thúc là f/F (ví dụ: 7.0f) –
double kết thúc là d/D (7.0D) – nếu số thực không có kết thúc mặc định là double
Ép kiểu dữ liệu: mặc định ép kiểu từ hẹp lên rộng, từ rộng
về hẹp cần ép kiểu tường minh (ví dụ: int a, b; short c; khi
đó : a = b + c; và c = (short) a; )
float f = 12.35; // Báo lỗi do 12.35 là hằng số double
( sửa: float f = (float) 12.35 )
long lg = 999999999999; // Báo lỗi: integer number
too large (vượt quá phạm vi của integer nên ko thể
ép kiểu lên thành long) (sửa: long lg = 999999999999L; )
System.out.println(“Hello\b\b\bWorld”); HeWorld
System.out.print("Hello\rWorld"); World
• Thứ tự ưu tiên của toán tử
[] . ()x++, x--++x, --x, +x, -x → khởi tạo (new) → nhân chia, cộng, trừ → dịch bit →
so sánh hơn, ss bằng → &(AND), ^(OR), | (XOR), lO M oARcPSD| 45467232
• Mảng (trong thư viện java.util.Arrays) Khai báo Type_data[] name_array = new type_data[ size ]; Type_data name_array[] = new type_data[ size ];
Type_data[] name_array = { danh_sach_gia_tri };
Các hàm thao tác mảng: arr.length Arrays.equals(arr1, arr2)
Arrays.sort(arr) Arrays.toString(arr) Arrays.binarySearch(arr, value)
Arrays.copyOf(arr, number_elements) Arrays.fill(arr, value)
ểu đồ lớp (class diagram) trong UML (Unified Modeling Language – ngôn ngữ mô hình hóa được thống nhất) *
https://monhoc.weebly.com/uploads/1/6/9/3/16936172/lab02.pdf Chi tiết xem tại Bài 12
phần 2 : Biểu đồ lớp Cách đọc UML class diagram:
https://codegym.vn/blog/2022/02/17/cach-doc-uml-class- diagram/
Bài 3: Trừu tượng hóa và đóng gói
1. Trừu tượng hóa
• Trừu tượng hóa là quá trình loại bỏ đi các thông tin ít quan trọng và giữ lại những thông
tin quan trọng, có ý nghĩa.
• Lớp (Class) là cách phân loại các đối tượng dựa trên đặc điểm chung của các đối tượng
đó. Lớp chính là kết quả của quá trình trừu tượng hóa dữ liệu. Lớp định nghĩa một kiểu
dữ liệu mới, trừu tượng hóa một tập các đối tượng. Một đối tượng gọi là một thể hiện
của lớp. Lớp gồm các phương thức và thuộc tính chung của các đối tượng cùng một loại.
Lớp sẽ gồm có 3 thành phần: tên lớp, các thuộc tính, các phương thức
Ví dụ: public class sinhVien { // name_class private String name;
//attribute_class public String getName() { //method_class return this.name; }
public / private / protected / default (none) dùng để thể hiện phạm vi sử dụng lO M oARcPSD| 45467232
package(gói) dùng để nhóm các lớp liên quan với nhau package name_package;
được đặt đầu của mỗi class mà package đó chứa
Lớp trừu tượng (abstract class)
Giả sử chúng ta có một hệ thống quản lý hình học, và chúng ta muốn tạo ra một lớp trừu
tượng Shape để biểu diễn các hình học khác nhau như hình vuông, hình chữ nhật và hình tròn.
Trong ví dụ trên, lớp Shape được khai báo là lớp trừu tượng bằng cách sử dụng từ khóa
abstract. Nó định nghĩa hai phương thức trừu tượng calculateArea() và
calculatePerimeter() mà không cung cấp triển khai cụ thể cho chúng.
Bây giờ, chúng ta có thể tạo các lớp con từ lớp Shape để triển khai các phương thức trừu
tượng theo cách riêng biệt cho từng hình học cụ thể:
2. Đóng gói (Encapsulation)
• Đóng gói (encapsulation) là cho phép che giấu thông tin và hành vi bên trong một đối
tượng, và chỉ tiết lộ các phương thức và thuộc tính công khai (public) để tương tác với
đối tượng đó. Đóng gói giúp bảo vệ và duy trì tính toàn vẹn của đối tượng, bảo vệ tính
toàn vẹn và bảo mật của dữ liệu, đồng thời ẩn đi các chi tiết cài đặt và triển khai cụ thể.
• Sau khi đóng gói, một đối tượng có hai khung nhìn:
Bên trong: Chi tiết về các thuộc tính và các phương thức
của lớp tương ứng với đối tượng
Bên ngoài: Các dịch vụ mà một đối tượng có thể cung cấp
và cách đối tượng đó tương tác với phần còn lại của hệ thống
Che giấu dữ liệu: Dữ liệu được che giấu ở bên trong lớp bằng cách gán phạm vi truy
cập private. Dữ liệu chỉ có thể được truy cập từ các phương thức bên trong lớp. Các
đối tượng khác muốn truy nhập vào dữ liệu riêng tư này phải thông qua các phương
thức của lớp có phạm vi truy cập public (getter – lấy DL and setter – cập nhật DL). lO M oARcPSD| 45467232
Trong ví dụ bên, thuộc tính name và age được khai báo là
private, chỉ có thể truy cập từ bên trong lớp Person. Điều này giúp che giấu thông tin
chi tiết về tên và tuổi của một Person và đảm bảo rằng các thay đổi trong các thuộc
tính này chỉ có thể được thực hiện thông qua các phương thức công khai (getName(),
setName(), getAge(), setAge()).
Bài 4+5: Đối tượng (Object) và Lớp (Class)
1. Khởi tạo và sử dụng đối tượng
• Có hai phương thức khởi tạo đối tượng (Constructor) – trùng tên với Class
Phương thức khởi tạo mặc định (Phương thức khởi tạo không tham số)
Phương thức khởi tạo có tham số • Khai báo đối tượng
Cú pháp: name_class name_ object
= new name_class(....................); Ví dụ:
Person person1 = new Person();
Person person2 = new Person(“Trinh Van Hau”, 20);
• Dùng toán tử “ . “ để sử dụng các phương thức và thuộ ị của dữ liệu
nguyên thủy được ghi trực tiếp trong Stack.
Giá trị của đối tượng được khởi tạo bởi toán tử new được ghi trong Heap.
• So sánh hai dữ liệu kiểu nguyên thủy có thể sử dụng toán tử “==”. Tuy nhiên, nếu
so sánh hai đối tượng dùng “==” sẽ đưa ra kết quả sai lệch, vì thế cần sử dụng
“equals”. Các đối tượng Integer, Double, String đã được xây dựng sẵn equals, các
đối tượng khác do người dùng tự tạo cần phải tạo method “equals”. Ví dụ: Integer n1 = new Integer(47); Integer n2 = new Integer(47);
System.out.println(n1 == n2); // false
System.out.println(n1.equals(n2)); // true
Code ví dụ cho class Person:
https://onlinegdb.com/sfKxVCFDJ lO M oARcPSD| 45467232
2. Nạp chồng phương thức (Overloading)
• 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: (ví dụ constructor phía trên)
Số lượng tham số khác nhau
Nếu cùng số lượng tham số thì kiểu dữ liệu các tham số phải khác nhau • Mục đích:
Tên trùng nhau để mô tả bản chất công việc
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.
• Một số chú ý về overloading Với method: public void prin(float x)
{ System.out.println(x)); }. Khi gọi prin(5.5) sẽ báo lỗi vì 5.5 là kiểu
double, cần tạo method prin overload
cho kiểu double: public void prin(double x) {System.out.println(x)); } class MyClass {
public void myMethod(int a, long b) { }
public void myMethod(long a, int b) { // overloading } }
public class Test { public static void main(String args[]) { MyClass m = new MyClass();
m.myMethod(); // error do không có method phù hợp
m.myMethod(9, 10); // error do có 2 phiên bản method phù hợp } }
3. Thành viên của đối tượng và thành viên của lớp (Từ khóa static và final)
Trong Java, từ khóa static được sử dụng để chỉ ra rằng một thành phần của lớp (thuộc tính,
phương thức hoặc khối) thuộc về lớp chứ không thuộc về mỗi đối tượng cụ thể của lớp đó. Điều
này có nghĩa là, các thành phần static được chia sẻ giữa tất cả các đối tượng của lớp và có thể
được truy cập mà không cần tạo một đối tượng từ lớp đó.

• Thuộc tính static (Static Fields): Thuộc tính static là một biến được chia sẻ giữa tất cả
các đối tượng của lớp. Một thuộc tính static chỉ được khai báo một lần và giá trị của
nó được duy trì nguyên vẹn trong suốt thời gian chạy chương trình. lO M oARcPSD| 45467232
https://onlinegdb.com/08LNfXlEZ
• Phương thức static (Static method): Phương thức static thuộc về lớp chứ không thuộc
về các đối tượng của lớp. Chúng có thể được gọi trực tiếp từ lớp mà không cần tạo đối tượng từ lớp đó. Ví dụ: public class MathUtils {
public static int sum(int a, int b) { // Phương thức static return a + b; } }
int result = MathUtils.sum(3, 5); System.out.println(result); // Kết quả: 8
• 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 đó.
Các phương thức static chỉ có thể truy cập vào 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.
Trong Java, từ khóa final được sử dụng để chỉ ra rằng một thành phần (biến, phương thức hoặc
lớp) không thể thay đổi sau khi được khởi tạo hoặc định nghĩa.
Biến final: Một biến final là một biến không thể thay đổi giá trị sau khi được khởi tạo.
Điều này có nghĩa là một lần gán giá trị duy nhất được thực hiện và không thể thay đổi sau đó. lO M oARcPSD| 45467232
Trong ví dụ trên, biến MAX_VALUE là một biến final được khai báo trong lớp
Constants. Sau khi gán giá trị cho MAX_VALUE, giá trị này không thể thay đổi. Biến
final thường được sử dụng để định nghĩa các hằng số trong chương trình.
Phương thức final: Một phương thức final không thể bị ghi đè (override) bởi các lớp
con. Khi một phương thức được khai báo là final trong lớp gốc, các lớp con không thể
thay đổi hoặc mở rộng phương thức đó. lớp final đó.
• Sử dụng kết hợp statisc và final: giá trị hằng số có thể truy cập trực tiếp từ class mà
không cần tạo đối tượng của class đó.
4. Truyền số lượng tham số tùy ý vào một method
Java truyền mọi tham số cho phương thức dưới dạng giá trị (pass-byvalue): Truyền giá
trị/bản sao của tham số thực. Có thể truyền số lượng tham số tùy ý, được gọi là varargs lO M oARcPSD| 45467232 Cú pháp: [public]
[static] return_type name_method (type_data … parameter) {..}
Bài 6: Kết tập và kế thừa
1. Sự kết tập (Aggregation)
• Kết tập (aggregaton): Tạo ra các đối tượng của các lớp có sẵn trong lớp mới, là thành
viên của lớp mới. Kết tập tái sử dụng các thành phần dữ liệu và các hành vi của lớp thành
phần thông qua đối tượng thành phần. Lớp mới gọi là lớp toàn thể, lớp cũ gọi là lớp thành phần.
• Ví dụ: một tứ giác là sự kết tập của bốn điểm
Biểu diễn kết tập trong UML
Sử dụng "hình thoi" tại đầu của lớp toàn thể
Sử dụng bội số quan hệ (multiplicity) tại 2 đầu: 1 số nguyên dương: 1, 2,... // Dải số (0..1,
2..4) //*: Bất kỳ số nào // Không có: Mặc định là 1
Tên vai trò (rolename): Nếu không có thì mặc định là tên của lớp (bỏ viết hoa chữ cái đầu)
2. Kế thừa (Inheritance)
• Kế thừa (Inherit, Derive) là tạo lớp mới bằng cách phát triển lớp đã có. Lớp mới kế thừa
những gì đã có trong lớp cũ và phát triển những tính năng mới, chi tiết hóa cho phù hợp
với mục đích sử dụng mới
Lớp cũ : Lớp cha (parent, superclass), lớp cơ sở (base class)
Lớp mới: Lớp con (child, subclass), lớp dẫn xuất (derived class)
• Biểu diễn kế thừa trong UML sử dụng đường thẳng mũi tên tam giác rỗng
Nguyên lý kế thừa
Chỉ định truy cập protected
Thành viên protected trong lớp cha được truy cập trong: Các thành viên lớ ớ ớp cùng thuộc 1 package với lớ
ớp con có thể kế thừa được gì? lO M oARcPSD| 45467232
Kế thừa được các thành viên được khai báo là public và protected của lớp cha.
Không kế thừa được các thành viên private.
Các thành viên có chỉ định truy cập mặc định nếu lớp cha cùng gói với lớp con publ ic protec default(n priva ted one) te Cùng lớp cha YES YES YES YES
Lớp con cùng gói với lớp cha YES YES YES NO
Lớp con khác gói với lớp cha YES YES NO NO
Khác gói, không kế YES NO NO NO thừa
ế thừa trên Java: extends { ……. } Lớp cha nếu được định
nghĩa là final thì không thể có lớp dẫn xuất/kế thừa từ nó. Ví dụ:
class HinhVuong extends TuGiac { ......................... }
Khởi tạo (constructor) của lớp con
ự động gọi constructor mặc định của lớp cha (nếu có)
ệnh đầu tiên trong phương thức khởi tạo của lớp con gọi phương thức khởi
tạo của lớp cha super(Danh_sach_tham_so);
Điều này là bắt buộc nếu lớp cha không có phương thức khởi tạo mặc định
Đã viết phương thức khởi tạo của lớp cha với một số tham số
Phương thức khởi tạo của lớp con không bắt buộc phải có tham số. lO M oARcPSD| 45467232
Và còn có thể truy cập thuộc tính của lớp cha: Từ khóa
super cũng có thể được sử dụng để truy cập thuộc tính
của lớp cha từ lớp con. Điều này cho phép lớp con truy
cập và sử dụng các thuộc tính của lớp cha mà không
cần định nghĩa lại chúng. Ở ví dụ bên, super(value) là
đang gọi đến phương thức khởi tạo (constructor) có ở
lớp cha. // super(list_para);
Bài 7: Một số kỹ thuật trong kế thừa 1. Quy tắc ghi đè (Overriding)
• Phương thức ghi đè trong lớp con phải
Có danh sách tham số giống hệt phương thức kế thừa trong lớp cha.
Có cùng kiểu trả về với phương thức kế thừa trong lớp cha lO M oARcPSD| 45467232
Có chỉ định truy cập không giới hạn chặt hơn phương thức trong lớp cha. Ví dụ, nếu
ghi đè một phương thức protected, thì phương thức mới có thể là protected hoặc
public, mà không được là private
• Không được phép ghi đè:
Các phương thức static trong lớp cha
Các phương thức private trong lớp cha
Các phương thức hằng (final) trong lớp cha
• Nếu biết trước sẽ không định nghĩa lại phương thức của lớp cơ sở thì nên dùng từ khóa
final đi với phương thức. Mục đích nhằm đảm bảo tính đúng đắn và tính hiệu quả Ví dụ:
public final String baseName () { return “Person”; }
2. Lớp trừu tượng (abstract class)
ặc điểm của lớp trừu tượng
Không thể tạo đối tượng trực tiếp từ các lớp trừu tượng
Thường lớp trừu tượng được dùng để định nghĩa các "khái niệm chung", đóng vai trò
làm lớp cơ sở (base class) cho các lớp "cụ thể" khác (concrete class)
Chưa đầy đủ, thường được sử dụng làm lớp cha. Lớp con kế thừa nó sẽ hoàn thiện nốt.
Lớp trừu tượng thường chứa các phương thức trừu tượng (phương thức không được
cài đặt). Lớp con khi kế thừa phải cài đặt cụ thể cho các phương thức trừu tượng
của lớp cha. Nếu không ghi đè các phương thức này thì lớp con cũng trở thành một
lớp trừu tượng. Phương thức trừu tượng không thể khai báo là final hoặc static.
ớp trừu tượng: Khai báo với từ khóa abstract public
abstract class Shape { } // Nội dung lớp }
Shape = new Shape(); //Compile error
Phương thức trừu tượng: public abstract float calculateArea();
Biểu diễn trong UML lớp trừu tượng (không thể tạo đối tượng cụ thể)
Chứa phương thức trừu tượng
Tên lớp / tên phương thức: Chữ nghiêng
3. Interface (Giao diện)
• Giao diện (interface) là kiểu dữ liệu trừu tượng, được
dùng để đặc tả các hành vi mà các lớp phải thực thi.
Chứa các chữ ký phương thức (Mọi phương thức đều
là phương thức trừu tượng
) và các hằng. Giải quyết
bài toán đa thừa kế, tránh các rắc rối nhập nhằng ngữ nghĩa
• Sử dụng từ khóa interface để định nghĩa một giao diện chỉ được bao gồm: lO M oARcPSD| 45467232 Chữ ký các phương thứ
ộc tính khai báo hằng (static & final)
Không có thể hiện, chỉ được thực thi và mở rộng
• Cú pháp khai báo giao diện trên Java interface { } extends { }
• Lớp thực thi giao diện (implements name_interface) bắt buộc phải cài đặt chi tiết toàn bộ
các phương thức trong giao diện nếu là lớp cụ thể
Ví dụ: public class HinhVuong extends TuGiac implements DoiXung, DiChuyen {}
• Một interface có thể được coi như một dạng “class” mà:
Phương thức và thuộc tính là public không tường minh
Các thuộc tính là static và final
Các phương thức là abstract
Không thể thể hiện hóa (instante) trực tiếp
• Khi nào nên cho một lớp là lớp độc lập, lớp con, lớp trừu tượng, hay nên biến nó thành interface?
Một lớp nên là lớp độc lập, nghĩa là nó không thừa kế lớp nào (ngoại trừ Object)
nếu nó không thỏa mãn quan hệ IS-A đối với bất cứ loại nào khác
Một lớp nên là lớp con nếu cần cho nó làm một phiên bản chuyên biệt hơn của một
lớp khác và cần ghi đè hành vi có sẵn hoặc bổ sung hành vi mới
Một lớp nên là lớp cha nếu muốn định nghĩa một khuôn mẫu cho một nhóm các
lớp con, và có mã cài đặt mà tất cả các lớp con kia có thể sử dụng
ớp đó làm lớp trừu tượng nếu muốn đảm bảo rằng không ai được tạo
đối tượng thuộc lớp đó
ột interface nếu muốn định nghĩa một vai trò mà các lớp khác có thể nhận,
bất kể các lớp đó thuộc cây thừa kế nào Bài 8: Đa hình
1. Upcasting và Downcasting Upcasting
Upcasting là quá trình ép kiểu một đối tượng từ lớp con lên lớp cha tương ứng
trong quá trình kế thừa. Nó cho phép ta gán một đối tượng của lớp con cho một
biến của lớp cha mà không cần sử dụng toán tử ép kiểu (casting). lO M oARcPSD| 45467232
Trong lập trình hướng đối tượng, upcasting được thực hiện tự động và ngầm định
khi lớp con được gán cho biến của lớp cha. Điều này có nghĩa là ta có thể sử dụng
một đối tượng của lớp con như là một đối tượng của lớp cha mà không cần phải
thực hiện bất kỳ thao tác ép kiểu nào.
Đối với method: Khi A b = new B() với B là lớp con của A; lúc này b là đối tượng thuộc
lớp A tức b sẽ lấy method ở lớp A (khi method lớp A và lớp B trùng nhau (nhưng không là static) Downcasting
Downcasting là quá trình ép kiểu một đối tượng từ lớp cha xuống lớp con tương
ứng trong quá trình kế thừa. Nó cho phép ta gán một đối tượng của lớp cha cho
một biến của lớp con, nhưng cần sử dụng toán tử ép kiểu (casting) rõ ràng.
Nếu đối tượng gốc thực sự là một phiên bản của lớp con, thì downcasting sẽ thành
công và ta có thể truy cập các thành phần đặc biệt của lớp con. Tuy nhiên, nếu đối
tượng gốc không phải là một phiên bản của lớp con hoặc một lớp con khác, thì
downcasting sẽ gây ra lỗi ClassCastException tại thời điểm chạy (runtime error).
Lưu
ý rằng việc sử dụng toán tử instanceof (kiểm tra xem một đối tượng có phải là thể
hiện của một lớp nào đó không?) kiểm tra kiểu trước khi thực hiện downcasting là
quan trọng để tránh lỗi ClassCastException. Nếu không chắc chắn về kiểu thực tế
của đối tượng, ta nên kiểm tra trước khi thực hiện downcasting.
Ví dụ down-casting: Animal (superclass) có method sound(); còn Cat (subclass) có
method sound() và method play(). Một đối tượng Animal nếu muốn gọi play thì cần
down-casting như sau: Animal animal1 = new Cat();
( (Cat) animal1 ). play(); hoặc làm như sau lO M oARcPSD| 45467232
Variable hiding (biến ẩn)
Tức là khi Superclass và Subclass có cùng một thuộc tính trùng tên thì hai thuộc tính này là độc lập Ví dụ:
class Superclass { int x = 10; }
class Subclass { int x = 20; }
Thì hai thuộc tính x ở hai lớp hoàn toàn độc lập
Khi up-casting Superclass a = new Subclass();
Gọi a.x kết quả vẫn là 10 vì thuộc tính x vẫn thuộc về Superclass
Nhưng nếu down-casting như này ((Subclass)a).x thì kết quả sẽ là 20
2. Đa hình (Polymorphism)
• Polymorphism: Nhiều hình thức thực hiện, nhiều kiểu tồn tại (one things in many forms)
là khả năng của một biến tham chiếu thay đổi hành vi theo đối tượng mà nó đang tham chiếu tới
• Đa hình trong lập trình Đa hình phương thức
Phương thức trùng tên, phân biệt bởi danh sách tham số. (Overriding, Overloading) Đa hình đối tượng
Nhìn nhận đối tượng theo nhiều kiểu khác nhau (Upcasting, Downcasting)
Các đối tượng khác nhau cùng đáp ứng chung danh sách các thông điệp (method) giải
nghĩa thông điệp theo cách thức khác nhau. (Liên kết động, nhiều class khác nhau có
tên các phương thức giống với nhau nhưng mỗi method of class thực hiện khác nhau)
Bài 9: Lập trình tổng quát
Lập trình tổng quát(Generic programming): Tổng quát hóa chương trình để có thể hoạt động với
các kiểu dữ liệu khác nhau, kể cả kiểu dữ liệu trong tương lai
1. Định nghĩa và sử dụng Template
Lớp tổng quát (Generic Class)
Lớp tổng quát (generic class) là lớp có thể nhận kiểu dữ liệu là một lớp bất kỳ. Từ Java
1.5 trở đi, hỗ trợ sử dụng template . lO M oARcPSD| 45467232
Chú ý: Không sử dụng các kiểu dữ liệu nguyên thủy cho các lớp tổng quát Information
integer = new Information(2023); // Error
Information integer = new Information(2023); // OK
Phương thức tổng quát (Generic method)
Phương thức tổng quát (generic method) là các phương thức tự định nghĩa kiểu tham số
của nó. Có thể được viết trong lớp bất kỳ (tổng quát hoặc không)
Giới hạn kiểu dữ liệu tổng quát
Có thể giới hạn các kiểu dữ liệu tổng quát sử dụng phải là dẫn xuất (con) của một hoặc nhiều lớp Giới hạn 1 lớp extends bound> Giới hạn nhiều lớp
extends bound_1 & bound_2 & …..> lO M oARcPSD| 45467232
Collection là đối tượng có khả năng chứa các đối tượng khác. Các collection đầu tiên của Java gồm
có Mảng - Vector: Mảng động - Hastable: Bảng băm.
Collections Framework (từ Java 1.2) là một kiến trúc hợp nhất để biểu diễn và thao tác trên các
collection, giúp cho việc xử lý các collection độc lập với biểu diễn chi tiết bên trong của chúng.
• Collections Framework bao gồm
Interfaces: Là các giao tiếp thể hiện tính chất của các kiểu collection khác nhau như List, Set, Map.
Implementations: Là các lớp collection có sẵn được cài đặt các collection interfaces.
Algorithms: là các phương thức tĩnh để xử lý trên collection, VD sắp xếp danh sách,
tìm phần tử lớn nhất...
• Các giao diện và lớp thực thi trong Collection framework của Java đều được xây dựng theo Template
2.1. Các Interface con kế thừa Interface Collection a. Giao diện Set
Set là một tập hợp các phần tử không được trùng lặp. Set không có thêm phương thức riêng
ngoài các phương thức kế thừa từ Collection.
SortedSet: kế thừa giao diện Set, các phần tử được sắp xếp theo một thứ tự. Các đối
tượng đưa vào trong một SortedSet phải cài đặt giao diện Comparable hoặc lớp cài đặt
SortedSet phải nhận một Comparator trên kiểu của đối tượng đó Một số phương thức:
first( ): lấy phần tử đầu tiên (nhỏ nhất)
last( ): lấy phần tử cuối cùng (lớn nhất)
SortedSet subSet(Object e1, Object e2): lấy một tập các phần tử nằm trong khoảng từ e1 tới e2 lO M oARcPSD| 45467232 b. Giao diện List
List kế thừa từ Collection. List cung cấp thêm các phương thức để xử lý Collection
kiểu danh sách. Danh sách là một collection với các phần tử được xếp theo chỉ số Một số phương thức của List Object get(int index); Object set(int index, Object o);
void add(int index, Object o);
Object remove(int index); int indexOf(Object o); int lastIndexOf(Object o); c. Giao diện Map
Xác định giao diện cơ bản để thao tác với một tập hợp bao gồm cặp khóa-giá trị (K-V)
Giao diện Map cung cấp các thao tác xử lý trên các bảng ánh xạ. Bảng ánh xạ lưu các
phần tử theo khoá và không được có 2 khoá trùng nhau.
Một số phương thức của Map
Object put(Object key, Object value); Object get(Object key); Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
Giao diện SortedMap: thừa kế giao diện Map, các
phần tử được sắp xếp theo thứ tự
2.2. Các lớp thực thi giao diện Collection
Java đã xây dựng sẵn một số lớp thực thi các giao diện Set, List
và Map và cài đặt các phương thức tương ứng.
ArrayList: Mảng động, nếu các phần tử thêm vào vượt
quá kích cỡ mảng, mảng sẽ tự động tăng kích cỡ
LinkedList: Danh sách liên kết. Hỗ
trợ thao tác trên đầu và cuối danh
sách, được sử dụng để tạo ngăn xếp, hàng đợi, cây...
HashSet: Bảng băm. Lưu các phần tử
trong một bảng băm, không cho phép
lưu trùng lặp, cho phép phần tử null
LinkedHashSet: Bảng băm kết hợp
với linked list nhằm đảm bảo thứ tự
các phần tử, thừa kế HashSet và thực
thi giao diện Set
. Khác HashSet ở chỗ
nó lưu trữ trong một danh sách móc
nối đôi. Thứ tự các phần tử được sắp
xếp theo thứ tự được insert vào tập hợp.
lO M oARcPSD| 45467232
TreeSet: Cho phép lấy các phần tử trong tập hợp theo thứ tự đã sắp xếp. Các phần tử được
thêm vào TreeSet tự động được sắp xếp. Thông thường, ta có thể thêm các phần tử vào
HashSet, sau đó convert về TreeSet để duyệt theo thứ tự nhanh hơn
HashMap, LinkedHashMap, TreeMap: cài đặt của Map
2.3. Giao diện iterator và comparator a. Iterator
Iterator cung cấp cơ chế thuận tiện để duyệt (lặp) qua toàn bộ nội dung của tập hợp,
mỗi lần là một đối tượng trong tập hợp.
Iterator : Các phương thức
iterator( ): yêu cầu container trả về một iterator
next( ): trả về phần tử tiếp theo
hasNext( ): kiểm tra có tồn tại phần tử tiếp theo hay không
remove( ): xóa phần tử gần nhất của iterator Định nghĩa iterator public interface Iterator { boolean hasNext(); Object next(); void remove(); } Sử dụng iterator Collection c; Iterator i = c.iterator(); while (i.hasNext()) { Object o = i.next(); // Process this object }
Tương tự vòng lặp for: for (String name : names) { System.out.println(name); } b. Comparator
Giao diện Comparator được sử dụng để cho phép so sánh hai đối tượng trong tập hợp
Một Comparator phải định nghĩa một phương thức compare( ) lấy 2 tham số Object và trả về -1, 0 hoặc 1
Ví dụ cài đặt Comparator class AgeComparator implements Comparator { public int
compare(Object ob1, Object ob2) { int
ob1Age = ((Person)ob1).getAge(); int
ob2Age = ((Person)ob2).getAge(); if(ob1Age > ob2Age) return 1; else if(ob1Age < ob2Age) return -1; else return 0; }