2012-04-16 36 views

Trả lời

13

Bạn có thể có phương thức chỉ nhận một phiên bản SuperClass. Kể từ SubClassSuperClass, bạn có thể sử dụng phiên bản SubClass và coi nó là SuperClass.

Các hành vi tương tự được sử dụng khi làm việc với giao diện:

List someList = new ArrayList(); 

Đó là vẻ đẹp của tính đa hình. Nó cho phép bạn thay đổi việc thực hiện nội bộ của lớp mà không vi phạm phần còn lại của mã của bạn.

+4

Điều quan trọng ở đây là 'SubClass' * là * một' SuperClass'. –

+0

Hành vi này có thay đổi trong Java 8 không? Tôi vừa thử nghiệm trường hợp một phương thức lấy tham số superclass 'void method (superClass param)' nhưng tôi có thể đặt trong một thể hiện subclass 'SubClass sub = new SubClass();' khi tôi gọi nó, như trong 'method (phụ); Điều này có nghĩa là khả năng tương thích trở lên hiện được cho phép? –

1

Tất cả những gì bạn đang làm là nói cho JVM biết loại tham chiếu là lúc biên dịch.

Trong trường hợp đầu tiên, bạn đang nói rằng tham chiếu đối tượng có loại tĩnh của lớp siêu. Khi bạn tạo một đối tượng lớp con mới, bạn có thể có điểm tham chiếu đó vì nó là một cá thể lớp siêu đẳng cấp IS-A.

4

Lý do chính để thực hiện trước đó là cho các cuộc gọi hàm mong đợi lớp học siêu hạng. Nếu bạn có một lớp A rằng có một phương pháp như thế này

public static void insert(SuperClass b) { 
    //do something 
} 

và bạn có

SuperClass object = new SubClass(); 

bạn có thể làm

A.insert(object); 

Nhưng nếu bạn làm

SubClass object new SubClass(); 

bạn không thể làm

A.insert(object); 

trừ khi bạn thêm một phương pháp như thế này đến A

public static void insert(SubClass b) { 
    //do something 
} 

Điều này giúp bạn cắt giảm trên mã dư thừa hoặc sao chép và giữ cho mọi thứ rõ ràng hơn.

12

Điều này được gọi là đa hình. Hãy tưởng tượng ví dụ sau:

Musician musician = new Pianist(); 

hoặc

Musician musician = new Drummer(); 

Giả sử Musician lớp có một phương pháp: play(). Không quan trọng ai là nhạc sĩ, nếu bạn gọi phương pháp chơi, bạn sẽ biết cách chơi nhạc cụ được xác định, dựa trên lớp cụ thể, trong trường hợp này, bất kể người chơi piano hay tay trống.

Mỗi lớp bê tông, ghi đè phương pháp play() của nó, có thể chơi một mình:

ví dụ cho Pianist lớp: play() { playsBeethoven(); }

Để biết thông tin chi tiết, xin vui lòng kiểm tra http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

Đó là luôn luôn tốt để nhớ để sử dụng nó với thừa kế http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

Đó là một trong những lý do chính bạn sử dụng thừa kế. Bạn đối xử với SuperClass như là một trừu tượng, và tại thời gian biên dịch bạn không cần phải biết loại có nguồn gốc, hoặc lớp khác không cần phải biết loại có nguồn gốc. Điều này cho phép bạn sử dụng các tham chiếu đến SuperClass trong khi sử dụng đa hình để gọi các phương thức của lớp dẫn xuất.

này cho phép bạn

a.) Tạo các nhà máy do đó bạn không cần phải biết loại tại thời gian biên dịch, và bạn có một số phương pháp runtime mà tạo ra các loại có nguồn gốc. Hãy suy nghĩ COM, GStreamer, DirectShow, Glib, vv ...

b.) Ẩn sự phức tạp với các đối tượng khác bằng cách chỉ hiển thị tham chiếu kiểu cơ sở mặc dù chúng là trường hợp của kiểu dẫn xuất. Hãy suy nghĩ về các phương thức trả về đối tượng hoặc lấy một tham chiếu đối tượng làm đối số.

c.) Nhiều khả năng khác, nhưng đó có thể là hai khả năng phù hợp nhất với bạn.

Các vấn đề liên quan