Nội dung
• Cấu trúc của một chương trình Java
• Dịch và thực thi một chương trình Java
• Cú pháp của ngôn ngữ Java
• Các kiểu dữ liệu cơ bản trong Java
• Cấu trúc điều khiển
• Tạo lớp và đối tượng
• Khởi tạo và hủy đối tượng
• Xử lý ngoại lệ
              
                                            
                                
            
 
            
                 160 trang
160 trang | 
Chia sẻ: phuongt97 | Lượt xem: 655 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Lập trình hướng đối tượng - Chương 2: Ngôn ngữ Lập trình Java - Trần Công Án, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
 có hàm xây dựng, hàm xây dựng không 
đối số với thân hàm rỗng sẽ được tự động thêm vào
 Khởi tạo và hủy đối tượng
CT176 – Lập trình Hướng đối tượng 107 TS. Trần Công Án
Hàm xây dựng (constructor)
 Khởi tạo và hủy đối tượng
class Sinhvien {
private int mssv;
private String hoten;
Sinhvien() {
mssv = -1;
hoten = "unknown";
}
Sinhvien(int ms, String ht) {
mssv = ms;
hoten = ht;
}
public void hienthi() {
System.out.println("MSSV: " + mssv +
", ho ten: " + hoten);
}
}
class TestSinhvien {
public static void main(String args[]) {
Sinhvien sv1 = new Sinhvien();
Sinhvien sv2 = new Sinhvien(1, "NVA");
sv1.hienthi();
sv2.hienthi();
}
}
CT176 – Lập trình Hướng đối tượng 108 TS. Trần Công Án
Hàm xây dựng (constructor)
 Khởi tạo và hủy đối tượng
class Diem2D {
private int x, y;
public Diem2D() {
x = y = 0;
}
public Diem2D(int th) {
x = y = th;
}
public Diem2D(int h, int t) {
x = h; y = t;
}
public void hienthi(String s) {
System.out.println(s + "(" + x + ", " + y + ")");
}
}
class TestDiem2D {
public static void main(String args[]) {
Diem2D p1 = new Diem2D();
Diem2D p2 = new Diem2D(5);
Diem2D p3 = new Diem2D(2, 1);
p1.hienthi("p1");
p2.hienthi("p2");
p3.hienthi("p3");
}
}
CT176 – Lập trình Hướng đối tượng 109 TS. Trần Công Án
Hàm xây dựng (constructor)
 Khởi tạo và hủy đối tượng
class Clock {
private h, m, s;
public Clock() {
h = m = s = 0;
}
public Clock(int g, int p, int gi) {
h = g; m = p; s = gi;
}
public void setTime(int g, int p, int gi) {
h = g; m = p; s= gi;
}
public void display() {
System.out.println(h + ":" + m + ":" + s);
}
}
public class TestClock {
public static void main(String args[]) {
Clock c1 = new Clock();
Clock c2 = new Clock(5, 10, 20);
c1.display();
c2.display();
}
}
CT176 – Lập trình Hướng đối tượng 110 TS. Trần Công Án
Hàm xây dựng sao chép (copy constructor)
• Là hàm xây dựng với đối số là một đối tượng cùng lớp
• Được sử dụng để tạo 1 đối tượng mới “giống” với 1 đối 
tượng đã có sẵn
• Cú pháp: public Classname(Classname obj);
 Đây cũng là hàm xây dựng nên cú pháp cũng theo qui tắc 
hàm xây dựng: tên hàm trùng tên lớp, không có giá trị trả về
 Hàm luôn có 1 đối số, chính là 1 đối tượng cùng lớp
 Khởi tạo và hủy đối tượng
//hàm xây dựng sao chép của lớp Clock
public Clock(Clock c) {
h = c.h;
m = c.m;
s = c.s;
}
Clock c1 = new Clock(5, 10, 20);
Clock c2 = new Clock(c1);
CT176 – Lập trình Hướng đối tượng 111 TS. Trần Công Án
Phép gán đối tượng (object assignment)
• Phép gán đối tượng còn được gọi là phép sao chép 
tham chiếu (reference copy):
 Cái được sao chép chính là tham chiếu: phép gán
obj1 = obj2
làm cho obj1 và obj2 tham chiếu đến cùng 1 đối tượng
 Điều này có thể dẫn đến các lỗi ngoài mong đợi trong chương 
trình: obj1 và obj2 luôn có cùng 1 giá trị
 Khởi tạo và hủy đối tượng
obj1
obj2
obj1 = obj2
obj1
obj2
CT176 – Lập trình Hướng đối tượng 112 TS. Trần Công Án
Phép gán đối tượng (object assignment)
 Khởi tạo và hủy đối tượng
class Student {
int ID;
String name;
Student(int i, String n) {
ID = i;
name = n;
}
public void display(String s) {
System.out.println(s + " -- ID: " + ID +
", name: " + name);
}
public void setInfo(int i, String n) {
ID = i;
name = n;
}
}
class ObjectAssignment {
public static void main(String []args) {
Student s1 = new Student(1, "NVA"), s2;
s2 = s1;
s2.setInfo(2, "NVB");
s1.display("s1");
s2.display("s2");
}
}
CT176 – Lập trình Hướng đối tượng 113 TS. Trần Công Án
Hàm hủy (desctructor)
• Là một phương thức đặc biệt của đối tượng, sẽ tự động 
được gọi bởi bộ thu hồi rác (garbage collector) khi ra 
khỏi phạm vi của đối tượng
• Trong Java, hàm hủy được gọi là finalizer (hàm kết thúc)
• Cú pháp hàm kết thúc:
 Không có đối số và kiểu dữ liệu trả về, kể cả void
 Một lớp chỉ được phép có tối đa 1 hàm kết thúc
 Tên của hàm kết thúc: finalizer
• Trong Java, thông thường hàm này ít được sử dụng
 Khởi tạo và hủy đối tượng
CT176 – Lập trình Hướng đối tượng 114 TS. Trần Công Án
Thêm về lớp và đối tượng
(more on class & object)
 Thêm về lớp và đối tượng
CT176 – Lập trình Hướng đối tượng 115 TS. Trần Công Án
Sao chép cạn (shallow copy)
• Là phép sao chép đối tượng dựa trên phép toán 
bitwise  đối tượng mới được tạo ra sẽ “giống y” như 
đối tượng được sao chép
 Thuộc tính kiểu nguyên thủy: sao chép dữ liệu
 Thuộc tính kiểu tham chiếu: sao chép tham chiếu
• Về bản chất:
 Tạo đối tượng mới
 Gán lần lượt từng thành phần của đối tượng được sao chép 
cho đối tượng mới
 Thêm về lớp và Đối tượng
CT176 – Lập trình Hướng đối tượng 116 TS. Trần Công Án
Sao chép cạn (shallow copy)
• Thực hiện sao chép cạn:
1. Tự viết phương thức sao chép
2. Nạp đè (overriding) và gọi hàm clone() của lớp Object
 Thêm về lớp và Đối tượng
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
Date
- int ngay, thang, nam
+ Date()
+ Date(int, int, int)
+ void gan(int, int, int)
+ 
SinhVien
- String mssv, hoten
- Date ngaysinh
- Double diemTB
+ 
CT176 – Lập trình Hướng đối tượng 117 TS. Trần Công Án
Sao chép cạn (shallow copy)
 Thêm về lớp và Đối tượng
class Date {
private int ngay, thang, nam;
public Date(int ngay, int thang, int nam) {
this.ngay = ngay;
this.thang = thang;
this.nam = nam;
}
public void set(int ngay, int thang, int nam) {
this.ngay = ngay;
this.thang = thang;
this.nam = nam;
}
public void hienthi() {
System.out.print(ngay + "/" + thang + "/" + nam);
}
}
CT176 – Lập trình Hướng đối tượng 118 TS. Trần Công Án
Sao chép cạn (shallow copy)
 Thêm về lớp và Đối tượng
class SinhVien implements Cloneable {
private String mssv, hoten;
private Date ngaysinh;
private double diemTB;
public SinhVien(String mssv, String ht, Date ngsinh, double diemTB) {
this.mssv = mssv;
this.hoten = ht;
this.ngaysinh = ngsinh;
this.diemTB = diemTB;
}
public void hienthi() {
System.out.print("{" + mssv + "; " + hoten + "; ");
ngaysinh.hienthi();
System.out.println("; " + diemTB + "}");
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
CT176 – Lập trình Hướng đối tượng 119 TS. Trần Công Án
Sao chép cạn (shallow copy)
 Thêm về lớp và Đối tượng
public static void main(String []args) throws CloneNotSupportedException {
SinhVien sv1 = new SinhVien("111", "NVA", new Date(1,1,2001), 7.0);
SinhVien sv3 = new SinhVien("333", "NVB", new Date(2,2,2002), 9.0);
System.out.print("SV1: "); sv1.hienthi();
System.out.print("SV3: "); sv3.hienthi();
System.out.println("-----------------");
SinhVien sv2 = sv1; //sao chép tham chiếu
sv2.ganDiemTB(8.0); //sv1 sẽ thay đổi theo
sv2.layNgaysinh().set(2, 2, 2002);
SinhVien sv4 = (SinhVien)sv3.clone(); //sao chép cạn
sv4.ganDiemTB(9.5); //sv3 không thay đổi diemTB
sv4.layNgaysinh().set(3, 3, 2003); //sv3 bị thay đổi ngaysinh
System.out.println("Gan tham chieu:");
System.out.print("SV1:"); sv1.hienthi();
System.out.print("SV2:"); sv2.hienthi();
System.out.println("\nSao chep can:");
System.out.print("SV3:"); sv3.hienthi();
System.out.print("SV4:"); sv4.hienthi();
}
CT176 – Lập trình Hướng đối tượng 120 TS. Trần Công Án
Sao chép sâu (deep copy)
• Sao chép dữ liệu của đối tượng một cách triệt để, cả 
các thuộc tính kiểu nguyên thủy lẫn tham chiếu
• Thực hiện: phải tự viết hàm thực hiện
• Ví dụ: để thực hiện sao chép hai đối tượng s1 và s2
trong ví dụ trước, ta phải viết thêm phương thức 
makeCopy() như sau trong lớp Student:
 void makeCopy(Student);
 Để sao chép s1 cho s2, ta gọi: s2.makeCopy(s1)
 Thêm về lớp và đối tượng
CT176 – Lập trình Hướng đối tượng 121 TS. Trần Công Án
Sao chép sâu (deep copy)
 Thêm về lớp và đối tượng
class Student {
//dữ liệu
//các phương thức
public void makeCopy(Student s) {
ID = s.ID;
name = s.name;
}
}
class ObjectAssignment {
public static void main(String []args) {
Student s1 = new Student(1, "NVA");
Student s2 = new Student();
s2.makeCopy(s1);
s2.setInfo(2, "NVB");
s1.display("s1");
s2.display("s2");
}
}
CT176 – Lập trình Hướng đối tượng 122 TS. Trần Công Án
Sao chép sâu (deep copy)
• Một phương pháp khác để sao chép sâu dùng chính 
phép gán = là tạo một đối tượng mới giống với đối 
tượng cần được sao chép, sau đó sử dụng phép gán
 Thêm về lớp và đối tượng
class ObjectAssignment {
public static void main(String []args) {
Student s1 = new Student(1, "NVA");
Student s2 = new Student();
s2 = s1.getCopy();
s2.setInfo(2, "NVB");
s1.display("s1");
s2.display("s2");
}
}
class Student {
//dữ liệu
//các phương thức
public Student getCopy() {
Student t = new Student(ID, name);
return t;
}
}
CT176 – Lập trình Hướng đối tượng 123 TS. Trần Công Án
Thành phần tĩnh (static members)
• Lớp là khuôn mẫu để tạo ra đối tượng
 Các thành phần khai báo trong lớp chỉ tồn tại khi đối tượng 
được tạo ra
 Mỗi đối tượng sẽ “sở hữu” các thành phần riêng của mình
⇒ có bao nhiêu đối tượng được tạo ra thì có bấy nhiêu “tập” 
thành phần trên bộ nhớ
 Thêm về lớp và đối tượng
Student
- int ID
- String name
+ Student()
+ Student()
+ display(): void
+ setInfo(int, String): void
st1:Student
- ID
- name
+ Student()
+ Student()
+ display(): void
+ setInfo(int, String): void
1
NVA
st2:Student
- ID
- name
+ Student()
+ Student()
+ display(): void
+ setInfo(int, String): void
2
NVB
CT176 – Lập trình Hướng đối tượng 124 TS. Trần Công Án
Thành phần tĩnh (static members)
• Thành phần tĩnh: còn được gọi là thành phần “của lớp”
 Khai báo: thêm từ khóa static sau thuộc tính truy xuất
 Tồn tại độc lập với các đối tượng: có bao nhiêu đối tượng 
được tạo ra thì vẫn chỉ có 1 bản (copy) của thành phần tĩnh 
trong bộ nhớ
 Thành phần tĩnh được truy xuất trực tiếp thông qua lớp
.
 Các phương thức tĩnh chỉ được truy xuất các thành phần tĩnh
 Các phương thức không tĩnh có thể truy xuất tất cả các thành 
phần tĩnh lẫn không tĩnh
 Các thành phần tĩnh sẽ được khởi tạo các giá trị mặc nhiên 
của kiểu dữ liệu của thành phần tĩnh
 Thêm về lớp và đối tượng
CT176 – Lập trình Hướng đối tượng 125 TS. Trần Công Án
Thành phần tĩnh (static members)
 Thêm về lớp và đối tượng
class ClockStatic {
private static int count;
private int h, m, s;
public ClockStatic() {
h = m = s = 0;
count++;
}
public ClockStatic(int g, int p, int gi) {
h = g; m = p; s = gi;
count++;
}
static public void noOfInstances() {
System.out.println("# of instances: " + 
count);
}
public void display() {
System.out.println(h + ":" + m + ":" + s);
}}
class TestClockStatic {
public static void main(String args[]) {
ClockStatic.noOfInstances());
ClockStatic c1 = new ClockStatic();
ClockStatic.noOfInstances());
}
}
CT176 – Lập trình Hướng đối tượng 126 TS. Trần Công Án
Biến tham chiếu this
• Đây là một biến tham chiếu đặc biệt, tồn tại trong tất cả 
các phương thức không tĩnh của lớp
• Biến này tham chiếu đến đối tượng đang gọi phương 
thức
 Thêm về lớp và đối tượng
Student
- int ID
- String name
+ . . .
+ setInfo(int i, String n) {
ID = i;
name = n;
}
st1:Student
- ID
- name
st2:Student
- ID
- name
st1.setInfo(1, "NVA");
??
CT176 – Lập trình Hướng đối tượng 127 TS. Trần Công Án
Biến tham chiếu this
• Trong tất cả các phương thức không tĩnh, tất cả các 
lệnh truy xuất vào các dữ liệu thành viên không tĩnh sẽ 
được tự động thêm vào tham chiếu this:
 Thêm về lớp và đối tượng
Student
- int ID
- String name
+ . . .
+ setInfo(int i, String n) {
ID = i;
name = n;
}
st2:Student
- ID
- name
st1:Student
- ID
- name
1
NVA
sv1.setInfo(1, "NVA");
+ setInfo(int i, String n) {
this.ID = i;
this.name = n;
}
sv1.ID = i;
sv1.name = n;
this = sv1
CT176 – Lập trình Hướng đối tượng 128 TS. Trần Công Án
Biến tham chiếu this
• Biến tham chiếu this có thể được sử dụng một cách 
tường minh để tránh trùng tên
 Thêm về lớp và đối tượng
class Student {
private int ID;
private String name;
//... 
public void setInfo(int ID, String name) {
ID = ID;
name = name;
}
}
Hai tham số của phương thức 
sẽ che đi các dữ liệu thành
viên
public void setInfo(int ID, String name) {
this.ID = ID;
this.name = name;
}
CT176 – Lập trình Hướng đối tượng 129 TS. Trần Công Án
Mảng (array)
 Mảng (array)
CT176 – Lập trình Hướng đối tượng 130 TS. Trần Công Án
Mảng (array)
• Là một dãy các phần tử (giá trị) có cùng kiểu dữ liệu
• Là một biến kiểu tham chiếu:
 Khai báo: [];
 Tạo mảng: = new [];
double gpa[];
gpa = new double[5];
• Có thể vừa khai báo vừa khởi tạo
int []number = {2, 4, 6, 8};
String []monthName = {"Jan", "Feb", "March",};
 Mảng (array)
0 1 2 3 4
gpa
CT176 – Lập trình Hướng đối tượng 131 TS. Trần Công Án
Mảng (array)
• Các phần tử của mảng được truy xuất thông qua chỉ số
• Chỉ số của mảng bắt đầu từ 0
 Mảng (array)
public class Fibonaci {
public static void main(String args[]) {
int fibo[] = new int [10];
fibo[0] = fibo[1] = 1;
for (int i=2; i< 10; i++)
fibo[i] = fibo[i-1] + fibo[i-2];
for (int i=0; i< 10; i++)
System.out.print(fibo[i] + " ");
}
}
CT176 – Lập trình Hướng đối tượng 132 TS. Trần Công Án
Mảng (array)
• Mảng các đối tượng:
 Mảng (array)
p
0 1 2 3 4
p
0 1 2 3 4
p
Person
Person []prs;
prs = new Person[5];
prs[0] = new Person();
//...
prs[0].setName("Tommy");
prs[0].setAge(20);
for (Person t : prs) {
System.out.println(t.getName());
}
CT176 – Lập trình Hướng đối tượng 133 TS. Trần Công Án
Xử lý ngoại lệ
 Xử lý ngoại lệ
CT176 – Lập trình Hướng đối tượng 134 TS. Trần Công Án
Xử lý ngoại lệ (exception handling)
• Ngoại lệ: là một lỗi xảy ra khi thực thi chương trình:
 Ví dụ: chia cho 0, mở tập tin không tồn tại,
• Khi một lỗi xảy ra, một đối tượng ngoại lệ sẽ sinh ra và 
chương trình phải “bắt” và xử lý ngoại lệ
• Bắt ngoại lệ: dùng câu lệnh trycatchfinally
• Xử lý ngoại lệ:
 Truyền tiếp ngoại lệ: “quẳng” ngoại lệ cho nơi khác trong 
chương trình xử lý
 Khắc phục lỗi để chương trình có thể tiếp tục
 Xử lý ngoại lệ
CT176 – Lập trình Hướng đối tượng 135 TS. Trần Công Án
Xử lý ngoại lệ (exception handling)
• Bắt ngoại lệ:
try {
//các câu lệnh có khả năng 
//sinh ra lỗi
}
catch () {
//xử lý ngoại lệ 1
}
...
catch () {
//xử lý ngoại lệ n
}
finally {
//các lệnh sẽ được thực hiện
//cả trong trường hợp có và 
//không có ngoại lệ xảy ra
}
• Lưu ý:
 Khối lệnh finally là không 
bắt buộc
 Các loại ngoại lệ trong 
Java được tổ chức theo 
dạng cây phân cấp với gốc 
cây phân cấp là Exception
 Xử lý ngoại lệ
CT176 – Lập trình Hướng đối tượng 136 TS. Trần Công Án
Xử lý ngoại lệ (exception handling)
 Xử lý ngoại lệ
CT176 – Lập trình Hướng đối tượng 137 TS. Trần Công Án
Xử lý ngoại lệ (exception handling)
 Xử lý ngoại lệ
import java.util.Scanner;
import java.util.InputMismatchException;
class ExceptionHandling {
public static void main(String args[]) {
int a, b, x;
Scanner s = new Scanner(System.in);
System.out.print("Nhap a: ");
a = s.nextInt();
s.nextLine();
System.out.print("Nhap b: ");
b = s.nextInt();
s.nextLine();
//. . . 
}
}
CT176 – Lập trình Hướng đối tượng 138 TS. Trần Công Án
Xử lý ngoại lệ (exception handling)
 Xử lý ngoại lệ
import java.util.Scanner;
import java.util.InputMismatchException;
class ExceptionHandling {
public static void main(String args[]) {
int a, b, x;
Scanner s = new Scanner(System.in);
while (true) {
try {
System.out.print("Nhap a: ");
a = s.nextInt();
}
catch (InputMismatchException e) {
System.out.println("Khong hop le, moi ban nhap lai");
continue;
}
finally {
s.nextLine();
}
break;
} //while
//tiếp tục nhập b, ...
} //main
}
CT176 – Lập trình Hướng đối tượng 139 TS. Trần Công Án
Truyền tiếp ngoại lệ
• Nếu không muốn xử lý một ngoại lệ sinh ra do một câu 
lệnh nào đó trong một phương thức A:
 Phương thức A có thể “truyền tiếp” ngoại lệ cho các phương 
thức nào sẽ gọi phương thức A xử lý
 Cú pháp: thêm lệnh 
throws 
vào sau khai báo phương thức, trước dấu ngoặc nhọn {
 Xử lý ngoại lệ
public void writeFile(String fname,...) throws IOException {
//lệnh đọc/ghi file (có thể sinh ra IOException)
}
CT176 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Question?
CT176 – Lập trình Hướng đối tượng 141 TS. Trần Công Án
Tổng kết
CT176 – Lập trình Hướng đối tượng 142 TS. Trần Công Án
Tổng kết
 Tổng kết
Interactive map: https://goo.gl/BrfGz5
CT176 – Lập trình Hướng đối tượng 143 TS. Trần Công Án
Tổng kết
 Tổng kết
CT176 – Lập trình Hướng đối tượng 144 TS. Trần Công Án
Tổng kết
 Tổng kết
CT176 – Lập trình Hướng đối tượng 145 TS. Trần Công Án
Tổng kết
 Tổng kết
CT176 – Lập trình Hướng đối tượng 146 TS. Trần Công Án
Tổng kết
 Tổng kết
CT176 – Lập trình Hướng đối tượng 147 TS. Trần Công Án
Quiz
CT176 – Lập trình Hướng đối tượng 148 TS. Trần Công Án
Quiz
1. Chương trình nào sau đây là trình biên dịch Java?
a) command prompt
b) java
c) javac
d) netbean
2. Cú pháp khai hàm main() nào sau đây là đúng?
a) public void main(String args)
b) public void main(String []args)
c) public void main(String args[])
d) public static void main(String args[])
e) Tất cả đều đúng
 Quiz
CT176 – Lập trình Hướng đối tượng 149 TS. Trần Công Án
Quiz
3. Để dịch chương trình Java sang mã bytecode, ta dùng lệnh:
a) java
b) javac
c) compile
d) run
4. Chương trình nào sau đây chứa các 
a) do  while
b) for
c) while
d) if  else
e) switch  case
 Quiz
CT176 – Lập trình Hướng đối tượng 150 TS. Trần Công Án
Quiz
5. Chương trình nào sau đây là máy ảo Java?
a) Command Prompt
b) java
c) javac
d) NetBean
e) Tất cả đều đúng
6. Câu lệnh khai báo mảng nào sau đây là đúng?
a) int []myList = {"1", "2", "3"};
b) int []myList = (5, 8, 2);
c) int myList[][] = {4,9,7,0};
d) int myList[] = {4, 3, 7};
 Quiz
CT176 – Lập trình Hướng đối tượng 151 TS. Trần Công Án
Quiz
7. Khai báo biến nào sau đây là đúng?
a) float f1 = -343;
b) float f2 = 3.14;
c) float f3 = 0x12345;
d) float f4 = 42e7;
e) float f5 = 2001.0D;
f) float f6 = 2.81F;
8. Câu lệnh khai báo mảng nào sau đây là đúng (chọn 3 câu)?
a) int []myScores[];
b) char []myChars;
c) int [6]myScores;
d) Dog myDogs[];
e) Dog myDogs[7];
 Quiz
CT176 – Lập trình Hướng đối tượng 152 TS. Trần Công Án
Quiz
9. Khai báo biến nào sau đây là đúng?
a) float f1 = -343;
b) float f2 = 3.14;
c) float f3 = 0x12345;
d) float f4 = 42e7;
e) float f5 = 2001.0D;
f) float f6 = 2.81F;
 Quiz
CT176 – Lập trình Hướng đối tượng 153 TS. Trần Công Án
Quiz
9. Cho đoạn chương trình sau:
switch(x) {
default:
System.out.println("Hello");
}
Các kiểu dữ liệu nào là hợp lệ với x?
a) byte
b) long
c) char
d) float
e) Tất cả đều đúng
 Quiz
CT176 – Lập trình Hướng đối tượng 154 TS. Trần Công Án
Quiz
10. Cho đoạn chương trình sau, chọn câu phát biểu đúng:
public void foo( boolean a, boolean b) {
if (a) {
System.out.println("A"); /* Line 3 */
}
else if(a && b) { /* Line 5 */
System.out.println( "A && B");
}
else { /* Line 8 */
if (!b) {
System.out.println( "notB") ;
}
else {
System.out.println( "ELSE" ) ;
}
}
}
 Quiz
a) Nếu a = true và b = true, kết xuất 
của chương trình là “A && B”
b) Nếu a = true và b = false, kết xuất 
của chương trình là “notB”
c) Nếu a = false và b = true, kết xuất 
của chương trình là “ELSE”
d) Nếu a = false và b = false, kết xuất 
của chương trình là “ELSE”
CT176 – Lập trình Hướng đối tượng 155 TS. Trần Công Án
Quiz
11. Cho đoạn chương trình sau, chọn câu phát biểu đúng:
public void test(int x) {
int odd = 1;
if(odd) { /* Line 3 */
System.out.println("odd");
}
else {
System.out.println("even");
}
}
a) Lỗi biên dịch
b) Chương trình hiển thị “odd”
c) Chương trình hiển thị “even”
d) Nếu x chẵn thì hiển thị “even”, nếu x lẻ hiển thị “odd”
 Quiz
CT176 – Lập trình Hướng đối tượng 156 TS. Trần Công Án
Quiz
12. Một phương thức của lớp có thể truy cập những thành phần 
nào của lớp đó?
a) public
b) private
c) Protected
d) default
13. Cho một lớp tên Test, khai báo hàm xây dựng nào sau đây của 
lớp Test là đúng?
a) Test()
b) public Test()
c) Test(void)
d) public Test(void)
 Quiz
CT176 – Lập trình Hướng đối tượng 157 TS. Trần Công Án
Phụ lục
CT176 – Lập trình Hướng đối tượng 158 TS. Trần Công Án
Lớp String
• Trữ các chuỗi và cung cấp các thao tác trên chuỗi
String s = "Hello";
String s = new String("Hello");
• Không thể thay đổi giá trị của chuỗi (immutable)
 Các phương thức của lớp này thường trả về 1 chuỗi
s = s.concat("World");
s = s.replace("W", " W");
 Phụ lục
CT176 – Lập trình Hướng đối tượng 159 TS. Trần Công Án
Lớp String
• char charAt(int index)
• int length()
• String substring(int beginIndex)
• String substring(int beginIndex, int endIndex)
• boolean contains(CharSequence s)
• boolean equals(Object another)
• boolean isEmpty()
• String concat(String str)
• String replace(String oldStr, String newStr)
• String trim()
• int indexOf(String substring)
• int indexOf(String substring, int fromIndex)
• String toLowerCase()
• String toUpperCase()
 Phụ lục
CT176 – Lập trình Hướng đối tượng 160 TS. Trần Công Án
Lớp Math
• Cung cấp các hàm toán học
• Hầu hết các phương thức là tĩnh (static, gọi từ lớp)
• Một số hàm thông dụng như: 
 double/float/int/long abs(double/float/int/long);
 double log/log10(double);
 long/int round(double/float);
 double sqrt(double);
 double random();
• Một số hàm khác: sin, cos, asin, acos, exp, 
floor, ceil, pow, min, max
 Phụ lục
            Các file đính kèm theo tài liệu này:
 bai_giang_lap_trinh_huong_doi_tuong_chuong_2_ngon_ngu_lap_tr.pdf bai_giang_lap_trinh_huong_doi_tuong_chuong_2_ngon_ngu_lap_tr.pdf