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.
ExerciseOOP_Circle.png
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:
/*
 * The Circle class models a circle with a radius and color.
 */
public class Circle {  // Save as "Circle.java"
   // private instance variable, not accessible from outside this class
   private double radius;
   private String color;
   
   // The default constructor with no argument.
   // It sets the radius and color to their default value.
   public Circle() {
      radius = 1.0;
      color = "red";
   }
   
   // 2nd constructor with given radius, but color default
   public Circle(double r) {
      radius = r;
      color = "red";
   }
   
   // A public method for retrieving the radius
   public double getRadius() {
     return radius; 
   }
   
   // A public method for computing the area of circle
   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 {  // Save as "TestCircle.java"
   public static void main(String[] args) {
      // Declare an instance of Circle class called c1.
      // Construct the instance c1 by invoking the "default" constructor
      // which sets its radius and color to their default value.
      Circle c1 = new Circle();
      // Invoke public methods on instance c1, via dot operator.
      System.out.println("The circle has radius of " 
         + c1.getRadius() + " and area of " + c1.getArea());
   
      // Declare an instance of class circle called c2.
      // Construct the instance c2 by invoking the second constructor
      // with the given radius and default color.
      Circle c2 = new Circle(2.0);
      // Invoke public methods on instance c2, via dot operator.
      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
  1. 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.
    // 3rd constructor to construct a new instance of Circle with the given radius and 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.
  2. 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.
    // Getter for instance variable color
    public String getColor() { ...... }
    Chỉnh sửa TestCircle để test được method getColor() này. 
  3. 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. 
  4. 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:
    // Setter for instance variable radius
    public void setRadius(double newRadius) {
       radius = newRadius;
    }
     
    // Setter for instance variable color
    public void setColor(String newColor) { ...... }
    Modify the TestCircle to test these methods, e.g.,
    Circle c4 = new Circle();   // construct an instance of Circle
    c4.setRadius(5.0);          // change radius
    System.out.println("radius is: " + c4.getRadius()); // Print radius via getter
    c4.setColor(......);        // Change color
    System.out.println("color is: " + c4.getColor());   // Print color via getter
    
    // You cannot do the following because setRadius() returns void,
    // which cannot be printed.
    System.out.println(c4.setRadius(4.0));
  5. 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ụ,
    // Instance variable
    private double radius;
    
    // Constructor
    public Circle(double radius) {
       this.radius = radius;   // "this.radius" refers to the instance variable
                               // "radius" refers to the method's parameter
       color = .......   
    }
    
    // Setter of radius
    public void setRadius(double radius) {
       this.radius = radius;   // "this.radius" refers to the instance variable
                               // "radius" refers to the method's argument
    }
    Chỉnh sửa Toàn Bộ constructors và setters trong Circle class sử dụng từ khoá this "this".
  6. 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
// Return a description of this instance in the form of
// Circle[radius=r,color=c]
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());   // explicit call
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());  // explicit call
System.out.println(c2);             // println() calls toString() implicitly, same as above
System.out.println("Operator '+' invokes toString() too: " + c2);  // '+' invokes toString() too
Cuối cùng, class diagram cho lớp Circle như sau:
ExerciseOOP_Circle_Final.png

1.2  Ex: Circle Class

ExerciseOOP_Circle_Simplified.png

1.3  Ex: Rectangle Class

ExerciseOOP_Rectangle.png

1.4  Ex: Employee Class

ExerciseOOP_Employee.png

1.5  Ex: InvoiceItem Class

ExerciseOOP_InvoiceItem.png

1.6  Ex: Account Class

ExerciseOOP_Account.png

1.7  Ex: Date Class

ExerciseOOP_Date.png

1.8  Ex: Time Class

ExerciseOOP_Time.png

Post a Comment

Mới hơn Cũ hơn