Kế thừa trong Java

Chào các anh chị. Em có 2 class, class Flight và class CargoFlight được kế thừa từ class Flight.

Class Flight có 1 method là add1Passenger, còn class CargoFlight có Method là add1Package

Em mới học nên còn thắc mắc sự khác nhau giữa những cách khai báo sau:

CargoFlight f1 = new CargoFlight();

Với cách khai báo này thì f1 có thể sử dụng tất cả thuộc tính và hàm ở cả 2 class FlightCargoFlight đúng không ạ?

Flight f2 = new CargoFlight();

Theo em hiểu thì với cách khai báo này thì f2 chỉ có thể sử dụng được thuộc tính và hàm ở Class Flight còn không dùng được gì ở Class CargoFlight. Vậy nếu thế thì sao không khai báo luôn là:
Flight f2 = new Flight(); mà phải khai báo kiểu Flight f2 = new CargoFlight();
Điều này có tác dụng gì ạ?

Với cách khai báo

Flight f2 = new CargoFlight();

sử dụng tính đa hình trong OOP.
Về vẻ ngoài, thì nó được đối xử như 1 class Flight, nhưng về bản chất thật nó vẫn là CargoFlight.
Ta khai báo như vậy vì thực sự ta muốn tạo 1 instance của CargoFlight nhưng cần trình biên dịch nhìn nhận nó là 1 Flight, điều này giúp ta có thể sử dụng array để chứa các lớp con dễ dàng hơn

Điều này giúp dễ dàng bỏ chúng vô array(hình góc trái dưới) mà không làm mất đi implement của CargoFlight nếu bạn Override function của nó, đồng thời cũng giữ nguyên được implement của hàm khởi tạo

Không biết mình nói vậy dễ hiểu không

2 Likes

Nếu khai báo

Flight f2 = new CargoFlight();

Làm vậy thì f2 vẫn được sử dụng các void ở CargoFlight (vì bản chất nó vẫn là 1 CargoFlight) bằng cách cast f2 sang CargoFlight

((CargoFlight) f2).add1Package

thì vẫn sẽ dùng được nhé :smile:
Còn nếu khai báo

Flight f2 = new Flight();

Thì việc cast sẽ không thành công.


Vậy cách khai báo đó có tác dụng là để cho hệ thống coi f2 là 1 Flight nhưng nó vẫn dùng được như 1 CargoFlight :smile:

Em vẫn chưa hiểu ạ @@

Vậy bạn muốn máy bay chở luôn hàng hay chỉ chở khách? :smiley:

Khi bạn đã trả lời được câu trên thì ta tiếp tục.

Câu này chỉ đúng một phần vì các phương thức trong Java đều ảo :slight_smile: tất nhiên là superclass không có thì cũng không gọi được.

Tham chiếu kiểu Flight là để tổng hợp (aggregate) mà không quan tâm đến subclass, và đối tượng subclass có thể tham chiếu bởi tham chiếu superclass.

3 Likes

Bạn tìm hiểu thêm về cơ chế Upcasting và Downcasting sẽ hiểu.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?