Bài Tập về Class
1.1 Ex: Circle Class (Giới thiệu về Classes và Instances)
Bài tập đầu tiên này sẽ dẫn bạn qua tất cả các khái niệm cơ bản trong OOP.
Một lớp được gọi circle
được thiết kế như thể hiện trong sơ đồ lớp sau. Nó chứa:
- Hai
private
biến đối tượng (instance variables): radius
(thuộc loại double
) và color
(thuộc loại String
), với giá trị mặc định là 1.0
và " red
", tương ứng.
- Hai hàm tạo quá tải (overloaded constructor) - một hàm tạo mặc định không có đối số và hàm tạo có một đối số kép cho bán kính. (hàm tạo - constructor, overloaded - quá tải)
- Hai
public
phương thức: getRadius()
và getArea()
, trả về bán kính và diện tích của thể hiện này, tương ứng.
Mã nguồn cho Circle.java
như sau:
public class Circle {
private double radius;
private String color;
public Circle() {
radius = 1.0;
color = "red";
}
public Circle(double r) {
radius = r;
color = "red";
}
public double getRadius() {
return radius;
}
public double getArea() {
return radius*radius*Math.PI;
}
}
Biên dịch " Circle.java
". Bạn có thể chạy thẳng từ lớp Circle
không? Tại sao?
Trong lớp Circle
không có một hàm main()
. Do đó, nó không thể được chạy trực tiếp. Trong lớp Circle
là một “khối xây dựng” và có nghĩa là nó sinh ra để được sử dụng trong một chương trình khác.
Bây giờ chúng ta hãy viết một chương trình thử nghiệm được gọi là TestCircle
(trong một tệp nguồn khác được gọi TestCircle.java
) sử dụng lớp Circle
này, như sau:
public class TestCircle {
public static void main(String[] args) {
Circle c1 = new Circle();
System.out.println("The circle has radius of "
+ c1.getRadius() + " and area of " + c1.getArea());
Circle c2 = new Circle(2.0);
System.out.println("The circle has radius of "
+ c2.getRadius() + " and area of " + c2.getArea());
}
}
Nào, bây giờ chúng ta hãy chạy class TestCircle
và nghiên cứu kết quả trả về.
Các Khái Niệm OOP Cơ Bản
- Constructor - Hàm Tạo: Chỉnh sửa class
Circle
thành ba hàm tạo (constructor) để khởi tạo các đối tượng (thể hiện) Circle
cùng với hai tham số - một là double
cho radius
và một là String
cho color
.
public Circle (double r, String c) { ...... }
Chỉnh sửa chương trình kiểm thử TestCircle
để tạo ra một thể hiện Circle
sử dụng constructor này.
- Getter: Thêm một getter cho biến
color
để lấy ra màu hiện tại color
của thể hiện này.
public String getColor() { ...... }
Chỉnh sửa TestCircle để test được method getColor() này.
- public vs. private: Trong class
TestCircle
, bạn thử cố gắng truy cập đến instance variable radius
một cách trực tiếp (ví dụ, System.out.println(c1.radius)
); hoặc gán giá trị mới cho radius
(ví dụ, c1.radius=5.0
)? Hãy cố gắng truy cập nó từ bên ngoài class Circle và bạn hãy phân tích thông báo lỗi nhận được.
- Setter: Chúng ta có thể cần thay đổi giá trị của
radius
và color
thuộc Circle
instance sau khi nó được khởi tạo? Do đó, bạn hãy add thêm hai phương thức public
methods được gọi là setters để thay đổi giá trị của radius
và color
của Circle
instance như hình dưới đây:
public void setRadius(double newRadius) {
radius = newRadius;
}
public void setColor(String newColor) { ...... }
Modify the TestCircle
to test these methods, e.g.,Circle c4 = new Circle();
c4.setRadius(5.0);
System.out.println("radius is: " + c4.getRadius());
c4.setColor(......);
System.out.println("color is: " + c4.getColor());
System.out.println(c4.setRadius(4.0));
- Từ khoá "this":Thay vì chúng ta sử dụng các biến được đặt tên như
r
(cho radius
) và c
(cho color
) trong các tham số của method, tốt hơn ta hãy sử dụng tên biến radius
(cho radius
) và color
(cho color
) và sử dụng từ khoá đặc biệt này "this
" để giải quyết vấn đề xung đột tên biến của class (instance variables) và các tham số của phương thức. Ví dụ,
private double radius;
public Circle(double radius) {
this.radius = radius;
color = .......
}
public void setRadius(double radius) {
this.radius = radius;
}
Chỉnh sửa Toàn Bộ constructors và setters trong Circle
class sử dụng từ khoá this "this
".
- Method toString(): Toàn bộ các Java class được thiết kế tốt sẽ chứa các phương thức public được gọi là toString()để trả về một chuỗi mô tả ngắn gọn thông tin của instance (trong đó return type là String). Phương thức
toString()
có thể được gọi một cách tường minh thông qua tên (ví dụ instanceName.toString()
) cũng tương tự như các method khác, hoặc gọi một cách ngầm định thông qua println()
. Nếu một instance được truyền vào method println(anInstance)
, phương thức toString()
của instance đó sẽ ngầm định được gọi. Ví dụ, chúng ta thêm phương thức toString()
vào trong class Circle
như hình dưới đây
public String toString() {
return "Circle[radius=" + radius + " color=" + color + "]";
}
Dưới đây là ví dụ về gọi tường minh toString()
một cách trực tiếp giống như các phương thức khác:
Circle c1 = new Circle(5.0);
System.out.println(c1.toString());
Còn đây toString()
được gọi một cách ngầm định thông qua truyền đối tượng vào phương thức println()
như ví dụ dưới đây
Circle c2 = new Circle(1.2);
System.out.println(c2.toString());
System.out.println(c2);
System.out.println("Operator '+' invokes toString() too: " + c2);
Cuối cùng, class diagram cho lớp Circle
như sau:
1.2 Ex: Circle Class
1.3 Ex: Rectangle Class
1.4 Ex: Employee Class
1.5 Ex: InvoiceItem Class
1.6 Ex: Account Class
1.7 Ex: Date Class
1.8 Ex: Time Class
Đăng nhận xét