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
160 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 1316 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Lập trình hướng đối tượng - Chapter 2: Ngôn ngữ lập trình java, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
m printf() của C
System.out.printf("Phuong trinh co nghiem %.2f",
-(float)b/a);
Cú pháp định dạng có thể tham khảo tại:
https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax
Nhập/Xuất căn bản
CT176 – Lập trình Hướng đối tượng 51 TS. Trần Công Án
Đọc dữ liệu từ bàn phím
• Muốn nhập dữ liệu từ bàn phím, ta dùng lớp
Scanner, kết hợp với System.in như sau:
Tạo một Scanner:
Scanner keyboard = new Scanner(System.in);
Lớp Scanner được định nghĩa trong java.util, vì vậy ta
phải thêm vào lệnh sau ở đầu chương trình:
import java.util.Scanner;
Đọc dữ liệu từ bàn phím: dùng các hàm
o String nextLine(): đọc một chuỗi ký tự
o int nextInt(): đọc một số nguyên kiểu int
o long nextLong(): đọc một số nguyên kiểu long
o float nextFloat(): đọc một số thực kiểu float
o ...
Nhập/Xuất căn bản
CT176 – Lập trình Hướng đối tượng 52 TS. Trần Công Án
Đọc dữ liệu từ bàn phím
• Lưu ý: g/sử a, b khác 0 và phương trình luôn có nghiệm
Nhập/Xuất căn bản
import java.util.Scanner;
public class PTB1 {
public static void main(String args[]) {
//Tạo đối tượng thuộc lớp Scanner để nhập dữ liệu từ bàn phím
Scanner keyboard = new Scanner(System.in);
int a, b;
System.out.print("a = ");
a = keyboard.nextInt(); //đọc một số nguyên
System.out.print("b = ");
b = keyboard.nextInt();
System.out.printf("Nghiem cua PT x = %.2f", -(float)b/a);
}
}
CT176 – Lập trình Hướng đối tượng 53 TS. Trần Công Án
Đọc dữ liệu từ bàn phím
• Chú ý tr/hợp dữ liệu còn sót trong bộ đệm bàn phím
Nhập/Xuất căn bản
import java.util.Scanner;
public class ScannerFlush {
public static void main(String args[]) {
//Tạo đối tượng thuộc lớp Scanner để nhập dữ liệu từ bàn phím
Scanner keyboard = new Scanner(System.in);
String name;
long ID;
System.out.print("Enter your ID: ");
ID = keyboard.nextLong();
System.out.print("Enter your name: ");
name = keyboard.nextLine();
System.out.println("ID :" + ID + ", name: " + name);
}
}
keyboard.nextLine();
CT176 – Lập trình Hướng đối tượng 54 TS. Trần Công Án
Cấu trúc điều khiển trong Java
Cấu trúc điều khiển trong Java
CT176 – Lập trình Hướng đối tượng 55 TS. Trần Công Án
Cấu trúc điều khiển (control structure)
• Cấu trúc điều khiển: điều khiển cách thức thực hiện các
lệnh trong chương trình.
• Có 3 cấu trúc điều khiển:
Tuần tự (sequence, mặc nhiên)
Lựa chọn (selection)
Lặp (repetition)
Cấu trúc điều khiển trong Java
Câu lệnh 1
Câu lệnh 2
Câu lệnh n
. . .
CT176 – Lập trình Hướng đối tượng 56 TS. Trần Công Án
Cấu trúc rẽ nhánh (selection structure)
• Lựa chọn 1 trong 2 công việc (khối lệnh) để thực hiện
dựa trên 1 điều kiện cho sẵn.
• Các lệnh rẽ nhánh:
if else
switch case
Cấu trúc điều khiển trong Java
Biểu thức
điều kiện
Khối lệnh 1 Khối lệnh 2
saiđúng
CT176 – Lập trình Hướng đối tượng 57 TS. Trần Công Án
Lệnh rẽ nhánh if else
• Lệnh if đầy đủ:
if (biểu thức điều kiện) {
statement T;
}
else {
statement F;
}
Nếu điều kiện đúng, thực hiện statement T, ngược lại
thực hiện statement F.
Statement T/F có thể là một hoặc nhiều câu lệnh
Trong trường hợp chỉ có 1 câu lệnh thì không cần cặp dấu
ngoặc nhọn
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
CT176 – Lập trình Hướng đối tượng 58 TS. Trần Công Án
Lệnh rẽ nhánh if else
• Ví dụ: tìm giá trị lớn nhất (max):
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
if (x > y) {
max = x;
}
else {
max = y;
}
x > y ?max = x max = y
saiđúng
CT176 – Lập trình Hướng đối tượng 59 TS. Trần Công Án
Lệnh rẽ nhánh if else
• Lệnh rẽ nhánh if không có mệnh đề else:
if (biểu thức điều kiện) {
statement T;
}
Nếu điều kiện đúng, thực hiện statement T
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
if (x < 0) {
x = -x;
}
x < 0 ? x = -x
đúng
sai
Tìm giá trị tuyệt đối
CT176 – Lập trình Hướng đối tượng 60 TS. Trần Công Án
Lệnh rẽ nhánh if else
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
import java.util.Scanner;
public class PTB1 {
public static void main(String args[]) {
Scanner keyboard = new Scanner(System.in);
int a, b;
System.out.print("a = ");
a = keyboard.nextInt();
System.out.print("b = ");
b = keyboard.nextInt();
if (a == 0) {
if (b == 0)
System.out.println("PT vo so nghiem");
else
System.out.println("PT vo nghiem");
}
else
System.out.printf("PT co nghiem x = %.2f", -(float)b/a);
}
}
CT176 – Lập trình Hướng đối tượng 61 TS. Trần Công Án
Lệnh lựa chọn switch case
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
switch (exp) {
case value1:
statements_1;
break;
case value_2:
statements_2;
break;
...
case value_n:
statements_n;
break;
default:
statements;
}
Không
bắt buộc
. . .
Statements_ 1exp=value_1?
exp=value_2?
exp=value_n?
default?
Statements_ 2
sai
đúng
break
(nếu ko có break)
break
sai
đúng
Statements_n break
đúng
(nếu ko có break)
(nếu ko có break)
Statements
sai
có
không
CT176 – Lập trình Hướng đối tượng 62 TS. Trần Công Án
Lệnh lựa chọn switch case
• Giải thích:
exp phải là một biểu thức có giá trị kiểu số nguyên hoặc kiểu
ký tự (từ Java 7 trở đi có thể là kiểu chuỗi)
Mệnh đề case nào có giá trị bằng với giá trị của exp, thì các
câu lệnh từ mệnh đề case đó cho đến hết lệnh switch sẽ
được thực hiện, hoặc cho đến khi gặp lệnh break
Lệnh break dùng để thoát ra khỏi cấu trúc switch
Các câu lệnh trong mệnh đề default (không bắt buộc) sẽ
được thực hiện nếu giá trị của exp không nằm trong các giá
trị được liệt kê trong các mệnh đề case
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
CT176 – Lập trình Hướng đối tượng 63 TS. Trần Công Án
Lệnh lựa chọn switch case
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
switch (grade)
{
case 'A':
System.out.println("The grade is A.");
break;
case 'B':
System.out.println("The grade is B.");
break;
case 'C':
System.out.println("The grade is C.");
break;
case 'D':
System.out.println("The grade is D.");
break;
case 'F':
System.out.println("The grade is F.");
break;
default:
System.out.println("The grade is invalid.");
}
CT176 – Lập trình Hướng đối tượng 64 TS. Trần Công Án
Lệnh lựa chọn switch case
Cấu trúc điều khiển trong Java ⤷ Cấu trúc rẽ nhánh
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("31-day month");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("30-day month");
break;
default:
System.out.println("28/29-day month");
}
CT176 – Lập trình Hướng đối tượng 65 TS. Trần Công Án
Cấu trúc lặp (repetition/loop)
• Được sử dụng để thực hiện lặp đi lặp lại 1 tác vụ (khối
lệnh) 1 số lần dựa vào điều kiện cho trước
• Các lệnh lặp:
while
for
do while
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
Biểu thức
điều kiện
Câu lệnh 1 . . .
sai
Câu lệnh n
đúng
CT176 – Lập trình Hướng đối tượng 66 TS. Trần Công Án
Lệnh lặp while
1. Kiểm tra “biểu thức điều
kiện”
2. Nếu đúng, thực hiện thân
vòng lặp
Ngược lại, thoát khỏi
vòng lặp
3. Trở lại bước 1.
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
while (biểu thức điều kiện) {
câu lệnh 1;
. . .
câu lệnh n;
}
Biểu thức
điều kiện
Câu lệnh 1 . . .
sai
Câu lệnh n
đúng
thân vòng lặp
CT176 – Lập trình Hướng đối tượng 67 TS. Trần Công Án
Lệnh lặp while
• Lưu ý:
Điều kiện được kiểm tra trước khi thực hiện thân vòng lặp
⇒ Thân vòng có thể không được thực hiện lần nào cả nếu
điều kiện sai từ đầu
Vòng lặp với số lần lặp vô tận được gọi là vòng lặp vô tận
(infinite loop)
Để không bị trường hợp lặp vô tận, trong thân vòng lặp phải
có ít nhất 1 lệnh thay đổi giá trị của biểu thức điều kiện
Vòng lặp while thường được sử dụng cho các trường hợp
chưa xác định số lần lặp
int x = 20;
while (x > 0)
System.out.println("x is greater than 0");
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
CT176 – Lập trình Hướng đối tượng 68 TS. Trần Công Án
Lệnh lặp while
• Ví dụ: Hiển thị các giá trị 2i với 2i <= 2N, N được truyền
qua đối số dòng lệnh.
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
public class PowersOfTwo {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
int i = 0;
int v = 1;
while (i <= N) {
System.out.println(i + "\t" + v);
i = i + 1;
v = 2 * v;
}
}
}
$java PowersOfTwo 6
args[0]
CT176 – Lập trình Hướng đối tượng 69 TS. Trần Công Án
Lệnh lặp do while
1. Thực hiện thân vòng lặp
2. Định giá “biểu thức điều
kiện”:
a) Nếu đúng, trở lại bước 1
b) Ngược lại, thoát khỏi vòng lặp
• Nhận xét:
Thân vòng lặp luôn được thực
hiện ít nhất 1 lần
Chú ý trường hợp vòng lặp vô
tận
Thường được sử dụng trong
trường hợp số lần lặp chưa xác
định
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
do {
câu lệnh 1;
. . .
câu lệnh n;
} while (biểu thức điều kiện);
thân vòng lặp
Biểu thức
điều kiện
Câu lệnh 1
. . .
sai
Câu lệnh n
đúng
CT176 – Lập trình Hướng đối tượng 70 TS. Trần Công Án
Lệnh lặp do while
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
import java.util.Scanner; // Needed for the Scanner class
public class DoWhileSqrt {
public static void main(String[] args) {
int n; // number that will be calculated the square root
char repeat; // To hold 'y' or 'n'
Scanner keyboard = new Scanner(System.in);
do {
System.out.print("Enter a number: ");
n = keyboard.nextInt();
keyboard.nextLine();
System.out.println("SQRT of " + n + " is " + Math.sqrt(n));
System.out.print("Continue (y/n)? ");
repeat = keyboard.nextLine().charAt(0); // Read a line.
} while (repeat == 'Y' || repeat == 'y');
}
}
CT176 – Lập trình Hướng đối tượng 71 TS. Trần Công Án
Lệnh lặp for
1. Thực hiện biểu thức khởi tạo
2. Định giá “biểu thức điều kiện”:
a) Nếu sai, thoát khỏi vòng lặp
b) Nếu đúng, sang bước 3
3. Thực hiện thân vòng lặp
4. Thực hiện biểu thức tăng/lặp
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
for (init; condition; increment) {
statement 1;
...
statement n;
}
thân vòng lặp
condition?
init
. . .
Statement 1
đúng
Statement n
increment
sai
CT176 – Lập trình Hướng đối tượng 72 TS. Trần Công Án
Lệnh lặp for
• Nhận xét:
Biểu thức khởi tạo (init) được thực hiện 1 lần duy nhất trước
khi vào vòng lặp.
o Có thể khai báo biến trong biểu thức khởi tạo
Chức năng của biểu thức điều kiện tương tự lệnh lặp while
Biểu thức lặp/tăng (increment) được thực hiện sau mỗi lần
thực hiện xong thân vòng lặp
Cả ba biểu thức trong lệnh lặp đều không bắt buộc
Lệnh lặp for thường được sử dụng trong trường hợp biết
trước số lần lặp
Lệnh lặp for chuyển về lệnh lặp while và ngược lại
Biểu thức khởi tạo và lặp có thể chứa nhiều lệnh, cách nhau
bằng dấu ,
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
CT176 – Lập trình Hướng đối tượng 73 TS. Trần Công Án
Lệnh lặp for
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
import java.util.Scanner; // Needed for the Scanner class
public class ForSum_1_N {
public static void main(String[] args) {
int n;
Scanner keyboard = new Scanner(System.in);
// Get the maximum value to display.
System.out.print("n = ");
n = keyboard.nextInt();
// Calculate the sum
int sum = 0;
for (int i = 1; i <= n; i++)
sum += i;
System.out.println("1 + 2 + ... + " + n + " = " + sum);
}
}
CT176 – Lập trình Hướng đối tượng 74 TS. Trần Công Án
Lệnh lặp for
• Chuyển đổi giữa lệnh lặp for và while
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
for (init; condition; increment) {
statement 1;
...
statement n;
}
init;
while (condition) {
statement 1;
. . .
statement n;
increment;
}
while (condition) {
statement 1;
. . .
statement n;
}
for (; condition; ) {
statement 1;
...
statement n;
}
CT176 – Lập trình Hướng đối tượng 75 TS. Trần Công Án
Lệnh lặp for
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
int i = 0;
int v = 1;
while (i <= N) {
System.out.println(i + "\t" + v);
v = 2 * v;
i = i + 1;
}
int v = 1;
for (int i=0; i <= N; i++)) {
System.out.println(i + "\t" + v);
v = 2 * v;
}
khởi tạo
Biểu thức tăng
for (int i=0, int v=1; i <= N; i++, v *= 2)) {
System.out.println(i + "\t" + v);
}
Thông thường
CT176 – Lập trình Hướng đối tượng 76 TS. Trần Công Án
Các cấu trúc điều khiển lồng nhau
• Các cấu trúc điều khiển có thể được lồng nhau:
Cấu trúc điều khiển trong Java ⤷ Cấu trúc lặp
if (a == 0) {
if (b == 0)
System.out.println(“PT vo nghiem");
else
System.out.println(“PT vo so nghiem");
}
else {
...
}
for (int i=0; i<5; i++) {
for (int j=0; j <= i; j++)
System.out.print("*");
System.out.println("");
}
int sum = 0;
for (int i=0; i < N; i++) {
if (i % 2 == 0)
sum += i;
}
Tính tổng các số chẵn từ 1..N
Giải PT bậc 1
*
* *
* * *
* * * *
* * * * *
Hiển thị tam giác các dấu *
CT176 – Lập trình Hướng đối tượng 77 TS. Trần Công Án
Lệnh break và continue
• Lệnh break: Kết thúc một vòng lặp
Khi gặp lệnh break, vòng lặp sẽ kết thúc ngay lặp tức, bất kể
giá trị của biểu thức điều kiện
Lệnh này còn được sử dụng trong câu lệnh switch...case
• Lệnh continue: Bắt đầu chu kỳ lặp mới
Khi gặp lệnh continue, chương trình sẽ trở về đầu vòng lặp
để thực hiện chu kỳ lặp mới
Các lệnh dưới lệnh continue sẽ bị bỏ qua
• Chú ý: Chỉ sử dụng 2 lệnh này khi thật cần thiết vì
chúng phá vỡ tính cấu trúc của chương trình.
Cấu trúc điều khiển trong Java
CT176 – Lập trình Hướng đối tượng 78 TS. Trần Công Án
Lựa chọn lệnh lặp
• Lệnh lặp while:
Kiểm tra điều kiện trước (pre-test loop)
Thường được sử dụng cho vòng lặp không xác định
• Lệnh lặp dowhile:
Kiểm tra điều kiện sau (post-test loop)
• Lệnh lặp for:
Kiểm tra điều kiện trước (pre-test loop)
Thường được sử dụng trong trường hợp lặp với biến đếm
(counting variable), vòng lặp với số lần lặp xác định
Cấu trúc điều khiển trong Java
CT176 – Lập trình Hướng đối tượng 79 TS. Trần Công Án
Đối tượng và lớp
Đối tượng và lớp
CT176 – Lập trình Hướng đối tượng 80 TS. Trần Công Án
Đối tượng và lớp (object & class)
• Đối tượng:
Đối tượng là một thực thể phần mềm, hay là sự mô hình hóa
của một sự vật hay khái niệm trong thực tế
Chương trình là một tập các đối tượng “tương tác” lẫn nhau
Một đối tượng tồn tại trong bộ nhớ của chương trình, thực
hiện 1 tác vụ hay chức năng nào đó
Mỗi đối tượng có 2 thành phần:
o Dữ liệu (thuộc tính, attribute): mô tả cho trạng thái của đối tượng
o Hành vi (phương thức, method): thể hiện khả năng của đối tượng
Đối tượng cũng là 1 biến (variable) trong chương trình
Đối tượng và lớp
CT176 – Lập trình Hướng đối tượng 81 TS. Trần Công Án
Đối tượng và lớp (object & class)
• Lớp:
Là kiểu (type/datatype) của đối tượng: mỗi đối tượng phải
thuộc 1 kiểu (loại) nào đó
Là một đặc tả (specification) của một kiểu dữ liệu mới, nó mô
tả các thành phần của kiểu dữ liệu đó:
o Các dữ liệu mà một đối tượng thuộc lớp đó có thể lưu trữ
o Các phương thức của các đối tượng thuộc lớp đó
Có thể hiểu, lớp là một khuôn mẫu để tạo ra các đối tượng.
Ví dụ: String, Scanner là các lớp được định nghĩa sẵn của Java
o Các đối tượng thuộc lớp String có thể chứa các chuỗi ký tự
(String s = "Hello World";) và các thao tác trên chuỗi ký tự
(s.toLowerCase(); s.toUpperCase();)
Đối tượng và lớp
CT176 – Lập trình Hướng đối tượng 82 TS. Trần Công Án
Đối tượng và lớp (object & class)
• Biến kiểu dữ liệu cơ bản:
Chứa dữ liệu
Tác động lên dữ liệu: gọi các
hàm
• Đối tượng:
Chứa dữ liệu + các thao tác
(phương thức) trên dữ liệu
Tác động lên dữ liệu của đối
tượng: gọi các phương thức
của chính đối tượng
Đối tượng và lớp
int i = 5;
Math.sqrt(i);
String s = "Hellu World”;
s = s.replace("u", "o");
int len = s.length();
CT176 – Lập trình Hướng đối tượng 83 TS. Trần Công Án
Khai báo & tạo đối tượng
• Khai báo đối tượng: ;
• Đối tượng cũng là biến cú pháp giống khai báo biến,
trong đó tên lớp đóng vai trò kiểu dữ liệu.
• Tạo đối tượng: dùng toán tử new: new ;
• Một biến đối tượng được gọi là biến tham chiếu
(reference variable):
Bản thân biến không chứa dữ liệu, chỉ là một tham chiếu đến
đối tượng
Hay nói cách khác, biến tham chiếu chứa “địa chỉ” của đối
tượng mà nó tham chiếu đến
Muốn cho biến tham chiếu đến đối tượng, dùng phép gán =
Đối tượng và lớp
CT176 – Lập trình Hướng đối tượng 84 TS. Trần Công Án
Khai báo và tạo đối tượng
• Biến kiểu nguyên thủy
(primitive datatype variable)
Lưu trực tiếp dữ liệu vào
vùng nó được cấp phát
int x;
x = 45;
• Biến tham chiếu
(reference variable)
Lưu địa chỉ của đối tượng
mà nó tham chiếu đến
String s;
s=new String("Hello");
Có thể khai báo ngắn gọn:
String s = new String("Hello");
Đối tượng và lớp
???
45
???
Hello
x
x
s
&2345
s
&2345
CT176 – Lập trình Hướng đối tượng 85 TS. Trần Công Án
Truy xuất các thành phần của đối tượng
• Một đối tượng được truy xuất thông qua biến tham
chiếu đến nó
• Cú pháp: .
• Ví dụ: s.replace("u", "o");
s.toUpperCase();
• Lưu ý:
Từ bên ngoài lớp, chỉ được truy xuất đến các thành phần
public hoặc default (không khai báo thuộc tính truy cập)
Trong cùng một lớp, 1 phương thức có thể truy xuất tất cả
các thành phần khác
Đối tượng và lớp
CT176 – Lập trình Hướng đối tượng 86 TS. Trần Công Án
Tạo lớp căn bản
• Cú pháp tạo lớp:
Phạm vi truy cập: pubic, protected, private.
Trong một tập tin có thể định nghĩa nhiều lớp, tuy nhiên chỉ
được có nhiều nhất một lớp có phạm vi truy cập là public
Các phạm vi truy cập có liên quan đến khái niệm gói
(package) nên sẽ được đề cập sau
Tên lớp: đặt theo qui tắc đặt tên định danh. Thông thường
đặt theo qui tắc title case (chữ cái đầu tiên của mỗi từ được
viết hoa)
Đối tượng và lớp
[phạm vi truy cập] class {
//các thành phần của lớp: thuộc tính + phương thức
}
CT176 – Lập trình Hướng đối tượng 87 TS. Trần Công Án
Thuộc tính của lớp
• Thuộc tính: tương tự cú pháp khai báo biến
Thuộc tính truy cập: xác định thuộc tính có thể được truy cập
từ đâu, chỉ bên trong lớp hay có thể từ bên ngoài lớp,
o public: thuộc tính có thể được truy cập từ bất kỳ phạm vi nào
o private: thuộc tính chỉ có thể được truy cập từ bên trong lớp
Kiểu dữ liệu: có thể là một kiểu dữ liệu nguyên thủy hay lớp.
Tên thuộc tính: theo qui tắc và qui ước đặt tên biến
Lưu ý: các thuộc tính thường được khai báo là private và việc
truy xuất các thuộc tính sẽ thông qua các phương thức
Đối tượng và lớp ⤷ Tạo lớp căn bản
[thuộc tính truy cập] ;
CT176 – Lập trình Hướng đối tượng 88 TS. Trần Công Án
Phương thức của lớp
• Phương thức: tương tự cú pháp tạo hàm
Thuộc tính truy cập (modifier): qui định phương thức có thể
được truy cập từ đâu (tương tự như thuộc tính)
Kiểu dữ liệu trả về (return type): kiểu dữ liệu của giá trị trả về
của hàm, void nếu hàm không trả giá trị về
Danh sách tham số (parameters): các dữ liệu được truyền
vào cho phương thức
Thân hàm: các lệnh thực hiện tác vụ của hàm
Đối tượng và lớp ⤷ Tạo lớp căn bản
[access modifier] ([parameters]) {
//thân phương thức (hàm)
} prototype (nguyên mẫu/khai báo)
signature (chữ ký hàm)
CT176 – Lập trình Hướng đối tượng 89 TS. Trần Công Án
Lớp Diem2D
• Ví dụ 1: Tạo một lớp điểm trong
không gian hai chiều (2D)
Dữ liệu: mỗi điểm gồm tọa độ x, y
Phương thức: thiết đặt giá trị x, y;
hiển thị tọa độ ra màn hình; lấy giá
trị của x, lấy giá trị của y, nhập giá trị
cho x, y; tính khoảng cách đến 1
điểm khác;
Đối tượng và lớp ⤷ Tạo lớp căn bản
Diem2D
int x
int y
void ganXY(int, int)
void hienthi()
int layX()
int layY()
void nhap()
float khoangcach(Diem2D)
...
(x1, y1)
p1 ●
p2 ●
(x2, y2)
d(p1, p2)
CT176 – Lập trình Hướng đối tượng 90 TS. Trần Công Án
Lớp Diem2D
Đối tượng và lớp ⤷ Tạo lớp căn bản
public class Diem2D {
private int x, y; //thuộc tính x, y
public void ganXY(int h, int t) {
/* thân hàm */
}
public void hienthi() {
/* thân hàm */
}
public float khoangcach(Diem2D d) {
/* thân hàm */
}
//... Tương tự cho các phương thức khác
}
CT176 – Lập trình Hướng đối tượng 91 TS. Trần Công Án
Thuộc tính truy cập
• Chỉ định phạm vi truy cập tới các thành phần của lớp:
public: có thể truy cập từ bên trong lớp lẫn bên ngoài lớp
private: chỉ có thể được truy cập từ bên trong lớp
protected: có thể truy được truy cập từ bên trong lớp và
các lớp con (trong thừa kế)
Default (không khai báo): trong cùng gói (package), tương
đương public; khác gói, tương đương private
Đối tượng và lớp ⤷ Tạo lớp căn bản
class A
void funcA() {
B obj = new B();
obj.s = ;
obj.funcB();
a = obj.funcD();
}
obj : class B
private String s;
public void funcB();
int funcD();
CT176 – Lập trình Hướng đối tượng 92 TS. Trần Công Án
Định nghĩa phương thức
• Kiểu dữ liệu trả về (return type):
Phương thức: thực hiện một tác vụ (task) nào đó
⇒ có thể trả về 1 giá trị
Lệnh return được dùng để trả về 1 giá trị cho lời gọi hàm
Hàm có thể trả về 1 giá trị có kiểu dữ liệu nguyên thủy hoặc
một đối tượng
Nếu phương thức không trả về giá trị, kiểu dữ liệu trả về phải
được khai báo là void
Ví dụ:
o Hàm Math.sqrt() tính căn bậc 2 của của 1 số, trả về 1 số thực
⇒ kiểu dữ liệu trả về là double: double sqrt();
o Hàm System.out.println() hiển thị 1 chuỗi ra màn hình
⇒ không có giá trị trả về: void println();
Đối tượng và lớp ⤷ Tạo lớp căn bản
CT176 – Lập trình Hướng đối tượng 93 TS. Trần Công Án
Định nghĩa phương thức
• Cú pháp lệnh return:
return ;
Đối tượng và lớp ⤷ Tạo lớp căn bản
class Test {
public static void main(String []args) {
Test obj = new Test();
System.out.println(obj.random10());
}
//generate a random value in range of [0, 10)
public int random10() {
int r = (int)(Math.random() * 10);
return r;
}
}
Test
void main() {
System.out.println(obj.random10());
}
obj : Test
public int random10(){
return ...;
} a random number
CT176 – Lập trình Hướng đối tượng 94 TS. Trần Công Án
Định nghĩa phương thức
• Tham số của hàm (parameters):
Một số hàm cần phải được cung cấp dữ liệu để t/hiện tác vụ
Ví dụ: hàm tính căn bậc 2 Math.sqrt() cần phải được
truyền vào một giá trị nguyên/thực để nó có thể tính toán
Đối số: các dữ liệu truyền vào cho hàm
o Cú pháp khai báo 1 đối số:
o Các đối số cách nhau bằng dấu phẩy
Về bản chất, tham số chính là biến cục bộ của phương thức
Ví dụ:
o double sqrt(double n): hàm tính căn bậc hai, nhận vào một số
thực cần tính căn bậc hai
o void PTB1(int a, int b): hàm giải phương trình bậc 1, nhận
2 tham số kiểu int, là hai hệ số a và b
Đối tượng và lớp ⤷ Tạo lớp căn bản
CT176 – Lập trình Hướng đối tượng 95 TS. Trần Công Án
Định nghĩa phương thức
• Tham số của hàm (tt):
Tham số hình thức: là các tham số trong định nghĩa hay khai
báo hàm
Tham số thực tế: các biến, biểu thức được truyền vào trong
lời gọi hàm
Đối tượng và lớp ⤷ Tạo lớp căn bản
class Math {
public static double sqrt(double n) {
//định nghĩa hàm
}
} class Test {
public static void main(String args[]) {
double a = 2.0, b;
b = Math.sqrt(a);
}
} tham số thực tế
tham số hình thức
CT176 – Lập trình Hướng đối tượng 96 TS. Trần Công Án
Định nghĩa phương thức
• Tham số của hàm (tt):
Tham số kiểu dữ liệu nguyên thủy:
o Giá trị của tham số thực tế được truyền vào cho tham số hình thức
⇒ truyền bằng giá trị
o Thay đổi giá trị tham số hình thức không làm thay đổi giá trị của
tham số thực tế
Tham số kiểu dữ liệu tham chiếu (đối tượng):
o Địa chỉ của đối tượng được tham chiếu bởi tham số thực tế được
truyền vào cho tham số hình thức (cũng là một tham chiếu)
⇒ truyền bằng tham chiếu
o Cả t/số hình thức và t/số thực tế tham chiếu đến cùng 1 đối tượng
⇒ có thể thay đổi giá trị (thuộc tính) của đối tượng được tham chiếu
bởi tham số thực tế thông qua tham số hình thức
⇒ là một cách để truyền giá trị trả về cho lời gọi hàm
Đối tượng và lớp ⤷ Tạo lớp căn bản
CT176 – Lập trình Hướng đối tượng 97 TS. Trần Công Án
Định nghĩa phương thức
Đối tượng và lớp ⤷ Tạo lớp căn bản
class Test {
public static void main(String args[]) {
int count = 0;
Sinhvien sv1 = new Sinhvien();
test(count, sv1);
System.out.println("count = " + count);
sv1.hienthi();
}
public static void test(int c, Sinhvien sv) {
c = c + 1;
sv.mssv = c;
sv.hoten = "Sinh vien " + c;
}
}
class Sinhvien {
public int mssv;
public String hoten;
public void hienthi() {
System.out.println("MSSV: " + mssv +
", ho ten: " + hoten);
}
}
CT176 – Lập trình Hướng đối tượng 98 TS. Trần Công Án
Định nghĩa phương thức
Đối tượng và lớp ⤷ Tạo lớp căn bản
class Test {
public static void main(String args[]) {
int count = 0;
Sinhvien sv1 = new Sinhvien();
test(count, sv1);
System.out.println("count = " + count);
sv1.hienthi();
}
public static void test(int c, Sinhvien sv)
{
c = c + 1;
sv.mssv = c;
sv.hoten = "SV " + c;
}
}
mssv = 0
hoten = null
&
sv1
0
count
&
sv
0
c
mssv = 1
hoten = “SV 1”
&
sv1
0
count
&
sv
1
c
CT176 – Lập trình Hướng đối tượng 99 TS. Trần Công Án
Định nghĩa phương thức
• Ưu điểm của truyền bằng tham chiếu:
Tiết kiệm bộ nhớ: tham số kiểu tham chiếu chỉ chứa địa chỉ
được truyền vào, không phụ thuộc kích thước của đối tượng
Có thể sử dụng để trả về nhiều hơn một giá trị cho lời gọi
phương thức
Tăng tốc độ gọi hàm: chỉ sao chép tham chiếu chứ không sao
chép toàn bộ đối tượng (dữ liệu)
• Lưu ý: việc thay đổi tham chiếu của tham số hình thức
không làm thay đổi tham chiếu của tham số thực tế
Đối tượng và lớp ⤷ Tạo lớp căn bản
CT176 – Lập trình Hướng đối tượng 100 TS. Trần Công Án
Định nghĩa phương thức
Đối tượng và lớp ⤷ Tạo lớp căn bản
class Test {
public static void main(String args[]) {
int count = 0;
Sinhvien sv1 = new Sinhvien();
test(count, sv1);
System.out.println("count = " + count);
sv1.hienthi();
}
public static void test(int c, Sinhvien sv) {
c = c + 1;
sv = new Sinhvien();
sv.mssv = c;
sv.hoten = "Sinh vien " + c;
}
}
CT176 – Lập trình Hướng đối tượng 101 TS. Trần Công Án
Tái định nghĩa/Chồng phương thức
• Tái định nghĩa phương thức (method overloading): định
nghĩa các phương thức trùng tên
• Các phương thức trùng tên phải khác nhau về tham số
Khác nhau về số tham số
Khác nhau về kiểu tham số
Khác nhau về thứ tự các tham số
Đối tượng và lớp ⤷ Tạo lớp căn bản
class Point2D {
public void hienthi() {
System.out.println("(" + x + ", " + y + ")");
}
public void hienthi(String s) {
System.out.println(s + "(" + x + ", " + y + ")");
}
}
CT176 – Lập trình Hướng đối tượng 102 TS. Trần Công Án
Tái định nghĩa/Chồng phương thức
Hợp lệ:
public void func1();
public void func1(int);
public void func1(long);
public void func1(String, int);
public void func1(int, String);
Không hợp lệ:
public void func2(String);
public void func2(String);
public int func2(String);
public func3(int, long);
public func3(int long);
Đối tượng và lớp ⤷ Tạo lớp căn bản
CT176 – Lập trình Hướng đối tượng 103 TS. Trần Công Án
Khởi tạo và hủy đối tượng
Khởi tạo và hủy đối tượng
CT176 – Lập trình Hướng đối tượng 104 TS. Trần Công Án
Hàm xây dựng (constructor)
• Là một phương thức đặc biệt của lớp, dùng để khởi tạo
đối tượng (khởi tạo các dữ liệu thành viên)
• Có 2 loại:
Hàm khởi tạo không có tham số, còn được gọi là hàm xây
dựng mặc nhiên (default constructor)
Các hàm khởi tạo có tham số
• Cú pháp:
Phạm vi truy xuất: public
Tên hàm: trùng với tên lớp
Kiểu dữ liệu trả về: không có, kể cả void
Khởi tạo và hủy đối tượng
CT176 – Lập trình Hướng đối tượng 105 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";
}
public void hienthi() {
System.out.println("MSSV: " + mssv +
", ho ten: " + hoten);
}
}
class Test {
public static void main(String args[]) {
Sinhvien sv1 = new Sinhvien();
sv1.hienthi();
}
}
CT176 – Lập trình Hướng đối tượng 106 TS. Trần Công Án
Hàm xây dựng (constructor)
• Một số tính chất:
Hàm xây dựng sẽ tự động được gọi khi đối tượng được tạo ra
Hàm xây dựng cũng là 1 phương thức của lớp nên nó có thể
được tái định nghĩa (lưu ý qui tắc TĐN phương thức)
Trong trường hợp có nhiều hàm xây dựng, hàm nào được gọi
là tùy vào danh sách tham số truyền vào trong câu lệnh tạo
đối tượng
Lớp có bao nhiêu hàm xây dựng, có bấy nhiêu cách để tạo đối
tượng
Hàm xây dựng không thể được gọi trực tiếp
Nếu một lớp không 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:
- lap_trinh_huong_doi_tuongct176_oop_with_java_ch2_java_1slide_9878.pdf