2012-06-11 13 views
10

Đây chỉ là một câu hỏi hết sức tò mò.Đa hình Java

Tôi biết rằng khi chúng ta gọi phương thức ghi đè của đối tượng lớp con bằng tham chiếu của siêu lớp của nó, JVM cho tầm quan trọng đối với loại đối tượng chứ không phải kiểu tham chiếu.

Đây là mã đơn giản của tôi:

class Animal 
{ 
    void eat() 
    { 
     System.out.println("Animal is eating..."); 
    } 
} 
class Horse extends Animal 
{ 
    @Override 
    void eat() 
    { 
     System.out.println("Horse is eating..."); 
    } 
} 
public class PolymorphismTest 
{ 
    public static void main(String...args) 
    { 
     Animal a=new Animal(); 
     a.eat(); 

     Animal h= new Horse(); 
     h.eat(); 
    } 
} 

Đúng như dự đoán, tôi nhận được kết quả:

run: 
Animal is eating... 
Horse is eating... 
BUILD SUCCESSFUL (total time: 0 seconds) 

Bây giờ câu hỏi của tôi là, Có cách nào mà chúng ta có thể sử dụng tài liệu tham khảo h gọi phương thức superclass eat() và không phải là lớp con? Tôi biết đây là một câu hỏi có phần chống lại các định luật đa hình nhưng bạn không bao giờ biết khi nào nhu cầu có thể phát sinh để làm như vậy.

Tôi đã cố gắng định kiểu tham chiếu h thành Animal nhưng không may mắn. Bất kỳ ý tưởng?

+0

có thể trùng lặp của http://stackoverflow.com/questions/5411434/how-to-call-a-superclass-method-using-java-reflection –

+2

Và cũng có thể trùng lặp của http: // stackoverflow. com/questions/1032847/can-java-call-parent-ghi đè-phương thức-in-other-objects-nhưng-không-subtype –

+0

Tôi đồng ý. Xin lỗi vì không đi qua nó. Tôi đã làm một số nghiên cứu nhưng không thể tìm thấy điều này. – Kameron

Trả lời

5
class Horse extends Animal 
{ 
    @Override 
    void eat() 
    { 
     super.eat(); 
    } 
} 
+0

Có, người ta không nên gọi thực hiện lớp cha mẹ để tuân thủ các định luật đa hình. Tôi sẽ dán lại liên kết này: http://stackoverflow.com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

4

Không, bạn sẽ phải thực hiện điều đó một cách rõ ràng theo phương pháp ghi đè (nghĩa là super.eat()).

2

Bạn không thể thực hiện việc này bằng cách thực hiện bất kỳ hình thức in ấn nào. Cách duy nhất của bạn để gọi phương thức của lớp cha là quấn nó như Brett Holt đã cho thấy, hoặc bạn phải có một đối tượng có kiểu thời gian chạy cụ thể nhất là Animal.

2

Trong Java - Tất cả các phương pháp là phương pháp ảo thực hiện gần đây nhất được sử dụng trong khi gọi hàm.

Để trả lời câu hỏi của bạn, vui lòng thực hiện phương thức static trong Lớp học động vật, sau đó bạn sẽ nhận được phương thức ăn của lớp Động vật được gọi.

static void eat(){ 
     System.out.println("Animal is eating..."); 
}