Đa hình là gì?
Hiểu một cách đơn giản đa hình là tại từng thời điểm đối tượng sẽ có các hình thái khác nhau trong những hoàn cảnh khác nhau.
Ví dụ : Khi bạn ở trong trường học là sinh viên thì có nhiệm vụ học, nghe giảng, vào thư viện đọc sách… nhưng khi bạn ở nhà lại đóng vai trò là thành viên trong gia đình có nhiệm vụ làm việc nhà…rồi khi bạn vào siêu thị thì bạn đóng vai trò là khách hàng mua hàng. Vì vậy, ta hiểu đa hình của đối tượng là trong từng trường hợp, hoàn cảnh khác nhau thì đối tượng có khả năng thực hiện các công việc khác nhau.
Tính đa hình trong lập trình OOP Java
– Lớp cha được đại diện bởi các lớp con khác nhau gọi là đa hình. Tức là tại từng thời điểm đối tượng cha thực sự là đối tượng con nào đó.
– Ví dụ :
1
2
3
| Animal a = new Animal(); a = new Cow(); // tại thời điểm, a là đối tượng Cow a = new Buffalo(); // tại thời điểm này a là đối tượng Buffalo |
– Trình biên dịch (compiler) chỉ biết kiểu dữ liệu của đối tượng khi khai báo. Tuy nhiên, giai đoạn runtime thì JVM xác định được đối tượng thực sự.
– Đa hình không áp dụng cho các thành phần tĩnh (static) của lớp.
– Vấn đề chuyển đổi kiểu dữ liệu là cơ bản hiện thực của đa hình.
– Ví dụ :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| class Animal { public void saySomething() { System.out.println("Umm..."); } } class Cow extends Animal { public void saySomething() { //super.saySomething(); System.out.println("Moo!"); } } class Buffalo extends Animal { public void saySomething() { //super.saySomething(); System.out.println("Bah!"); } } // Sử dụng public class TestPoly { public static void main(String[] args) { Animal a = new Animal(); Cow c = new Cow(); Buffalo b = new Buffalo(); a.saySomething(); a=c; a.saySomething(); a=b; a.saySomething(); } } |
Lời kết : Tính đa hình trong lập trình hướng đối tượng java là một trong những thuộc tính quan trọng, vì vậy bạn không thể bỏ qua thuộc tính này dù nhiều lúc hơi khó hiểu một chút. Bạn nên đọc lại 1 lần nữa những nội dung trên nếu vẫn còn chưa nắm rõ tính chất này.
Với đa hình, tham chiếu có thể thuộc kiểu lớp cha của lớp của đối tượng được
tạo. Khi ta khai báo một biến tham chiếu thuộc kiểu lớp cha, nó có thể được gắn với
bất cứ đối tượng nào thuộc một trong các lớp con.
Đặc tính này cho phép ta có những thứ thú vị kiểu như mảng đa hình. Ví dụ,
trong Hình 7.2, ta khai báo một mảng kiểu Animal, nghĩa là một mảng để chứa các
đối tượng thuộc loại Animal. Nhưng sau đó ta lại gắn vào mảng các đối tượng thuộc
các lớp con tùy ý của Animal.
tạo. Khi ta khai báo một biến tham chiếu thuộc kiểu lớp cha, nó có thể được gắn với
bất cứ đối tượng nào thuộc một trong các lớp con.
Đặc tính này cho phép ta có những thứ thú vị kiểu như mảng đa hình. Ví dụ,
trong Hình 7.2, ta khai báo một mảng kiểu Animal, nghĩa là một mảng để chứa các
đối tượng thuộc loại Animal. Nhưng sau đó ta lại gắn vào mảng các đối tượng thuộc
các lớp con tùy ý của Animal.
Ví dụ về đa hình tại runtime trong Java
Trong ví dụ, chúng ta tạo hai lớp Bike và Splendar. Lớp Splendar kế thừa lớp Bike 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 cha. Khi nó tham chiếu tới đối tượng của lớp con 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 triệu hồi tại runtime.
Khi việc gọi phương thức được quyết định bởi JVM chứ không phải Compiler, vì thế đó là đa hình tại runtime.
class Bike{ void run(){System.out.println("dang chay");} } class Splender extends Bike{ void run(){System.out.println("chay an toan voi 60km");} public static void main(String args[]){ Bike b = new Splender();//day la upcasting b.run(); } }
Nhận xét
Đăng nhận xét