Gửi bởi
ngoctigerstyle
Giả sử ta có lớp A
Lớp B,C , D kế thừa lớp A.
Muốn khai báo một mảng đối tượng lớp A nhưng mỗi phần tử tuơng ứng lại là đối tượng lớp B C D thì khai báo ntn vậy?
Làm như sau:
Mã:
A[] arr = new A[3];A[0]=new B();A[1]=new C();A[2]=new D();
Tuy nhiên lưu ý một chút là nếu mà việc thiết kế như vậy mà dẫn tới việc bạn phải dùng toán tử instanceof thì đó là 1 thiết kế không tốt (còn nếu không thì không sao).
Nghĩa là nếu làm như sau thì được:
Mã:
package polymorphismdemo; public abstract class Animal { public abstract void hello();}
Mã:
package polymorphismdemo; public class Bee extends Animal { @Override public void hello() { System.out.println("I'm a bee"); } }
Mã:
package polymorphismdemo; public class Bird extends Animal { @Override public void hello() { System.out.println("I'm a bird"); } }
Mã:
package polymorphismdemo; public class Rabbit extends Animal { @Override public void hello() { System.out.println("I'm a rabbit"); } }
Mã:
package polymorphismdemo; public class Demo { public static void main(String[] args) { Animal[] animals = new Animal[3]; animals[0]=new Bee(); animals[1]=new Bird(); animals[2]=new Rabbit(); for (Animal animal:animals) { animal.hello(); } }}
Còn nếu làm như sau đây thì là có vấn đề:
Mã:
package polymorphismdemo; public abstract class Animal { public abstract void hello();}
Mã:
package polymorphismdemo; public class Bee extends Animal { @Override public void hello() { System.out.println("I'm a bee"); } public void fly() { System.out.println("I'm flying"); } }
Mã:
package polymorphismdemo; public class Bird extends Animal { @Override public void hello() { System.out.println("I'm a bird"); } public void fly() { System.out.println("I'm flying"); } }
Mã:
package polymorphismdemo; public class Rabbit extends Animal { @Override public void hello() { System.out.println("I'm a rabbit"); } public void run() { System.out.println("I'm running"); }}
Mã:
package polymorphismdemo; public class Demo { public static void main(String[] args) { Animal[] animals = new Animal[3]; animals[0]=new Bee(); animals[1]=new Bird(); animals[2]=new Rabbit(); for (Animal animal:animals) { if (animal instanceof Bee) { ((Bee)animal).fly(); } else if (animal instanceof Bird) { ((Bird)animal).fly(); } else if (animal instanceof Rabbit) { ((Rabbit)animal).run(); } } }}
Dùng instanceof dẫn đến nhược điểm lớn là khi nào mà thêm một class con của Animal thì lại phải sửa vào class Demo.
Java có hỗ trợ đặc tính đa hình (polymorphism) giúp tránh những cái switch, if phức tạp và gò bó, chính vì vậy nên nếu mà dùng tính đa hình rồi mà vẫn còn phải dùng switch, if, instanceof và ép kiểu (downcast) như vậy thì cần xem xét lại có cái gì đó không ổn.
Lưu ý thêm: tiêu đề đặt chung chung, không tốt cho cộng đồng tham khảo.
Bạn nên đặt tiêu đề là: Làm thế nào để khai báo mảng các đối tượng khác lớp nhưng cùng kế thừa một lớp chung.
Tuy hơi dài nhưng mà dễ tham khảo.
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...