Bài viết hôm nay mình sẽ giới thiệu đến các bạn một tính chất quan trọng trong lập trình hướng đối tượng đó là tính đa hình trong java.
Tính đa hình trong java
Tính đa hình ( Polymorphism ) là một khái niệm mà chúng ta có thể thực hiện một công việc bằng nhiều cách khác nhau. Có hai kiểu đa hình trong java đó là đa hình lúc thực thi ( runtime ) và đa hình trong lúc biên dịch ( compile ).
- Đa hình lúc biên dịch ( compile ) gọi là overloading.
- Đa hình lúc thực thi ( runtime ) gọi là overriding.
Đa hình lúc thực thi ( overriding )
- Overriding là quá trình gọi phương thức đã được ghi đè trong thời gian thực thi chương trình. Trong quá trình này, một phương thức được ghi đè được gọi thông qua một biến tham chiếu của lớp cha.
class Point{ } class Cricle extends Point { }
Point A = new Cricle() ; A là một biến tham chiếu kiểu Point (lớp cha).
Quá trình này gọi là Upcasting.
Các ví dụ về overriding trong java
- Ví dụ này ta tạo ra hai lớp là
Car
vàOto
. Lớp Oto kế thừa lớp Car và ghi đè phương thức run() của nó. Chúng ta gọi phương thức run bởi biến tham chiếu của lớp Car. Khi nó tham chiếu tới đối tượng của lớp con ( lớp Oto) và phương thức lớp con ghi đè phương thức của lớp cha, phương thức lớp con được gọi lúc runtime. Quá trình ghi đè phương thức trên gọi là overriding.
class Car{ public void run(){ System.out.println("Car running..."); } } class Oto extends Car { public void run(){ System.out.println("Oto running"); } } class Test{ public static void main(String[] args){ Car A = new Oto(); // Quá trình Upcasting A.run(); } }
Sau khi chạy chương trình trên ta có kết quả sau
Oto running
- Lưu ý là quá trình quá trình ghi đè lúc runtime ( hay overriding ) chỉ xảy ra với các phương thức giống nhau về tham số và kiểu trả về. Các thuộc tính của đối tượng cha không thể bị ghi đè.
Xét ví dụ sau
class Car{ public int run(){ System.out.println("Car running..."); return 0; } } class Oto extends Car { public void run(){ System.out.println("Oto running"); } } class Test{ public static void main(String[] args){ Car A = new Oto(); A.run(); } }
- Biên dịch chương trình trên sẽ bị lỗi.
Xét một ví dụ khác để chứng minh không thể overriding cho các thành viên dữ liệu ta xét ví dụ sau
class Car{ int a = 10; } class Oto extends Car { int a = 20; } class Test{ public static void main(String[] args){ Car A = new Oto(); System.out.println(A.a); } }
10
Như vậy thuộc tính a
của lớp cha không thể bị ghi đè.
Bài viết của mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Để lại một bình luận