Giải pháp chuyển đổi số trọn gói cho doanh nghiệp Việt
Như bạn cũng đã biết ở bài học khởi đầu hôm trước, đối tượng là các thực thể hay sự vật mà chúng ta có thể cầm nắm, hoặc có thể gọi tên được. Nghe thì có vẻ lan man, nhưng thực chất là… lan man thật. Mình nói đùa thôi, thực chất là vì hướng đối tượng cũng là một cách tư duy mở. Tức là tùy quan niệm của bạn muốn quản lý đến đối tượng nào mà thôi.
Ví dụ như với phần mềm quản lý việc kinh doanh xe hơi. Thì bạn chọn Xe hơi là một đối tượng để quản lý. Nhưng mình nói rằng Khách hàng cũng là một đối tượng. Và Hóa đơn cũng là một đối tượng nữa. Đấy, tất cả những gì xuất hiện trong một ứng dụng, mà bạn muốn chúng là một thực thể để quản lý, thì bạn cứ xem nó là một đối tượng thôi.
Ngoài ra thì nếu bạn đã chọn thực thể nào đó là đối tượng, thì đối tượng đó ắt hẳn phải có các trạng thái và hành vi.
Trạng thái của đối tượng nói lên các đặc điểm của đối tượng đó.
Ví dụ, khi bạn “nắm” lấy một đối tượng Xe hơi trong ứng dụng quản lý xe hơi trên đây để xem, thì sẽ thấy các trạng thái của nó như: xe này màu xanh, thuộc hãng Ford, 7 chỗ ngồi. Nhưng nếu bạn “cầm” lấy một chiếc xe khác, sẽ thấy các trạng thái khác, như: xe này màu trắng, thuộc hãng Toyota, 4 chỗ ngồi.
Bạn thấy đấy, tư duy trong lập trình theo hướng đối tượng trông rất thực tế đúng không nào. Bạn nhớ các trạng thái này của đối tượng nhé, chúng ta sẽ cần đến nó ở các ví dụ trong các kiến thức tiếp theo bên dưới.
Khác với trạng thái là các đặc điểm của đối tượng. Thì hành vi chính là các hành động của đối tượng đó, hay có thể hiểu đó là các hành động mà đối tượng đó có trách nhiệm phải thực hiện.
Như bạn đã làm quen với ví dụ mở màn ở bài trước, khi chúng ta dần chuyển các code tính toán ở main() vào cho đối tượng Hình tròn. Thì các hàm tính toán đó trở thành các hành vi của đối tượng Hình tròn này. Điều này có nghĩa là Hình tròn phải có trách nhiệm thực hiện các hành vi tính Chu vi và Diện tích của nó. Và dĩ nhiên Hình tròn không có trách nhiệm phải thực hiện các hành động tính Chu vi và Diện tích Hình vuông, vì các hành vi này sẽ thuộc về sự quản lý của đối tượng Hình vuông. Bạn đã hiểu rõ hơn về hành vi của từng đối tượng rồi đúng không nào.
Nếu bạn đã nắm về khái niệm đối tượng rồi. Thì với khái niệm lớp sẽ đơn giản hơn một tí. Lớp được xem là một khuôn mẫu để tạo ra các đối tượng. Ngắn gọn vậy thôi đó bạn, nhưng ngắn vậy thì chẳng hiểu gì cả. Thực chất không khó lắm đâu, bạn nhất định phải phân biệt giữa lớp và đối tượng. Chúng ta cùng đi từ từ qua các ví dụ sau.
Nào chúng ta hãy quên đi kiến thức lập trình một chút, hãy bắt tay vào làm các bánh quy bơ như sau. Giả sử bạn đã biết hết các công thức làm bánh. Và mình nhờ bạn giúp mình làm ra chúng với hình trái tim như này để mình mang đi tặng “người ấy”.

Nhưng bạn lại nói rằng biết công thức thì chưa đủ. Nếu muốn bạn làm chính xác các bánh có hình thù như vậy, thì hãy đưa bạn cái khuôn. Vâng, thì đây là cái khuôn.

Đó không phải câu chuyện về tặng “người ấy” như thế nào, mà là câu chuyện giữa bánh quy và khuôn. Bạn hãy đến Ví dụ 2 trước khi mình giải thích chúng.
Mình muốn các bạn đi lan man một chút qua ví dụ kế tiếp. Giả sử bạn là một họa sĩ 3D, chuyên về vẽ texture hoàn thiện hình ảnh cho xe hơi. Với yêu cầu rằng bạn hãy cho ra thành phẩm là những chiếc xe hơi với các màu như sau.

Ồ tất nhiên bạn sẽ làm được thôi. Nhưng trước hết bạn yêu cầu một bản vẽ concept (hay đại loại một ý tưởng gì đấy) về mẫu xe hơi này, thì bạn mới có thể khoác lên chúng các màu sắc được chứ. Vâng mình cũng đã chuẩn bị cho bạn, bản vẽ concept đây.

Vậy đó là câu chuyện về các thành phẩm bản vẽ xe hơi và bản vẽ concept.
Những ví dụ trên đây mang lại một thông điệp gì. Mình muốn các bạn hình dung từ thực tế rằng, các đối tượng mà chúng ta cần quan tâm đến từ các ví dụ này chính là những thứ hữu hình có thể nhìn thấy hay tương tác được từ phía người dùng. Trong đó thì các thành phẩm bánh quy và bản vẽ xe hơi chính là các đối tượng. Các đối tượng này được tạo ra dựa trên các khuôn mẫu của chúng, chính là cái khuôn bánh và bản vẽ concept, chúng chính là các lớp.
Giờ thì không ví dụ lan man nữa. Chúng ta quay về lĩnh vực lập trình với ví dụ về quản lý Sinh viên. Giả sử trong ngôi trường mà chúng ta cần quản lý có các Sinh viên sau.

Áp dụng từ các ví dụ 1 và 2. Sinh viên chắc chắn là đối tượng cần quản lý rồi. Vậy đâu sẽ là khuôn mẫu cho các đối tượng Sinh viên này. Trong trường hợp này, cái Khuôn mẫu ấy hơi trừu tượng xíu, nó sẽ là một hình tượng chung chung với các nhãn như: Giới tính, Tên, Lớp, Tuổi, Quê quán, Chiều cao, Cân nặng. Như hình bên dưới.

Từ khái khuôn mẫu đó, hay ta đã biết nó là lớp, nó sẽ giúp tạo ra nhiều đối tượng Sinh viên khác nhau. Như John-Giới tính Nam-22 tuổi-Lớp Java. Hay Elly-Giới tính Nữ-21 tuổi-Lớp Android,…
Vậy bạn đã hiểu khái niệm lớp là một khuôn mẫu để tạo ra các đối tượng rồi đúng không nào. Và nếu như đối tượng có các trạng thái và hành vi, thì lớp cũng có các thuộc tính và phương thức tương ứng.
Từ bài hôm trước tới giờ chúng ta chỉ lan man nói và nói. Giờ thì đến lúc code rồi. Nhưng trước khi đi vào cách thức code một Lớp, thì hãy cùng nhau đi qua phần này trước.
Khi bạn muốn đưa một thực thể nào đó về một đối tượng để quản lý, thì bạn phải tạo khuôn mẫu cho đối tượng đó. Đó chính là lớp. Và trước khi bắt tay vào tạo một lớp, bạn phải hình dung lớp đó với ba thành phần chính như biểu diễn sau.

Một khi bạn đã hình dung ra một lớp với ba thành phần như trên, thì việc biểu diễn ra thành code Java sẽ theo cú pháp sau.
class tên_lớp {
các_thuộc_tính;
các_phương_thức;
}
Trong đó:
Bài thực hành này chúng ta sẽ tiến hành xây dựng lớp Hình tròn mà ở bài hôm trước mình có ví dụ cho các bạn xem.
Bài thực hành này không đòi hỏi các bạn phải hiểu hết tất cả các dòng code, các bạn chỉ cần nhìn vào cấu trúc tổng quát của lớp Hình tròn như những gì mình nói đến ở bài hôm nay. Tất cả những chi tiết đắt giá của lớp sẽ được mình nói tiếp ở các bài học sau.
Chúng ta tạm thời code vào chung với lớp đang chứa đựng main(), và bên dưới main() này bạn khai báo HinhTron như sau.
Mình nói thêm một chút. Với khai báo một lớp như trên thì:
Bạn đã biết lớp chính là khuôn mẫu để tạo nên đối tượng. Và Bài thực hành số 1 trên kia bạn cũng đã tạo ra một lớp HinhTron. Vậy thì từ lớp HinhTron này bạn hoàn toàn có thể tạo ra các đối tượng khác nhau như sau.
Ồ, hẳn bạn có ngay so sánh, khi chúng ta làm quen đến biến, chúng ta cũng có các khai báo tương tự với các kiểu dữ liệu nguyên thủy.
Vậy thì khai báo một biến kiểu đối tượng và khai báo một biến kiểu nguyên thủy có khác nhau hay không. Câu trả lời là có, thậm chí chúng còn có một sự khác biệt lớn.
Với kiểu dữ liệu nguyên thủy, như bạn cũng đã biết, khi bạn khai báo một biến, giá trị của biến được lưu trữ vào trong chính biến đó, bạn hãy tưởng tượng việc lưu trữ này được mô tả theo sơ đồ như sau.

Sơ đồ thể hiện giá trị mặc định của kiểu số là 0 và boolean là false. Nếu chúng ta gán giá trị khác vào biến thì chúng ta vẫn hiểu là giá trị đó cũng được lưu vào biến như sơ đồ trên.
Nhưng khi bạn khai báo các đối tượng của lớp, hệ thống không tạo ra một biến có chứa giá trị là một đối tượng, mà sẽ tạo ra một tham chiếu đến đối tượng cụ thể. Như các code trên đây khi tạo các đối tượng hình tròn sẽ được minh họa như sau.

Giá trị null trong sơ đồ trên biểu thị rằng các đối tượng hinhTron1, hinhTron2,… tuy có kiểu dữ liệu là HinhTron, nhưng hiện tại các đối tượng này đang mang giá trị là các tham chiếu, mà các tham chiếu này không trỏ đến bất kỳ đối tượng nào (hay hiểu tham chiếu không có giá trị), nên được gán bằng giá trị null. Chúng ta sẽ nói rõ về giá trị null sau, nhưng bạn cũng nên biết rằng, với tham chiếu là null, các đối tượng chúng ta tạo ra chưa sử dụng được.
Ví dụ bạn code như sau sẽ bị báo lỗi.
Chúng ta hãy đến bước tiếp theo để có thể sử dụng các kiểu đối tượng đã khai báo này.
Đối tượng sẽ được khởi tạo giá trị, hay như biểu đồ trên bạn hiểu là làm cho tham chiếu trỏ đến một giá trị đối tượng cụ thể, bằng cách sử dụng từ khóa
, kèm với phương thức khởi tạo (constructor) của lớp mà chúng ta sẽ nói ở bài học này sau.
Vậy với các khai báo đối tượng hình tròn ở ví dụ trên chúng ta khởi tạo chúng như sau.
Code trên sẽ tạo ra các đối tượng hinhTron1, hinhTron2,… được tạo ra từ một khuôn mẫu chính là lớp HinhTron, được mang giá trị chính là các tham chiếu đến các đối tượng cụ thể. Khi đó sơ đồ được hiểu như sau.

Đến đây chắc bạn đã hiểu rõ vấn đề rồi đúng không nào. Giờ thì bạn hãy nhìn lại các code chúng ta đã dùng để khai báo các đối tượng để mà sử dụng từ trước đến giờ xem. Không cần tìm đâu xa, ngay cả trong bài thực hành trên cũng có đấy thôi, chính là dòng khai báo đối tượng scanner từ lớp Scanner (constructor của lớp Scanner có truyền thêm tham số
có hơi khác với constructor của HinhTron chúng ta vừa làm quen, đến bài về constructor bạn sẽ hiểu rõ thôi).
Với lớp HinhTron đã khai báo ở Bài thực hành số 1. Bây giờ bạn hãy thử khai báo và khởi tạo đối tượng Hình tròn bên trong main() như sau.
Một lần nữa đừng chú trọng quá vào cách thức sử dụng các phương thức trong một đối tượng, bạn sẽ quen với đối tượng sớm thôi.
Bạn chỉ cần chú ý một số chỗ.
Giờ đây nếu thực thi dòng code này thì bạn đã có thể tương tác với console được rồi đấy nhé.
Chưa có câu hỏi nào cho bài này.