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.0và " 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
إرسال تعليق