JavaRush /Blog Java /Random-VI /Sự khác biệt giữa các hàm tạo và các phương thức thông th...
fog
Mức độ

Sự khác biệt giữa các hàm tạo và các phương thức thông thường.

Xuất bản trong nhóm
Hàm tạo là một phương thức đặc biệt nhằm mục đích ban đầu là đặt giá trị cho các trường của đối tượng. Thoạt nhìn, các hàm tạo đối tượng không khác nhiều so với các phương thức đối tượng thông thường. Và thực sự, bên trong hàm tạo, chúng ta có thể thực hiện mọi thứ có thể làm trong các phương thức đối tượng thông thường: xuất văn bản ra bàn điều khiển, truy cập tất cả các trường và phương thức của đối tượng mới, đưa ra các ngoại lệ, v.v. Cũng giống như các phương thức thông thường, hàm tạo có thể có các đối số. Cũng giống như các phương thức nạp chồng, có thể có một số hàm tạo với các chữ ký khác nhau. Cũng giống như các phương thức chung, hàm tạo có thể được tham số hóa bằng các biến kiểu. Ngay cả khi chúng ta xem xét mã byte do trình biên dịch tạo ra, ở nơi cần có lệnh gọi đến hàm tạo, chúng ta sẽ tìm thấy lệnh gọi đến một phương thức nào đó có tên mà lệnh gọi đó không khác gì lệnh gọi đến các phương thức khác <init>của đối tượng. Và sau khi tìm thấy mã byte của phương thức này, chúng ta sẽ thấy rằng nó chứa kết quả biên dịch hàm tạo của chúng ta. Có vẻ như không có nhiều điểm khác biệt so với các phương pháp thông thường, nhưng chúng tồn tại và có những điểm khác biệt khá quan trọng. Đầu tiên, hãy tìm hiểu xem tại sao chúng ta thực sự cần các hàm tạo? Để lưu trữ và xử lý bất kỳ dữ liệu nào, có thể là kiểu, mảng hoặc đối tượng nguyên thủy, chúng ta cần một lượng bộ nhớ nhất định. Đây có thể là các thanh ghi bộ xử lý, không gian ngăn xếp hoặc một phần không gian được phân bổ trong phần dữ liệu quy trình hoặc trong phần được phân bổ động của bộ nhớ (heap). Trong nhiều ngôn ngữ lập trình, nhằm mục đích tăng tốc, khi một chương trình yêu cầu một phần bộ nhớ mới, bộ nhớ được cấp cho chương trình sẽ không bị xóa và có thể chứa dữ liệu tùy ý đã được lưu trữ trong ô nhớ này trước đó. Việc chuẩn bị và ghi các giá trị cần thiết vào một phần bộ nhớ để cuối cùng sẽ có một số cấu trúc dữ liệu có ý nghĩa hoàn toàn rơi vào vai người lập trình. Hoàn toàn tự nhiên, các lập trình viên muốn làm cho cuộc sống của họ dễ dàng hơn và đã viết các quy trình để khởi tạo (nghĩa là đặt các giá trị ban đầu) cho các cấu trúc dữ liệu được sử dụng thường xuyên. Những thủ tục như vậy được sử dụng gần như liên tục, vì vậy những người tạo ra ngôn ngữ Java đã quyết định bắt buộc phải gọi những thủ tục khởi tạo như vậy khi tạo đối tượng và gọi chúng là hàm tạo . Khi một đối tượng mới được tạo trong Java, điều sau đây sẽ xảy ra: Đầu tiên, trình quản lý bộ nhớ Java phân bổ lượng bộ nhớ cần thiết để chứa đối tượng. Trong trường hợp này, không chỉ các trường được khai báo trực tiếp trong lớp của đối tượng được tạo mà còn tính đến các trường được khai báo trong tất cả các tổ tiên của lớp này. Ngoài ra, khối lượng này bao gồm không gian để đặt các cấu trúc được máy Java sử dụng cho các nhu cầu nội bộ. Tất cả các trường "trống" như vậy sẽ tự động được đặt thành giá trị mặc định - nullcho các loại tham chiếu, 0cho số và falsechoboolean. Sau đó, hàm tạo của lớp sẽ tự động được gọi, có nhiệm vụ đặt giá trị ban đầu cho các trường của đối tượng. Mặc dù trong một phương thức thông thường, câu lệnh đầu tiên có thể là bất cứ thứ gì, nhưng hàm tạo có ít quyền tự do hơn nhiều. Câu lệnh đầu tiên của hàm tạo phải là lệnh gọi rõ ràng tới hàm tạo khác của cùng lớp hoặc lệnh gọi rõ ràng hoặc ẩn tới hàm tạo của lớp cha. Các lệnh gọi rõ ràng tới các hàm tạo của cùng một lớp được thực hiện bằng cách sử dụng một từ khóa, thistheo sau là một tập hợp các đối số được đặt trong dấu ngoặc đơn. Việc gọi hàm tạo của lớp cha một cách rõ ràng được thực hiện theo cách tương tự, nhưng từ khóa được sử dụng super. Trong các đối số của lệnh gọi rõ ràng đến hàm tạo của cùng lớp hoặc lớp cha, bạn không thể truy cập vào các trường và phương thức của đối tượng, cũng như sử dụng từ khóa thissuper, vì lệnh gọi rõ ràng tới hàm tạo đưa ra một ngữ cảnh tĩnh. Để gọi ngầm hàm tạo của lớp cha, bạn không cần phải viết gì cả, nhưng hàm tạo mặc định được gọi ngầm, hàm tạo này phải tồn tại và hiển thị đối với lớp hiện tại. Đồng thời, cần lưu ý rằng nếu chuỗi gọi các hàm tạo cha mẹ bị gián đoạn trước khi hàm tạo của lớp Objectnằm ở đầu chuỗi hoàn thành thành công công việc của nó, thì đối tượng sẽ không thể hoàn thiện được, tức là phương thức finalize()của một đối tượng như vậy sẽ không bao giờ được gọi. Sau khi hàm tạo của lớp cha hoàn thành, quyền điều khiển được chuyển ngầm sang các khối khởi tạo cá thể và các khối khởi tạo trường cá thể của lớp hiện tại. Bộ khởi tạo được thực thi theo thứ tự xuất hiện trong văn bản chương trình. Chỉ sau khi bộ khởi tạo hoàn thành công việc của chúng, quyền điều khiển mới được chuyển sang phần còn lại của hàm tạo. Các tính năng còn lại của hàm tạo liên quan đến mô hình bộ nhớ Java. Nếu một lớp hoặc một trong các lớp tổ tiên của nó ghi đè phương thức finalize()thì việc hoàn thành hàm tạo sẽ xảy ra trước ( xảy ra trước ) phương thức đó chạy finalize(). Nếu bất kỳ luồng nào nhìn thấy một tham chiếu đến một đối tượng sau khi hàm tạo hoàn thành, thì đảm bảo rằng luồng này sẽ nhìn thấy các trường - được khởi tạo chính xác finalcủa đối tượng, việc khởi tạo xảy ra trước khi hàm tạo hoàn thành.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION