1. Tạo đối tượng

Chà, chúng ta đã đến phần tạo đối tượng. Bạn đã gặp phải điều này trước đây, nhưng bây giờ chúng tôi sẽ phân tích chủ đề này chi tiết hơn. Nó thực sự rất dễ dàng để tạo ra các đối tượng.

Để tạo một đối tượng, bạn cần sử dụng toán tử new . Tạo một đối tượng trông giống như thế này:

new Class(arguments)

Sau khi tạo một đối tượng, chúng ta thường ngay lập tức lưu một tham chiếu đến nó trong một biến, biến này thường chia sẻ cùng loại với đối tượng đã tạo. Điều đó có nghĩa là khi tạo một đối tượng, bạn thường thấy mã như sau:

Class name = new Class(arguments)

Việc tạo một biến mới ở đâu và mã ở bên phải của dấu bằng là việc tạo một đối tượng mới có loại là .Class nameClass

Ví dụ:

Mã số Ghi chú
Object o = new Object();
Tạo một Objectđối tượng
Cat pet = new Cat();
Tạo một Catđối tượng
Scanner console = new Scanner(System.in)
Tạo một Scannerđối tượng

Các lập trình viên thường đặt tên các biến theo tên các lớp của chúng, nhưng với một chữ cái viết thường. Đối với một lập trình viên mới làm quen, mã như vậy có thể gây nhầm lẫn:

Mã số
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Không có gì sai với mã này — đây là mã bình thường nhất, trong đó một biến được tạo và sau đó được khởi tạo ngay lập tức bởi một đối tượng cùng loại với nó.

Ở bên trái của dấu bằng, chúng ta có việc tạo một biến. Ở bên phải, việc tạo ra một đối tượng. Đó là nó.

2. Trình tạo

Bạn có thể đã thấy rằng một số đối số thường xuyên được chuyển khi tạo một đối tượng. Hơn nữa, các đối số được truyền cho một số đối tượng, nhưng không truyền cho các đối tượng khác. Làm thế nào để toàn bộ cơ chế này với các đối số hoạt động?

Mọi thứ ở đây cũng đơn giản: mỗi lớp có một phương thức (hoặc các phương thức) đặc biệt chịu trách nhiệm xử lý các đối số được truyền khi tạo một đối tượng. Các phương thức này được gọi là hàm tạo . Hoặc khi chúng ta đang nói về chỉ một: hàm tạo .

Việc phân biệt một phương thức khởi tạo với một phương thức thông thường rất dễ dàng. Phương pháp này có hai đặc điểm nổi bật:

  • tên của hàm tạo giống với tên của lớp của nó (và bắt đầu bằng chữ in hoa)
  • một hàm tạo không có kiểu trả về.

Nói chung, đây là những gì nó thường trông giống như:

modifiers Class(arguments)
{
   Code
}

Ví dụ:

Mã số Ghi chú
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Point




Pointlớp xây dựng lớp
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Tạo một đối tượng của Pointlớp. Hàm tạo của lớp sẽ được gọi.

Chú ý hàm tạo trông như thế nào: nó không có kiểu trả về và tên của nó giống với tên lớp.

Và một điều nữa: hãy xem mã bên trong hàm tạo. Các tham số của hàm tạo có cùng tên với các trường của lớp: x và y. Đó là thông lệ tiêu chuẩn để tránh tạo ra các tên thông số mới. Các tên giống như tên của các trường của lớp. Xung đột tên được giải quyết bằng cách sử dụng từ khóa này.

3. Gọi hàm tạo

Khi sử dụng toán tử mới và một lệnh như " Lớp mới ( đối số )" để tạo một đối tượng mới, có hai điều xảy ra:

  • Máy Java tạo một đối tượng có kiểu là Lớp
  • Máy Java gọi hàm tạo của đối tượng và chuyển các đối số của bạn

Là một lập trình viên, bạn có thể quyết định những hàm tạo nào mà lớp của bạn nên có và những tham số nào mà những hàm tạo này nên có.

Giả sử bạn quyết định tạo một lớp để theo dõi mèo tại nơi trú ẩn của động vật. Sau đó, lớp học của bạn Catcó thể trông như thế này:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
Điều này được cho phép
Cat cat = new Cat("Whiskers");
Nhưng điều này không được phép Mã này sẽ không biên dịch.
Cat cat = new Cat();
Và điều này là không được phép. Mã này sẽ không biên dịch.

Lớp Catchỉ có một hàm tạo với các tham số tên và tuổi. Bởi vì không có hàm tạo nào khác, bạn phải chuyển tên ( name) và tuổi ( age) của con mèo làm đối số khi tạo một đối tượng. Truyền đối số cho hàm tạo không phải là tùy chọn .

4. Nhiều hàm tạo

Nhưng nếu cần, bạn có thể thêm nhiều hàm tạo vào lớp. Không có giới hạn về số lượng hàm tạo hoặc tham số của chúng. Khi bạn tạo một đối tượng, trình biên dịch sẽ tự động chọn hàm tạo phù hợp với các tham số

Mã số Ghi chú
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Điều này được cho phép: hàm tạo đầu tiên sẽ được gọi
Cat cat = new Cat("Whiskers");
Điều này được cho phép: hàm tạo thứ hai sẽ được gọi
Cat cat = new Cat();
Nhưng điều này không được phép Mã này sẽ không biên dịch.

Chúng tôi quyết định tính đến thực tế là tuổi của một con mèo có thể không được biết đến. Để xử lý trường hợp này, chúng tôi đã thêm hằng số đặc biệt UNKNOWNcùng với hàm tạo chỉ có một tham số — tên của con mèo.

Lưu ý rằng chúng tôi vẫn khởi tạo cả hai biến bên trong cả hai hàm tạo. Chúng tôi thay thế các tham số không xác định/thiếu bằng hằng số UNKNOWN.

Nếu không có giá trị nào được gán cho biến tuổi, thì nó sẽ có giá trị mặc định là 0. Xét cho cùng, một chú mèo con được tìm thấy trên đường phố cũng có thể là 0 tuổi. Điều đó có nghĩa là số 0 trong biến tuổi không nhất thiết có nghĩa là "không xác định tuổi".

5. Hàm tạo mặc định

Nếu bạn muốn các đối tượng của mình được khởi tạo mà không có bất kỳ tham số nào, thì lớp của bạn cần khai báo một hàm tạo không có đối số.

Hàm tạo không có tham số không nhất thiết là hàm tạo không có mã. Một hàm tạo như vậy có thể chứa mã khởi tạo các biến có giá trị bắt đầu:

Mã số Ghi chú
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Điều này được cho phép: hàm tạo đầu tiên sẽ được gọi
Cat cat = new Cat();
Điều này được cho phép: hàm tạo thứ hai sẽ được gọi

Nhà xây dựng mặc định

Có một điểm rất quan trọng mà bạn nên biết và ghi nhớ.

Nếu lớp của bạn không khai báo một hàm tạo nào , thì trình biên dịch sẽ thêm một hàm tạo mặc định, là hàm tạo không có đối số với công cụ sửa đổi công khai.

Nhưng nếu lớp của bạn khai báo dù chỉ một hàm tạo thì sẽ không có hàm tạo mặc định nào được thêm vào và bạn sẽ cần tự thêm hàm tạo đó nếu muốn.

Mã số Ghi chú
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Điều này được cho phép: hàm tạo mặc định sẽ được gọi