Class và object

Class và object

Một chút về định nghĩa

Trong Java, object là các đối tượng có các thuộc tính (properties) và hành động (method).

Ví dụ: 1 con mèo là 1 đối tượng (object) có thuộc tính color = yellow (lông màu vàng) và phương thức eat() – hành động ăn.

Class là thứ đặc trưng cho các đối tượng cùng kiểu. Ví dụ class Cat đặc trưng cho các object mèo (là những đối tượng có các thuộc tính color và phương thức eat.

Khai báo class

Ta sử dụng từ khóa class để khai báo class:

Ở trong class Cat này ta đã khai báo các thuộc tính color và name cho các đối tượng Cat.

Ta cũng khai báo 1 phương thức eat cho các đối tượng Cat.

Đồng thời ta cũng xây dựng 1 phương thức cho phép tạo ra các đối tượng Cat – phương thức này gọi là constructor – hàm khởi tạo (sẽ nói ở phần sau):

Như các bạn thấy hàm khởi tạo này cho phép tạo ra đối tượng Cat có thuộc tính name và color.

Khởi tạo đối tượng

Ta sẽ tạo ra 1 đối tượng Cat như sau:

Giờ đây ta đã có thể sử dụng các phương thức trong class Cat:

Nạp chồng phương thức – Overloading methods

Trong 1 class, đôi khi với 1 phương thức ta có thể truyền các đầu vào khác nhau. Java cho phép ta tạo ra nhiều phương thức có cùng tên, nhưng khác đầu vào.

Ví dụ class Cat trên đã có sẵn phương thức eat – ko truyền giá trị đầu vào. Giả sử ta muốn khai báo thêm 1 phương thức eat(String food) truyền thêm đầu vào là food. Ta sẽ làm như sau:

Như vậy 1 phương thức eat khác đã được tạo ra và cho phép ta truyền giá trị đầu vào là food – tên thức ăn. Ta sẽ sử dụng phương thức này:

Tương tự với hàm khởi tạo, ta cũng có thể tạo ra nhiều hàm khởi tạo với các giá trị truyền vào khác nhau. Ta sẽ thêm 1 hàm khởi tạo mới cho lớp Cat:

Hàm này chỉ cho phép truyền vào name mà ko cho truyền thêm color như ban đầu. Ta sẽ thử tạo 1 đối tượng bằng hàm khởi tạo mới:

Khi nào thì được nạp chồng hàm

Khi số lượng các tham số truyền vào hàm là khác nhau

Ví dụ:

Khi thứ tự các tham số truyền vào là khác nhau

Ví dụ:

Ghi đè phương thức – override method

Ghi đè phương thức là việc định nghĩa lại 1 phương thức đã có từ trước. Ví dụ thế này, ta có 1 class Shape:

Shape có phương thức tính diện tích getArea trả về giá trị float = 1. Giờ ta sẽ ghi đè (override) phương thức getArea này.

Đầu tiên ta khai báo 1 lớp Square kế thừa Shape:

Nói qua cho các bạn nào chưa rõ, việc 1 classA kế thừa 1 classB có nghĩa là classA được thừa hưởng các phương thức public và thuộc tính public của classB. Hay nói cách khác đối tượng classA sẽ có các phương thức và thuộc tính public đã định nghĩa trong classB.

Ở trường hợp này Square kế thừa Shape. Vì vậy 1 đối tượng Square sẽ có thể sử dụng phương thức getArea (tính diện tích) của Shape. Ví dụ:

Nhưng tất nhiên, Square (hình vuông) sẽ có 1 cách tính diện tích (getArea) riêng. Và ta cần ghi đè (viết lại) phương thức getArea() trong class Square như thế này:

Ta đã sử dụng annotation @Override để chỉ ra phương thức getArea đã được ghi đè. 

Khi này ta sẽ có:

Nếu ta tạo 1 class Circle (hình tròn), và kế thừa Shape, ta cũng có thể ghi đè override lại phương thức getArea():

Và ta thử:

Hàm khởi tạo

Hàm khởi tạo là 1 phương thức đặc biệt để tạo ra 1 đối tượng. Cũng giống như các phương thức khác, hàm khởi tạo có thể nhận các giá trị đầu vào. Chỉ có điều hàm khởi tạo không trả về giá trị nào.

Như ví dụ ở trên:

Ở đây ta thấy:

chính là hàm khởi tạo của lớp Circle.

Những điều cần lưu ý về hàm khởi tạo:

  • Hàm khởi tạo có thể mang bất kỳ modifier nào (public, private, protected), nhưng không được khai báo dưới dạng abstract, static, hay synchronized.
  • Hàm khởi tạo ko trả về giá trị.
  • Hàm khởi tạo bắt buộc phải có tên trùng với tên class
  • từ khóa this sử dụng trong hàm khởi tạo dùng để chỉ đối tượng hiện tại (đối tượng mà hàm khởi tạo đó tạo ra)

Thuộc tính static

Java cho phép ta sử dụng 1 biến static làm thuộc tính của class. Vậy thuộc tính static này khác với thuộc tính thông thường mà ta đã biết ở chỗ nào?

Mình tạo 1 class:

Ở đây ta tạo 1 class chứa 1 thuộc tính kiểu intmemberCounter và thuộc tính static int staticCounter

Giờ mình sẽ chỉ ra sự khác nhau giữa 2 thuộc tính này:

Ta tạo ra 2 đối tượng o1o2, 2 đối tượng này cùng gọi đến phương thức increment. Tổng cộng là 3 lời gọi đến phương thức increment.Ta sẽ xem log kết quả để thấy sự khác biệt giữa memberCounter  staticCounter. Kết quả là:

Thuộc tính static là thành phần của class và chỉ tồn tại duy nhất trong class đó. Tức là bạn có thể tạo ra hàng trăm đối tượng, nhưng các thuộc tính static thì chỉ được tạo ra duy nhất 1 lần.

Thuộc tính thường (non static) thì được tạo ra với từng đối tượng của class.

Như ở ví dụ trên: thuộc tính staticCounter được tạo ra duy nhất 1 lần, và mỗi lần gọi hàm increment, giá trị của nó đều tăng lên 1.

Thuộc tính memberCounter thì khác, mỗi đối tượng của lớp ObjectMemberVsStaticMember được sinh ra, thì sẽ có 1 biến memberCounter mới được sinh ra. Như bạn thấy giá trị memberCounter của o1  memberCounter của o2 là khác nhau.

 

Hãy chia sẻ

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *