Main content:
      An introduction to classes
      How to code a class that defines an object
      How to create and use an object
      How to code and use static fields and methods
      The Line Item application
         ------
1. An introduction to classes
   - Định nghĩa: Lớp là tập khuôn mẫu, là mô tả chung cho các đối tượng có cùng thuộc tính và phương thức.
   - Người ta thường dùng hình vẽ sau để mô tả các đặc tính của một lớp:
Ví dụ:

   - Cú pháp xây dựng một lớp:
class <Tên class> {
       //Các thuộc tính
      
       //Phương thức
}  

Ví dụ:
2. How to code a class that defines an object
Ví dụ: Tạo một lớp động vật
class Animal {
       String type;
      
       //Hàm khởi tạo
       public Animal(String _type) {
              type = _type;
       }
      
       public void Say() {
              System.out.println("This is a " + type);
       }
}

3. How to create and use an object
Ví dụ: tạo đối tượng từ lớp động vật ở trên
public class Main {
       public static void main(String[] args) {
              Animal obj1 = new Animal("Cat");
              obj1.Say();
             
              Animal obj2 = new Animal("Monkey");
              obj2.Say();
       }
}

class Animal {
       String type;
      
       //Hàm khởi tạo
       public Animal(String _type) {
              type = _type;
       }
      
       public void Say() {
              System.out.println("This is a " + type);
       }
}


4. How to code and use static fields and methods


5. The Line Item application:
    Xây dựng chương trình tính tổng số tiền cho một đơn hàng được nhập bởi người dùng. Kết quả chạy chương trình và sơ đồ các lớp như hình bên dưới.

Bài tập:
1. Xây dựng lớp Điểm và lớp hình chữ nhật được mô tả bởi hình dưới:

        Trong đó có 2 hàm: isPointRect và + isIntersectRectangle lần lượt là kiểm tra một điểm có nằm trong hình chữ nhật và hai hình chữ nhật có giao nhau không.
        Lần lượt tạo hai đối tượng hình chữ nhật (r1, r2) và một điểm (p1). Kiểm tra hai hình chữ nhật đó có giao nhau không và điểm p1 có nằm trong hai hình chữ nhật không ?
Bài giải:
class Point {
       float x, y;
}

class Rectangle {
       Point p1, p2;//top and bottom
      
       public boolean isPointInRectangle(Point p) {
       return (this.p1.x <= p.x && this.p2.x >= p.x &&
               this.p1.y >= p.y && this.p2.y <= p.y);
       }
      
       public boolean isIntersetRectangle(Point p1, Point p2) {
               return !( p1.x > this.p2.x || p2.x < this.p1.x
                      || p1.y < this.p2.y || p2.y > this.p1.y);
       }
}

2. Xây dựng lớp hình tròn, gồm có: tâm (x, y: float) và bán kính r: float, trong đó có phương thức kiểm tra một điểm nằm trong hình tròn và phương thức kiểm tra hình tròn có giao với hình chữ nhật không ?
Bài giải
Hình vẽ:


//ham va cham hinh tron va hinh chu nhat
    public boolean checkTronCatHCN(int rx, int ry, int rw, int rh, int cx, int cy, int cr){
        int Lx = Math.abs(rx + rw/2 - cx);
        int Ly = Math.abs(ry + rh/2 - cy);
        if( 
            ((Lx <= (rw/2 + cr)) && (Ly <= rh/2)) ||
            ((Ly <= (rh/2 + cr)) && (Lx <= rw/2)) ||
            ((Lx - rw/2)*(Lx - rw/2) + (Ly-rh/2)*(Ly-rh/2) <= cr*cr)
          ){
            return true;
        }
        return false;
    }
3.

4.

5. Bài tập xây dựng chương trình mô phỏng máy ATM: (Bài viết của iViettech)
    (Để vẽ các diagram- sơ đồ quan hệ giữa các lớp dùng công cụ sau: https://www.draw.io)
    Trong bài viết này, chúng ta sẽ cài đặt giả lập hoạt động của một máy ATM. Máy ATM cho phép người dùng đăng nhập, rút tiền, chuyển tiền, xem số dư, đổi mật khẩu.. Trong ví dụ này chúng ta giới hạn các chức năng của máy ATM gồm: đăng nhập, rút tiền, chuyển tiền, xem số dư, đổi mật khẩu và sẽ giảm độ phức tạp đến mức tối đa.
Biểu đồ chức năng của hệ thống ATM như sau:
ATM - Use Case Diagram
Bạn có thể xem thêm về cách xây dựng bản vẽ này tại đây: Use Case Diagram.
Bây giờ chúng ta xem trong hệ thống này có những đối tượng nào nhé. Quan sát các đối tượng trong hệ thống chúng ta thấy có những đối tượng sau:
(Làm thế nào để thấy được các bạn vui lòng đọc bài này: Class Diagram )
  • Khách hàng (Customer)
  • Tài khoản (Account)
Thiết lập thêm các thuộc tính của các lớp này chúng ta có sơ đồ lớp như sau:
ATM - Class Diagram
Để đơn giản cho quá trình cài đặt, tôi sẽ đơn giản quan hệ này bằng cách cho tên khách hàng vào lớp tài khoản luôn là biết khách hàng nào sở hữu tài khoản này và bỏ qua đối tượng khách hàng. Lúc đó hệ thống chỉ cần mô tả 01 lớp là Account như sau:
ATM - Class Diagram -2
Mọi chuyện có vẻ đơn giản hơn rồi.
Để cài đặt ứng dụng trong Java chúng ta phải cài đặt một lớp ứng dụng có tên là ATMApp(ứng dụng ATM) để sử dụng lớp Account này nhằm tạo ra chức năng cho khách hàng sử dụng. Lúc đó sơ đồ lớp như sau:
ATM - Class Diagram -3
Các phương thức login(đăng nhập), viewAccountInfo(xem thông tin khách hàng), changePassword(thay đổi mật khẩu), withdraw(rút tiền), transfer(chuyển tiền) của lớp ATM sẽ tương tác với các đối tượng tài khoản được tạo ra từ lớp Account để tạo nên hệ thống.
Bây giờ chúng ta sẽ cài đặt ứng dụng này trên Java.

3. Cài đặt ứng dụng ATM trên Java

Để thực hiện các bước theo bài này bạn phải cài đặt Java và NetBean trên máy tính của mình. Xem thêm bài hướng dẫn cài đặt Java và NetBean để cài đặt môi trường.

Bước 1. Tạo dự án ATMApp

Khởi động NetBean và tạo một dự án ATMApp như hình bên dưới.
Tao du an-1
Bỏ qua các Comment và thêm vào dòng lệnh System.out.print như bên dưới để bắt đầu ứng dụng. Nhấn Play để chạy và kiểm tra ứng dụng.
Tao du an-2

Bước 2. Xây dựng lớp Account

Kích phải chuột lên gói ATMApp bên trái – > New -> Java Class
Create Account Class-1
Nhập tên lớp là Account, chọn Package là ATMApp và kích Finish để tạo lớp.
Create Account Class-2
Lớp ban đầu chỉ có:
public class Account {

}
Chúng ta sẽ xem hình mô tả lớp Account ở trên để tiến hành cài đặt.
  • Tiếp theo chúng ta sẽ code các thuộc tính cho lớp. Mặc định cách sử dụng kiểu dữ liệu và khai báo bạn đã biết. Nếu chưa biết bạn nên đọc thêm sách hướng dẫn lập trình cơ bản trên Java trước.
Create Account Class-3
  • Tiếp tục chúng ta sẽ code Contructor để khởi tạo giá trị cho lớp:
Create Account Class-4
Constructor là một phương thức đặc biệt được sử dụng để khởi tạo giá trị ban đầu cho đối tượng, phương thức này sẽ tự chạy khi tạo một đối tượng. Contructor có tên trùng với tên lớp và không có giá trị trả về.
  • Thử sử dụng lớp này:
Quay trở lại lớp ATMApp và sử dụng lớp vừa tạo theo đoạn mã dưới đây:
Create Account Class-5
Đoạn mã trên tạo ra đối tượng acc1 của lớp Account và sử dụng chúng để in thông tin ra màn hình. Cho chạy ứng dụng nó vẫn hoạt động tốt. Tuy nhiên, theo tinh thần lập trình hướng đối tượng thì không khuyến khích cách truy cập trực tiếp vào các thuộc tính của lớp như thế này.
Điều này cũng giống như chúng ta đeo bảng tên mà tất cả các thông tin cá nhân của mình hiên ra trước mắt mọi người và nguy hiểm hơn là người khác có thể thay đổi thông tin này mà không cần hỏi ý kiên của chúng ta. Ví dụ ai đó tự nhiên lại thay đổi tên của bạn mà không hỏi ý kiến bạn có đồng ý hay không thì quá nguy hiểm.
Do vậy, lập trình hướng đối tượng khuyến khích bạn viết private cho các thuộc tính của đối tượng và viết các hàm get() và set() để lấy hoặc thay đổi giá trị của thuộc tính.  Ví dụ đối với thuộc tính accountNo cần 02 phương thức như sau:
Create Account Class-6
Như vậy muốn lấy giá trị thuộc tính của đối tượng phải hỏi qua chủ thể và nếu không thích chủ thể có thể dùng hàm if để từ chối trả về thông tin.
Tiếp tục bổ sung các hàm Get và Set cho các thuộc tính còn lại chúng ta sẽ hoàn thiện lớp Account:
Create Account Class-7

Bước 3. Sử dụng lớp Account để xây dựng ứng dụng ATM

– Tạo ra một tài khoản (đối tượng của lớp Account)
Trước tiên chúng ta phải tạo ra một tài khoản của khách hàng cần giao tiếp. Trong thực tế chúng ta phải lấy từ CSDL lên(phần này sẽ bàn ở các bài sau) nhưng ở đây để đơn giản chúng ta gán trực tiếp.
ATMApp - Class-1
Như vậy chúng ta đã có 01 tài khoản là acc1, chúng ta sẽ xây dựng chức năng login để khách hàng sử dụng đăng nhập.
Thủ tục đăng nhập (login)
ATMApp - Class-2

Để đoạn mã trên chạy được bạn phải sử dụng dòng lệnh dưới trước lệnh khai báo lớp để ATMApp để sử dụng lớp Scanner.
 import java.util.Scanner;
Thực hiện đoạn lệnh trên để kiểm tra chức năng Login.
-Tiếp theo chúng ta sẽ viết các thủ tục rút tiền, xem số dư tài khoản như sau:
 ATMApp - Class-3
Để gọi 2 hàm trên chúng ta vào hàm Main và thêm đoạn lệnh sau:
ATM - Class Diagram -4
Tiếp theo chúng ta sẽ viết hàm chuyển tiền. Hàm chuyển tiền là hàm chuyển từ tài khoản này qua tài khoản khác nên chúng ta phải tạo thêm tài khoản nhận tiền để thực hiện thao tác này và viết hàm chuyển tiền để thực hiện.
ATMApp - Class-5
Chúng ta sẽ quay trở lại hàm main() và code để thêm tài khoản và sử dụng hàm chuyển tiền ở trên:
ATMApp - Class-7
Chúng ta thấy việc tạo ra đối tượng thứ 2 của tài khoản rất dễ dàng và chúng ta dễ dàng giao tiếp với nó đã cho thấy sự tiện lợi của Lập trình hướng đối tượng.
Qua ứng dụng trên các bạn có thể thấy việc lập trình theo mô hình hướng đối tượng giúp chúng ta mô tả bài toán sát với cách thực hiện trong mô hình thực tế từ đó giúp bạn dễ hình dung hơn.