OOP in Java

Duy Văn | 05/03/2025


OOP - Object-Oriented Programming hay lập trình hướng đối tượng là một phương pháp lập trình, tổ chức dữ liệu và các hàm để làm việc với các dữ liệu theo đối tượng cụ thể. Thay vì thực hiện lập trình từ trên xuống dạng quy trình

OOP sẽ hướng tới việc gói các dữ liệu và hàm để làm việc với dữ liệu vào một nhóm dưới danh nghĩa một đối tượng, rồi có thể khởi tạo đối tượng đấy liên tục nhằm có một cấu trúc code gọn gàng, chạy nhanh hơn, tăng khả năng tái sử dụng

Trong Automation Test, sử dụng các framework thuần code như Seleniumn Java, Selenium Python, Playwright,… đều cần ứng dụng OOP vào một khái niệm gọi là Page Object Model (POM) để quản lý các element, action, page của ứng dụng web hay APIs để làm bộ test script gọn gàng, dễ bảo trì / duy trì

Ôn lại một chút kiến thức về OOP:

  • Class là bản mẫu để khởi tạo ra cấu trúc đối tượng, nó được code vào trong các file code hay script, nêu ra các thuộc tính, các method của đối tượng
  • Object là một triển khai - instance của class, nó sẽ lấy class như bản mẫu (kế thừa từ bản mẫu) để khởi tạo thành một đối tượng có đầy đủ thuộc tính và các hàm (method) để làm việc với các thuộc tính

Ví dụ, class có thể là Cars, object có thể là “Nissan GTR”, “Toyota Camry”, “BMW X5”,… Các class và đối tượng trong lập trình OOP thường hướng đến một đối tượng cụ thể, có thật để xoay code quanh các đối tượng này, ví dụ với class Cars, chúng ta sẽ có những thuộc tính như tên, màu, giá, năm sản xuất, hãng sản xuất,… và các hàm như mua vào, bán ra,…

Các thuộc tính này chính là các dữ liệu mà chương trình chúng ta đang code cần quan tâm, ví dụ như một phần mềm quản trị bán xe hơi

Class và Object trong Java

Bắt đầu với việc khởi tạo một class, chúng ta có thể tạo một class tên là Main với thuộc tính x


class Main {
  int x = 5;
}

Tuy nhiên như mình đã nói thì bắt buộc phải có một method main để chạy chương trình


class Main {
  int x = 5;

  public static void main(String[] args) {
    Main myObj = new Main();
    System.out.println(myObj.x);
  }
}

Chúng ta cũng có thể tạo nhiều class và gọi nó trong method của lẫn nhau, ví dụ có thể tạo một class là Main, một class Second và gọi class Second ở trong class Main


class Second {
  int y = 10;
}
{% raw %}
class Main {
  int x = 5;

  public static void main(String[] args) {
    Main myObj = new Main();
    Second myObj2 = new Second();
    System.out.println(myObj.x);
    System.out.println(myObj2.y);
  }
}

Khi chúng ta compile Main.java thì tự động Java sẽ compile Second.java nếu nó chưa được compile, và chạy chương trình

Attributes

Các thuộc tính trong class của Java chính là các biến được gán giá trị, đại diện cho một đặc điểm nào đó của chủ thể được class nhắm tới. Ví dụ với class Cars, các thuộc tính có thể là tên, màu, giá, năm sản xuất, hãng sản xuất,… Ngoài ra, vì các thuộc tính này đại diện cho các dữ liệu của đối tượng, nó cũng có thể được gọi là các trường - field


public class Cars{
  String brand = "Toyota";
  String model = "Camry";
  int year = 2022;
  double price = 100000;
}

Truy cập vào các thuộc tính của đối tượng được triển khai từ class thì dơn giản, chúng ta khởi tạo một đối tượng, rồi sử dụng cú pháp


public class Main {
  public static void main(String[] args) {
    Cars myCar = new Cars();
    System.out.println(myCar.brand);
    System.out.println(myCar.model);
    System.out.println(myCar.year);
    System.out.println(myCar.price);
  }
}

Dựa vào đây chúng ta cũng có thể thay đổi giá trị các thuộc tính


public class Main {
  public static void main(String[] args) {
    Cars myCar = new Cars();
    myCar.brand = "Nissan";
    myCar.model = "GTR";
    myCar.year = 2023;
    myCar.price = 200000;
    System.out.println(myCar.brand);
    System.out.println(myCar.model);
    System.out.println(myCar.year);
    System.out.println(myCar.price);
  }
}

Nếu muốn giá trị thuộc tính không thể đổi thì chúng ta dùng từ khoá final


public class Cars{
  final String brand = "Toyota";
  final String model = "Camry";
  final int year = 2022;
  final double price = 100000;
}

Static vs Public

Trong Java, chúng ta có thể sử dụng từ khoá static để tạo một thuộc tính hoặc method của class, không phải của đối tượng. Điều này có nghĩa là chúng ta có thể truy cập vào thuộc tính hoặc method mà không cần phải khởi tạo một đối tượng


public class Cars{
  static String brand = "Toyota";
  static String model = "Camry";
  static int year = 2022;
  static double price = 100000;
}


public class Main {
  public static void main(String[] args) {
    System.out.println(Cars.brand);
    System.out.println(Cars.model);
    System.out.println(Cars.year);
    System.out.println(Cars.price);
  }
}

Ngược lại, public thì thuộc về đối tượng, chúng ta cần phải khởi tạo một đối tượng mới có thể truy cập vào thuộc tính hoặc method

Methods

Khi chúng ta tạo ra các method public, tức là giờ method thuộc về class, để gọi nó ra thì chúng ta làm như sau

class Cars{
  static int speed = 30;
  public String state = "off";
  public void ignite(){
    state = "on";
  }
  public void stop(){
    state = "off";
  }
}
public class Main {
  public static void main(String[] args) {
    Cars myCar = new Cars();
    System.out.println(myCar.state);
    myCar.ignite();
    System.out.println(myCar.state);
    myCar.stop();
    System.out.println(myCar.state);
  }
}