1. Đối tượng

Mọi thứ trong Java đều là một đối tượng.

Chính xác hơn, có rất ít thứ trong Java không phải là đối tượng. Ví dụ, các loại nguyên thủy. Nhưng đây là một ngoại lệ khá hiếm đối với quy tắc.

Vậy đối tượng là gì?

Một đối tượng là một thực thể nhóm dữ liệu cùng với các phương thức xử lý dữ liệu . Tất nhiên, khi chúng tôi nói "dữ liệu", chúng tôi muốn nói đến các biến.

Các biến của một đối tượng được gọi là "dữ liệu" hoặc "trạng thái" của nó.

Các phương thức của một đối tượng được cho là "hành vi" của nó. Theo thông lệ, việc thay đổi trạng thái của một đối tượng (các biến) chỉ bằng cách sử dụng các phương thức của đối tượng đó. Thay đổi trực tiếp các biến của một đối tượng (không sử dụng các phương thức của nó) được coi là hình thức xấu.

Mọi đối tượng , cũng như mọi biến, đều có một kiểu . Loại này được xác định một lần khi đối tượng được tạo và không thể thay đổi trong tương lai. Loại của một đối tượng là lớp của nó.

Mỗi đối tượng có bản sao riêng của các biến thể hiện (trường). Nếu một biến int a không tĩnh được khai báo trong một lớp và chương trình của bạn tạo 10 đối tượng của lớp đó, thì mỗi đối tượng sẽ có một biến int a riêng.

Tương tác với một đối tượng

Cách thuận tiện nhất để làm việc với một đối tượng là lưu trữ một tham chiếu đến nó trong một biến, sau đó gọi các phương thức trên biến đó. Điều này sẽ trông quen thuộc với bạn:

variable.method()

Đâu variablelà một biến lưu trữ một tham chiếu đến một đối tượng và methodlà một phương thức của lớp đó.

Nếu bạn muốn tham chiếu đến một trường (biến) của một đối tượng, thì bạn cũng cần sử dụng toán tử dấu chấm :

variable.field

Đâu variablelà một biến lưu trữ tham chiếu đến một đối tượng và fieldlà một biến thể hiện (trường).


2. newnhà điều hành

Để tạo một đối tượng của một lớp nào đó, bạn cần sử dụng newtoán tử. Nói chung, đây là cách tạo một đối tượng:

Class variable = new Class(arguments);

Đâu Classlà tên của lớp của variablebiến cũng như tên của lớp của đối tượng sẽ được tạo. Và variable là một biến lưu trữ tham chiếu đến đối tượng đã tạo. Và argumentslà một trình giữ chỗ cho một danh sách các đối số được phân tách bằng dấu phẩy được truyền cho hàm tạo.

Danh sách cụ thể của các đối số có thể được thông qua được quyết định bởi các lập trình viên viết lớp.

Bạn đã tạo các đối tượng trước đó và thậm chí đã sử dụng cấu trúc cụ thể này. Bạn đã không quên, tôi hy vọng?

Scanner console = new Scanner(System.in);
int x = console.nextInt();

Scanner console— điều này tạo ra một consolebiến có kiểu là Scanner. - điều này tạo ra một đối tượng mới. Và toán tử gán đặt biến bằng một tham chiếu đến đối tượng mới được tạo.new Scanner(System.in)Scannerconsole

Trong dòng thứ hai, chúng ta gọi nextInt()phương thức trên Scannerđối tượng, sử dụng consolebiến lưu trữ tham chiếu đến Scannerđối tượng.

Ví dụ về tạo đối tượng:

Mã số Sự miêu tả
String s = new String("Hello");
Tạo một Stringđối tượng
Scanner console = new Scanner("");
Tạo một Scannerđối tượng
int[] data = new int[10];
Tạo một int[]: một thùng chứa 10 intcác phần tử

Các đối tượng được tạo ra được gọi là các đối tượng của lớp hoặc các thể hiện của lớp , trong khi lớp được gọi là lớp của đối tượng . Ví dụ, sbiến lưu trữ một tham chiếu đến một thể hiện của Stringlớp.



3. Giới thiệu lớp học

Tôi nghĩ bạn đã thấy việc sử dụng các lớp được viết bởi các lập trình viên khác tiện lợi như thế nào. Nhưng còn việc viết các lớp học của riêng bạn thì sao?

Làm thế nào để bạn biết khi nào và ở đâu bạn cần lớp học của riêng mình và làm thế nào để tạo một lớp học?

Các lập trình viên thường tạo các lớp của riêng họ khi họ muốn đưa một thực thể mới vào chương trình. Điều đó nghe có vẻ khó hiểu phải không? Sau đó, tôi sẽ cố gắng giải thích, nhưng tôi sẽ bắt đầu từ xa.

Nhóm dữ liệu

Đơn giản hóa một chút, chúng ta có thể nói rằng một đối tượng trong Java là một khối bộ nhớ chứa các biến được khai báo trong một lớp (các trường thể hiện). Hay nói cách khác, các biến kết hợp thành một nhóm.

Giả sử chương trình của bạn cần lưu trữ tọa độ của 100các điểm và cần một phương thức để hiển thị chúng trên màn hình. Điều này có thể được thực hiện bằng cách sử dụng mảng. Ví dụ, như thế này:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Color of (" + x[i] + ", " + y[i] + ") = " + color[i]);
   }

   public static void main(String[] args)
   {
     int[] x = new int[100];
     int[] y = new int[100];
     int[] color = new int[100];
     printPoints(x, y, color);
   }
}

Sẽ thuận tiện hơn nhiều nếu chúng ta có một loại duy nhất để lưu trữ tất cả thông tin về một điểm: x, y, color. Nếu kiểu như vậy không tồn tại trong Java, bạn có thể tự tạo kiểu đó.

Để làm điều này, chúng tôi sẽ viết mã cho một Pointlớp:

public class Point
{
   public int x;
   public int y;
   public int color;
}

Bây giờ đoạn mã trên có thể được viết lại thành:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Color of (" + points[i].x + ", " + point[i].y + ") = " + points[i].color);
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Bây giờ, hãy thêm một phương thức vào Pointlớp để hiển thị thông tin về đối tượng:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Color of (" + x + ", " + y + ") = " + color);
   }
}

Bây giờ Solutionlớp trông như thế này:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       points[i].print();
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Chúng tôi đã khéo léo giấu tọa độ của điểm và thông tin màu bên trong Pointlớp cùng với phương thức hiển thị trạng thái của điểm.

Các lớp là một cách để quản lý độ phức tạp của chương trình. Một chương trình lớn trở nên ít phức tạp hơn khi nó được chia thành nhiều lớp nhỏ.


4. Đối tượng có thể thay đổi và đối tượng không thể thay đổi

Ngày xửa ngày xưa, chúng tôi đã nghiên cứu các hằng số trong Java và đưa ra một kết luận không mấy dễ chịu. Các hằng cho phép bạn bảo vệ các biến không bị thay đổi, nhưng chúng không thể ngăn các thay đổi đối với các đối tượng mà chúng tham chiếu tới.

Để giải quyết vấn đề này, Java đã đưa ra các đối tượng không đổi. Hoặc, như chúng thường được gọi hơn, các đối tượng bất biến.

Nhân tiện, bạn đã biết lớp như vậy, có đối tượng không thể thay đổi: String. Một Stringđối tượng sẽ mãi mãi không thay đổi sau khi nó được tạo ra. Và làm thế nào mà những người tạo ra Java đạt được điều này?

Đầu tiên, tất cả các biến của Stringlớp được ẩn đi, tức là được khai báo private.

Thứ hai, bạn không thể kế thừa Stringlớp: khai báo lớp của nó bao gồm công finalcụ sửa đổi.

Thứ ba, và thú vị nhất, tất cả các phương thức của Stringlớp, theo lý thuyết, bạn mong muốn thay đổi đối tượng hiện có, không thực sự thay đổi nó mà thay vào đó trả về một đối tượng mới.

Ví dụ, toUpperCase()phương thức làm cho tất cả các chữ cái trong chuỗi thành chữ hoa. Nhưng thay vì thay đổi đối tượng mà phương thức được gọi, nó trả về một Stringđối tượng mới bao gồm các chữ in hoa:

String text = "This is a very important message";
String message = text.toUpperCase();

Đây là những gì sẽ có trong bộ nhớ sau khi thực thi mã này:

Các đối tượng có thể thay đổi và không thể thay đổi

Vì vậy, hãy thoải mái chuyển các chuỗi của bạn sang bất kỳ phương thức nào: sẽ không có ai thay đổi chúng.