"Xin chào, Amigo. Hôm nay tôi sẽ kể cho bạn nghe về một chương trình Java điển hình. Tin tức quan trọng là mọi chương trình viết bằng Java đều bao gồm các lớp và đối tượng."

"Tôi đã biết lớp là gì. Đối tượng là gì?"

"Hãy bắt đầu bằng một phép loại suy. Giả sử bạn muốn đóng một con tàu nhỏ. Bạn làm việc trên một bản thiết kế và sau đó gửi bản thiết kế đến một nhà máy, nơi một con tàu sẽ được lắp ráp theo thiết kế của bạn. Hoặc một tá tàu, hoặc nhiều tàu như bạn muốn. Quan điểm của tôi là hàng chục con tàu giống hệt nhau có thể được tạo ra dựa trên một bản thiết kế."

"Đó chính xác là cách nó hoạt động với Java."

" Lập trình viên Java giống như kỹ sư thiết kế, ngoại trừ thay vì tạo bản thiết kế, họ viết các lớp. Các bộ phận của tàu được tạo dựa trên bản thiết kế, trong khi các đối tượng được tạo dựa trên các lớp. "

"Đầu tiên, chúng tôi viết các lớp (tạo bản thiết kế). Sau đó, khi chạy chương trình, máy Java sẽ tạo các đối tượng dựa trên các lớp này. Nó giống hệt như cách các con tàu được đóng từ một bản thiết kế. Một bản thiết kế – nhiều con tàu. Các con tàu khác nhau . Chúng có những cái tên khác nhau và chở những loại hàng hóa khác nhau. Nhưng chúng vẫn giống nhau. Chúng đều có thiết kế giống hệt nhau và có thể thực hiện những nhiệm vụ tương tự."

"OK, tôi hiểu sự tương tự về con tàu của bạn. Bạn có thể cho tôi thêm vài câu nữa để giúp tôi chắc chắn rằng tôi hiểu những gì bạn đang nói không?"

"Lấy con ong làm ví dụ..."

"Không, gãi đó. Tôi đã có một kinh nghiệm tồi tệ với những con ong. Hãy lấy những con kiến."

"Một đàn kiến ​​là một ví dụ điển hình về cách các vật thể tương tác với nhau. Bất kỳ đàn kiến ​​nào cũng bao gồm ba lớp: kiến ​​chúa, kiến ​​lính và kiến ​​thợ. Số lượng kiến ​​trong mỗi lớp khác nhau. Thông thường một đàn kiến ​​chỉ có một kiến ​​chúa, hàng tá kiến ​​lính và hàng trăm kiến ​​thợ. Ba lớp, hàng trăm đối tượng. Những con kiến ​​​​tuân theo các quy tắc nghiêm ngặt khi chúng tương tác với những con kiến ​​​​trong lớp của chúng và những con kiến ​​​​thuộc các lớp khác."

"Đây là ví dụ hoàn hảo. Một chương trình điển hình hoạt động chính xác như vậy. Có một đối tượng chính tạo ra các đối tượng trong tất cả các lớp. Các đối tượng tương tác với nhau và với thế giới bên ngoài. Hành vi của các đối tượng được lập trình sẵn (được lập trình) bên trong ."

"Tôi không hiểu lắm. Ý tôi là, tôi không hiểu chút nào."

"Hai cách giải thích này là hai mặt của cùng một đồng tiền. Sự thật nằm ở đâu đó ở giữa. Ví dụ đầu tiên (về bản thiết kế và con tàu) cho chúng ta thấy mối liên hệ giữa một lớp và các đối tượng của nó. Đó là một phép loại suy mạnh mẽ. Phép loại suy đàn kiến ​​chứng minh mối quan hệ giữa các đối tượng, được mô tả bởi các lớp và chỉ tồn tại khi chương trình đang chạy."

"Ý bạn là chúng ta cần viết các lớp cho tất cả các đối tượng được sử dụng trong một chương trình, sau đó mô tả các tương tác của chúng?"

"Có, nhưng nó dễ hơn ta tưởng. Trong Java, trong khi một chương trình đang chạy, tất cả các thực thể đều là các đối tượng. Việc viết một chương trình tương đương với việc mô tả các cách khác nhau mà các đối tượng có thể tương tác. Các đối tượng chỉ cần gọi các phương thức của nhau và truyền dữ liệu cần thiết đối với họ."

"Có một chút mờ nhạt, nhưng tôi nghĩ rằng tôi gần như đã hiểu."

"Làm cách nào để chúng tôi biết nên gọi phương thức nào và dữ liệu nào cần chuyển?"

"Mỗi lớp có một khai báo, cho biết mục đích sử dụng của nó. Tương tự, mọi phương thức đều có một khai báo cho biết nó có thể làm gì và chúng ta cần truyền dữ liệu gì cho nó. Để sử dụng một lớp, bạn cần có hiểu biết chung về những gì đúng vậy. Bạn cần biết chính xác chức năng của từng phương thức, nhưng không biết chính xác cách thức hoạt động của nó . Nó giống như một cây đũa thần vậy."

"Hừ! Nghe hay đấy."

"Đây. Hãy xem mã của lớp sao chép tệp:"

Sao chép c:\data.txt vào c:\result.txt
package com.codegym.lesson2;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy
{
    public static void main(String[] args) throws IOException
    {
        FileInputStream fileInputStream = new FileInputStream("c:\data.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("c:\result.txt");

        while (fileInputStream.available() > 0)
        {
            int data = fileInputStream.read();
            fileOutputStream.write(data);
        }

        fileInputStream.close();
        fileOutputStream.close();
    }
}

"Tôi không thể nói rằng tôi hiểu tất cả, nhưng tôi nghĩ rằng tôi đã nắm được bản chất của nó."

"Tuyệt. Hẹn gặp lại lần sau."

"Tôi suýt quên mất. Đây là nhiệm vụ của bạn từ Diego."