images
27/01/2021 04:04 am

Java OOP Phần 2: Java Constructors, Static, Singleton, Inner Class

Khi làm việc với lập trình hướng đối tượng, bạn sẽ cần làm quen với Constructor - Phương thức khởi tạo của đối tượng. Một đối tượng muốn tồn tại trước khi sử dụng thì phải được gọi khởi tạo thông qua constructor của class.

Java Constructor


Khi làm việc với lập trình hướng đối tượng, bạn sẽ cần làm quen với Constructor - Phương thức khởi tạo của đối tượng. Một đối tượng muốn tồn tại trước khi sử dụng thì phải được gọi khởi tạo thông qua constructor của class.


- Constructor là phương thức khởi tạo object của 1 class


- Bạn buộc phải gọi phương thức khởi tạo trước khi dùng các thuộc tính của object


- Một Object có thể có nhiều constructor khác nhau. Sự khác nhau được quy định bởi số lượng tham số đầu vào


Ví dụ:


Hãy xem class Book sau, trong class ta không thấy có phương thức khởi tạo nào cả. Tuy nhiên khi tạo đối tượng book ta vẫn gọi new Book(). Trường hợp class ta không khai báo một phương thức khởi tạo thì class đó sẽ gọi đến một phương thức khởi tạo mặc định. Phương thức khởi tạo mặc định (default constructor) luôn được tạo ra NẾU class chúng ta viết không khai báo bất kì phương thức khởi tạo nào.


public class Book {}


   Book book = new Book();


Trường hợp dưới đây ta khai báo một phương thức khởi tạo không có tham số - giống với phương thức khởi tạo mặc định. Trường hợp này ta đã thực hiện “đè" tức là override lại phương thức khởi tạo mặc định.


public class Book {

   public Book() {   // Default constructor

       System.out.println("this is a book");

   }

}

Book book = new Book();


1 class có thể có nhiều constructor. Tuy nhiên bạn chỉ nên tạo 1 public constructor thôi. Ví dụ:


public class Book {

   public Book() {

       System.out.println("this is default book");

   }

   public Book(String name) {

       System.out.println("this is a book with: " + name);

   }


}

   Book book = new Book();

   Book book = new Book(“math”);


Method this();


Bạn có thể gọi phương thức khởi tạo mặc định hoặc các phương thức khởi tạo khác thông qua this();


public class Book {

   public Book() {

       System.out.println("this is default book");

   }

   public Book(String name) {

       this();          // Gọi khởi tạo phương thức mặc định

       System.out.println("this is a book with: " + name);

   }

}


Constructor - Inheritance


Phương thức khởi tạo trong thừa kế


Trong thừa kế, ở lớp con ta buộc phải gọi khởi tạo phương thức khởi tạo của lớp cha. Trường hợp ta không gọi phương thức khởi tạo của lớp cha, hệ thống sẽ báo lỗi không compile được. Tuy nhiên nếu lớp cha có phương thức khởi tạo mặc định thì hệ thống sẽ tự giúp ta khởi tạo.


Ví dụ:


public class Book {

   public Book() {

       System.out.println("this is a book");

   }

}

public class NoteBook extends Book {

   public NoteBook() {

       System.out.println("this is a notebook");

   }

}


Ví dụ:


NoteBook noteBook = new NoteBook();


Output:

this is a book

this is a notebook


Trường hợp sau khi lớp cha không có phương thức khởi tạo mặc định mà sử dụng phương thức Book(String name). Trường hợp này ta sẽ thấy lỗi khi biên dịch lớp con.


Nếu không có phương thức mặc định: 


public class Book {

   public Book(String name) {

       System.out.println("this is a book: " + name);

   }

}

public class NoteBook extends Book {

   public NoteBook() {          // Lỗi biên dịch

       System.out.println("this is a notebook");

   }


Method super():


Như vậy trong trường hợp này, để tránh lỗi compile, ta sẽ dùng từ khóa super. Như ví dụ dưới đây, từ khóa super sẽ giúp ta gọi được phương thức khởi tạo của lớp cha từ lớp NoteBook(). Điều này rất dễ hiểu vì lớp con thừa hưởng toàn bộ đặc tính của lớp cha, nên để có được điều này, khi đối tượng ở lớp con khởi tạo thì cần phải khởi tạo các thuộc tính ở lớp cha trước tiên. Đó cũng là lý do phương thức super() luôn được đặt ở vị trí đầu tiên của hàm khởi tạo.


public class Book {

   public Book(String name) {

       System.out.println("this is a book: " + name);

   }

}

public class NoteBook extends Book {

   public NoteBook() {

       super(“”);    // Gọi constructor của lớp cha, và ở vị trí đầu tiên của hàm khởi tạo

       System.out.println("this is a notebook");

   }


Public - Protected - Private


Đây được gọi là các modifier của method hoặc class giúp việc giới hạn truy cập:


- public: không giới hạn truy cập

- protected: giới hạn truy cập trong cùng package hoặc lớp kế thừa

- private: Chỉ được truy cập trong class


static keyword


Đây là từ khoá trong java được phép đi cùng class, method, variable, block code


1. Khi gọi phương thức đánh dấu static, không cần khởi tạo đối tượng

2. Từ khóa này cho phép chạy 1 block code khi class đó được gọi.

3. Một biến khai báo static thì có thể truy cập bởi phương thức static


public class Example {

   public void print() {

       System.out.println("hello world");

   }

   public static void print2() {

       System.out.println("hello static");

   }

   public static void main(String[] args) {

       new Example().print();  // Khi gọi print() bạn cần khởi tạo đối tượng

       Example.print2();   // Khi gọi print2() bạn không cần khởi tạo đối tượng

   }

}


static block code


Thứ tự gọi với static:


- Các biến static được khởi tạo trước


- static block code sẽ được gọi khi chương trình khởi tạo class này hoặc trước khi chương trình gọi một phương thức (static) của lớp đó


class Example {

   static int i = 1;

   static {

       System.out.println("Set i = 2");

       i = 2;

   }

   public Example() {

       System.out.println("This is constructor");

   }

  public static void main(String[] args) {

   System.out.println("Start example test 1");

   new Example();

}
}


Output:

Set i = 2

Start example test 1

This is constructor


Singleton


- Là kĩ thuật lập trình cho phép khởi tạo 1 lần và duy nhất với 1 class

- Cho phép tiết kiệm tài nguyên hệ thống vì chỉ có 1 object được khởi tạo.


Ví dụ:

    BookService bookService = new BookService();

    BookService bookService2 = new BookService();


Ở đây chúng ta tạo ra 2 instance của cùng 1 lớp.


Implement Singleton cách 1


public class Book1 {

   private static Book1 instance;


   private Book1() {

   }


   public static Book1 getInstance() {

       if (instance == null) {

           instance = new Book1();

       }

       return instance;

   }

}


Khi gọi getInstance() lấy instance Book1(), ta sẽ kiểm tra nếu instance chưa được khởi tạo thì sẽ khởi tạo.


Do instance là static nên nó được gắn với class. Do đó khi nó được gán giá trị thì sẽ không nhận giá trị null vào lần gọi sau.


Áp dụng quy tắc 1,2,3 ở trên:


- Ta khai báo phương thức khởi tạo là private, do đó lớp này không thể được gọi phương thức khởi tạo ở bên ngoài class:
Book1 book = new Book1(); // Lỗi biên dịch


- Khởi tạo object instance ngay trong class thông qua method static:
private static Book1 instance = new Book1();


- Cho phép lấy instance thông qua static method. Do đó khi dùng không cần khởi tạo object.


Implement Singleton cách 2


public class Book2 {


   private final static Book2 instance = new Book2();


   private Book2() {

  }


   public static Book2 getInstance() {

       return instance;

   }

}


Do khai báo static nên dòng lệnh sẽ được chạy ngay lúc class được load vào chương trình. instance của Book2 được khởi tạo luôn


Thời điểm getInstance() ta không cần khởi tạo object nữa


Inner Class


Tùy theo Inner Class dạng static hay không static mà các khởi tạo là khác nhau nếu ta tiến hành khởi tạo bên ngoài class OuterClass.


public class OuterClassExample {

   public static void main(String[] args) {

       OuterClass.Inner innerClass = new OuterClass(). new Inner();

       OuterClass.StaticInner staticInner = new OuterClass.StaticInner();

   }

}


Inner Class là cách khai báo class ngay trong một class khác. Thông thường ta chỉ khai báo inner class để làm class phụ trợ cho class xử lý chính. Có 2 cách sau khai báo Inner class.



public class OuterClass {

   class Inner {

   }

   static class StaticInner {

   }

}


Mời các bạn đọc thêm bài viết Lập trình hướng đối tượng trong Java - Phần 1


- Tech Zone -


Thư giãn chút nào!!!

Bài viết liên quan