Tính Đa Hình Là Gì

  -  

1. Tính đa hình (polymorphism) trong Java là gì?

Tính đa hình (polymorphism) hiểu đơn giản là các đối tượng, các phương thức giống nhau có thể có các hành vi khác nhau tùy vào từng tình huống khác nhau.class Polygon { //phương thức render của lớp Polygon public void render() { System.out.println("Rendering Polygon..."); }}class Square extends Polygon { //ghi đè phương thức render
Override public void render() { System.out.println("Rendering Square..."); }}class Circle extends Polygon { //ghi đè phương thức render
Override public void render() { System.out.println("Rendering Circle..."); }}class Main { public static void main(String<> args) { // create an object of Square Square s1 = new Square(); s1.render(); // create an object of Circle Circle c1 = new Circle(); c1.render(); }}Kết quảRendering Square...Rendering Circle...Ở ví dụ trên, lớp Polygon có 2 lớp con là Square and Circle. Chúng đều có hàm render() nhưng hàm này thực thi khác nhau trong từng lớp. Đó là biểu hiện của tính đa hình (polymorphism).

Bạn đang xem: Tính đa hình là gì

2. Tại sao sử dụng tính đa hình (polymorphism)

Tính đa hình (polymorphism) trong Java cho phép chúng ta tạo ra những mã code nhất quán. Lấy ví dụ ở phần 1, chúng ta có thể tạo ra các hàm render với các tên khác nhau như renderSquare()renderCircle() cho từng lớp SquareCircle.Chương trình của bạn cũng sẽ hoạt động tốt thôi nhưng việc tạo ra các tên khác nhau cho một hàm có chức năng giống nhau thì sẽ làm code không nhất quán, rườm rà, cồng kềnh.Tính đa hình cho phép chúng ta tạo ra một hàm tên là render() duy nhất nhưng sẽ thực thi khác nhau với từng lớp khác nhau.Trong Java, chúng ta có thể đạt được tính đa hình (polymorphism) với nạp chồng phương thức (method overloading), ghi đè phương thức (method overriding).Lưu ý: Trong Java không hỗ trợ lập trình viên tự định nghĩa nạp chồng toán tử (operator overloading) như trong C++.

3. Chuyển đổi kiểu dữ liệu đối tượng

Kiểu dữ liệu tham chiếu (các lớp) có thể được chuyển đổi kiểu khi kiểu dữ liệu tham chiếu (lớp) tương thích, tức là nằm trên cùng một cây phân cấp kế thừa.

Xem thêm: Tìm Hiểu Phân Lân Là Gì ? Cách Sử Dụng Phân Lân Đúng Cách Phân Lân Là Gì


*

Có hai cách chuyển đổi là Up-castingDown-casting.Up-casting– Đi lên trên cây phân cấp thừa kế. Up-casting là khả năng nhìn nhận đối tượng thuộc lớp dẫn xuất như là một đối tượng thuộc lớp cơ sở.– Tự động chuyển đổi kiểu.Ví dụ:
*

class Person{ String name; Date birthday; public void setName(String name){ this.name = name; } public void setBirthday(Date birthday){ this.birthday = birthday; } public String getDetails(){ String detail = ""; detail = "Name: " + name + ", birthday: " + new SimpleDateFormat("MM-dd-yyyy").format(birthday); return detail; }}class Employee extends Person{ double salary; public void setSalary(double salary){ this.salary = salary; }

4. Toán tử instanceof

Toán tử instanceof trong Java được sử dụng để kiểm tra một đối tượng có phải là thể hiện của một kiểu dữ liệu (lớp) nào đó hay không.

Xem thêm: Trò Chơi Game Đập Bong Bóng Ma Sieu Kinh Di, Trò Chơi Bóp Bong Bóng

instanceof trong Java được gọi là toán tử so sánh kiểu. Nó trả về giá trị booleantrue hoặc false. Nếu bạn dùng toán tử instanceof với bất kỳ biến nào mà có giá trị null thì kết quả trả về sẽ là false. Ví dụ:public class Simple {public static void main(String args<>) {Simple s = new Simple();System.out.println(s instanceof Simple);// true}}Một đối tượng có kiểu của lớp con thì cũng có kiểu của lớp cha.Ví dụ: Nếu Dog kế thừa từ Animal thì đối tượng của Dog có thể tham chiếu đến cả hai lớp DogAnimal.class Animal {}public class Dog extends Animal {// Dog inherits Animalpublic static void main(String args<>) {Dog dog = new Dog();System.out.println(dog instanceof Animal);// true}}Nếu sử dụng toán tử instanceof với biến có kiểu bất kỳ có giá trị null thì giá trị trả về luôn là null. Ví dụ:
public class Dog {public static void main(String args<>) {Dog d = null;System.out.println(d instanceof Dog);// false}}
Bài trước và bài sau trong môn học>" data-wpel-link="internal">Tính đóng gói (encapsulation) trong Java >>