Phương Thức Khởi Tạo – Constructor
Khái Niệm Phương Thức Khởi Tạo – Constructor
Phương thức khởi tạo, hay gọi Hàm khởi tạo cũng được, bạn cũng có thể gọi là Constructor, mình thì mình sẽ dùng constructor luôn cho ngắn gọn.
Thực chất thì constructor này cũng là một phương thức, nhưng nó đặc biệt ở chỗ là, ngay khi mà bạn khởi tạo một đối tượng bằng từ khóa new, thì constructor của đối tượng đó sẽ lập tức được gọi đến một cách tự động. Có nghĩa là nếu với phương thức bình thường, bạn phải gọi đến nó thông qua toán tử chấm (“.”) thì phương thức đó mới được thực thi, còn với constructor, ngay khi biên dịch đến từ khóa new, hệ thống sẽ thực thi một constructor tương ứng của đối tượng, tùy vào constructor nào mà bạn chỉ định.
Mục đích chính mà constructor mang lại, không gì khác ngoài tác dụng Khởi tạo. Constructor giúp đối tượng vừa được tạo ra đó, có cơ hội được khởi tạo các giá trị cho các thuộc tính bên trong nó. Hoặc có thể giúp đối tượng đó gọi đến các phương thức tương ứng khác nhằm khởi tạo các logic bên trong đối tượng.
Trước khi hiểu rõ hơn về cách sử dụng một constructor, chúng ta hãy xem cách khai báo chúng.
Khai Báo Constructor
Trước hết mình xin nói qua cú pháp cho một constructor, để bạn có thể mang ra so sánh với việc khai báo một phương thức bình thường ở bài 18, xem có khác gì không nhé. Cú pháp của một constructor như sau.
[khả_năng_truy_cập] tên_phương_thức () { // Các dòng code }
Như vậy bạn cũng có thể thấy sự khác biệt, tuy nhiên mình cũng điểm qua các thành phần bên trong cú pháp trên cho nó rõ ràng.
– Đầu tiên, constructor không có kiểu_trả_về như phương thức bình thường nhé.
– Khả_năng_truy_cập – Chúng ta sẽ nói về vấn đề này ở một bài khác, cùng với khả_năng_truy_cập vào các thuộc tính và phương thức bình thường của một lớp. Tuy nhiên trong bài học hôm nay, mình đều sẽ dùng public cho các constructor, nó có nghĩa là ở đâu cũng có thể dùng đến các constructor này.
– tên_phương_thức – Khác với các phương thức bình thường, tên của constructor phải cùng với tên lớp. Để giúp phân biệt đâu là constructor và đâu là phương thức bình thường í mà.
– các_tham_số_truyền_vào – Phần này thì giống với phương thức bình thường, không có gì để nói thêm.
Thông qua ví dụ trên đây, mình có thêm một vài ghi chú nữa bổ sung cho bốn cái gạch đầu dòng trên kia. Mình muốn các bạn code qua constructor xong rồi mới nói đến điều này để khỏi nhầm lẫn.
– Trong một lớp, bạn hoàn toàn có thể có nhiều constructor, mỗi constructor như vậy phải khác tham số truyền vào (chứ không phải khác tên nhé, như trên kia có nói rằng constructor phải cùng tên với tên lớp, như vậy các constructor đều phải có tên giống nhau rồi). Bạn có thể xem lại ví dụ trên sẽ thấy có hai constructor, nhưng bạn có thể tạo thêm nhiều constructor khác cũng được.
– Với một lớp có nhiều constructor, bạn hoàn toàn có thể từ constructor này gọi đến constructor khác, việc gọi đến này không tạo thêm một thể hiện mới của lớp, mà mục đích chính của việc này là để tận dụng lại các dòng code khởi tạo của các constructor mà thôi. Vấn đề này bạn sẽ hiểu rõ hơn ở bài học về cách sử dụng từ khóa this ở bài học sau,
– Dù cho lớp đó có bao nhiêu constructor đi nữa, thì khi khai báo đối tượng, bạn phải chỉ định một và chỉ một constructor mà thôi. Điều này khác với các phương thức bình thường khác, khi mà bạn có thể gọi đến bao nhiêu phương thức cũng được. Ở bước dưới đây nữa chúng ta cùng xem cách chỉ định một constructor cho đối tượng như thế nào nhé.
– Một constructor chỉ được thực thi một lần khi từ khóa new được gọi. Bạn không thể nào thực thi lại một constructor trong suốt đời sống của đối tượng được nữa. Nếu như bạn muốn thực thi lại một constructor, thì bạn lại phải dùng từ khóa new, như vậy là bạn đã tạo ra một đối tượng mới rồi. Điều này cũng khác với các phương thức bình thường khác có khả năng gọi lại hoài được. Chính vì vậy mà nếu bạn có nhu cầu cần khởi tạo các giá trị thì cứ khởi tạo hết trong một constructor đi nhé.
– Và một ý nữa cũng khá quan trọng. Nếu bạn quên không khai báo constructor cho một lớp thì sao? Cũng giống như là từ các bài học trước tới giờ, bạn chỉ tạo các thuộc tính và các phương thức cho lớp, có tạo constructor cho chúng đâu! Thì khi này, hệ thống sẽ luôn ngầm tạo cho chúng ta một constructor không có tham số truyền vào, không có nội dung gì bên trong constructor đó, y như constructor đầu tiên của lớp HinhTron ở ví dụ trên đây. Như vậy mặc định luôn luôn lúc nào chúng ta cũng sẽ có được một constructor từ hệ thống.
Bài viết rất đúng trọng tâm
Trả lờiXóa