Giải pháp chuyển đổi số trọn gói cho doanh nghiệp Việt
Phương thức, hay còn gọi là method. Một số tài liệu khác gọi là hàm. Các phương thức chính là các hành động của một lớp. Sau này khi các đối tượng được tạo ra từ lớp, thì các hành động này cũng chính là các hành động hay các hành vi của đối tượng đó.
Cú pháp của một phương thức như sau.
[kả_năng_truy_cập] kiểu_trả_về tên_phương_thức ( [tham_số] ) {
// Các dòng code
}
Tiếp tục với project OOPLearning hôm trước, khi mà chúng ta đã tạo một lớp HinhTron ở một file .java tách biệt, rồi thêm vào cho lớp này các thuộc tính như những gì chúng ta cùng nhau thực hành ở bài trước nữa, bài học số 16.
Hôm nay chúng ta sẽ thêm vào các phương thức quen thuộc từ bài học số 16 mà chúng ta cũng đã làm quen. Một lần nữa có thể bạn sẽ chưa hiểu hết từng thành phần trong khai báo một phương thức, bạn chỉ đã hiểu tường tận các dòng code bên trong từng phương thức mà thôi. Nhưng không sao, bạn cứ code đi nhé, chúng ta sẽ dần quen thuộc với phương thức ở các phần sau của bài học hôm nay.
Và code của bài hôm trước sẽ trông như thế này của bài học hôm nay (tuy hình ảnh này được chụp từ Eclipse nhưng bạn có thể code tương tự nếu dùng InteliJ).

Khi khai báo một phương thức, bạn buộc phải chỉ định một kiểu_trả_về. Kiểu trả về này thường là kết quả cuối cùng mà phương thức đó thực hiện, nó có thể là một kiểu dữ liệu nguyên thủy, nó có thể là một giá trị boolean, nó có thể là một mảng, hoặc thậm chí nó có thể là một đối tượng. Mục đích của việc trả về này, là giúp cho các đối tượng nào đó bên ngoài lớp, hoặc các phương thức khác bên trong lớp, có thể nhận được kết quả đó để thực hiện một mục đích nào đó. Chúng ta có thể xem kết quả trả về là “đầu ra” của phương thức, khi mà “đầu vào” chính là tham_số mình sẽ nói ở mục sau.
Và như mình có nói, một phương thức bắt buộc phải khai báo một kiểu_trả_về. Khi bắt đầu trả về một kết quả, chúng ta dùng từ khóa return. Bạn xem các ví dụ sau để hiểu rõ cách sử dụng của lệnh này.
Thực chất các kiểu_trả_về đều có cách sử dụng như nhau, nhưng với từng ví dụ sau mình sẽ tách các kiểu_trả_về ra làm từng mục, để các bạn dễ tiếp cận.
Bạn có còn nhớ các kiểu dữ liệu nguyên thủy là gì không, nếu quên thì xem lại mục Kiểu Dữ Liệu Của Biến ở bài học số 4 nhé.
Với ví dụ ở mục này, mình xây dựng ba phương thức bên trong lớp HinhTron có khai báo các kiểu_trả_về, bạn chú ý các source code có comment nhé.
Và rồi bước tiếp theo ở hàm main() bên trong lớp MainClass, chúng ta sẽ sử dụng kết quả trả về của các hàm bên trong lớp HinhTron để làm một vài tác vụ nào đó (như in ra console chẳng hạn).
Đơn giản đúng không. Bạn chỉ cần nhớ một số nguyên tắc khi khai báo kiểu_trả_về của một phương thức:
Với ví dụ này, mọi thứ sẽ không khác gì so với bạn khai báo một kiểu_trả_về là một biến nguyên thủy cả, chỉ là lần này bạn thử trả về là một đối tượng. Bạn xem ví dụ bên dưới.
Giả sử HinhTron mà chúng ta xây dựng sẽ được vẽ đâu đó lên màn hình, như vậy phải cần người dùng nhập vào tọa độ (x, y) của Hình tròn đó. Và như tư duy của Hướng đối tượng, mình chỉ định Tọa độ cũng là một đối tượng cần quản lý. Đầu tiên mình sẽ định nghĩa một lớp có tên ToaDo, lớp này có hai thuộc tính là x và y, và không có phương thức nào cả. Bạn thử tạo xem nhé.

Sau đó ở lớp HinhTron, mình khai báo một thuộc tính với kiểu dữ liệu là ToaDo, HinhTron sẽ hỗ trợ nhập tọa độ x, y vào từ console. Và cuối cùng là hàm getToaDo() trả ra ngoài kiểu dữ liệu là ToaDo.
Còn ở hàm main(), mình thử xuất ra xem kết quả nhập tọa độ vào cho HinhTron có đúng chưa.
Chắc chắn là các bạn sẽ thắc mắc nhiều lắm nếu mình không đề cập đến mục này. Vì trong quá trình thực hành bạn nhìn thấy kiểu trả về nhiều nhất đó chính là kiểu void!?!
Như mình có khẳng định chắc nịch bên trên rằng một phương thức bắt buộc phải khai báo một kiểu_trả_về. Nhưng với nhu cầu thực tế, không phải lúc nào chúng ta cũng cần phải trả ra khỏi phương thức một kết quả, minh chứng rõ ràng nhất là các hàm inChuVi(), inDienTich() mà chúng ta đã làm quen, các hàm này chỉ cần các câu lệnh in ra console, và rồi hết.
Vậy để giải quyết vấn đề không cần kiểu trả về này, Java (hay C/C++ cũng thế) đã định nghĩa cho chúng ta một kiểu dữ liệu hơi lạ, kiểu void. Kiểu dữ liệu này thực chất là kiểu rỗng, nó không là gì cả, nó không chứa bất kỳ dữ liệu nào. Do đó chúng ta cứ hiểu rằng nếu một phương thức có kiểu_trả_về là void, thì có nghĩa là nó không có kiểu trả về. Và vì là một phương thức không có kiểu trả về, nên bạn cũng không cần câu lệnh return bên trong phương thức này.
Chắc có lẽ mình không cần đưa thêm ví dụ nào về kiểu void này, các bài thực hành đều dùng nhiều đến nó. Mình chỉ có một ý nho nhỏ, rằng trong một phương thức với kiểu void, bạn hoàn toàn có thể dùng từ khóa return để kết thúc. Cách sử dụng câu lệnh return đã được mình nhắc sơ qua từ bài học số 10, và ý nghĩa của return trong một phương thức void không khác với break trong một Câu lệnh điều khiển luồng cả.
Để ví dụ về cách sử dụng return trong phương thức void, mình xin mượn ý tưởng tìm số nguyên tố từ Bài Thực Hành Số 1 của bài học số 10. Mình biến chế một xíu, đó là khi nào tìm thấy số nguyên tố đầu tiên, thì sẽ in số đó ra console và kết thúc ngay phương thức đó.
Chúng ta vừa đi qua kiểu_trả_về, điều tiếp theo chúng ta quan tâm đó là các tham_số truyền vào.
Bạn nên biết là, một phương thức có thể không có tham số truyền vào. Điều này mình không cần đưa thêm ví dụ nào cả, vì các phương thức mà bạn thực hành từ mấy bài học OOP đều như vậy cả. Khi đó sẽ không có gì bên trong cặp dấu () sau tên phương thức, như là tinhChuVi(), tinhDienTich().
Còn với thể loại phương thức có tham số truyền vào. Bạn có thể truyền vào nó bất cứ kiểu dữ liệu nào, từ một kiểu nguyên thủy, một mảng, hay một đối tượng nào đó. Bạn có thể truyền vào nó nhiều tham số, mỗi tham số như vậy cách nhau bởi dấu phẩy. Bạn có thể xem ví dụ sau.
Có thể có bạn lần đầu tiên làm quen với phương thức có tham số truyền vào này. Vậy mình có một số ý nhỏ sau đây giúp bạn nào còn bỡ ngỡ sẽ có một cách tiếp cận tốt hơn.
Cũng tương tự như bên thuộc tính. Đó là:
Như các ví dụ ở mục Kiểu Trả Về Của Phương Thức trên đây, các bạn đã hình dung đến việc truy xuất đến một phương thức không có tham số truyền vào rồi. Nên mình sẽ tập trung vào việc truy xuất đến một phương thức có tham số truyền vào cho ví dụ bên dưới nhé. Mình lấy lại ví dụ trên, khi khai báo một HinhTron với các phương thức có tham số truyền vào, giờ là lúc chúng ta thử xem việc gọi đến nó ở hàm main() là như thế nào.
Mình vừa trình bày xong kiến thức về sử dụng phương thức trong một lớp. Tất nhiên đây chưa phải tất cả những gì liên quan đến phương thức mà OOP mang lại cho chúng ta. Còn rất nhiều điều thú vị xoay quanh cách sử dụng phương thức nữa, các bạn chờ xem nhé.
Chưa có câu hỏi nào cho bài này.