2014-06-12 15 views
7

Tôi có 3 lớp GrandParent, ParentChild, nơi Child extends ParentParent extends GrandParentPhương pháp quá tải với mẹ và lớp trẻ như tham số

public class Main { 
    void test(GrandParent gp){System.out.println("GrandParent");} 
    void test(Parent p){System.out.println("Parent");} 

    public static void main(String args[]){ 
     GrandParent obj = new Child(); 
     Main mainObj = new Main(); 
     mainObj.test(obj); // This calls test(GrandParent gp) 

     mainObj.test(new Child()); // This calss test(Parent gp) 
    } 
} 

Trong đoạn code trên trong vòng 2 cuộc gọi đến test() phương pháp cả với Child đối tượng gọi khác nhau phương pháp. Trong một trong đó là làm biên dịch-thời gian và trong thời gian chạy khác ràng buộc. Điều này nghe có vẻ kỳ lạ với tôi. Làm thế nào bạn sẽ giải thích điều này?

+2

Uh, có vẻ như tôi thích việc biên dịch thời gian biên dịch trong cả hai trường hợp ... Tìm hiểu cách thức quá tải phương thức được giải quyết, cần có câu trả lời nổi trên SO ở đâu đó – awksp

+0

Đó là thời gian biên dịch cả hai trường hợp ... –

Trả lời

7

Quá tải phương thức là tính đa hình thời gian biên dịch.

Ghi đè phương pháp là đa hình thời gian chạy.

Trong trường hợp của bạn, bạn đang quá tải hai phương pháp thể hiện của lớp Main.

Tuy nhiên, kể từ khi tôi đoán trong bối cảnh của bạn Child kéo dài Parent, new Child() instanceof Parent == true do đó một thể hiện của Child là một đối số hợp lệ đối với phương pháp test với lập luận kiểu Parent.

Trong trường hợp đầu tiên, bạn chuyển loại tham chiếu GrandParent trong phương thức test và tìm thấy loại chính xác.

Trong trường hợp thứ hai, bạn chuyển loại tham chiếu Child vào phương thức test. Trận đấu gần nhất là Parent, do đó test(Parent p) được gọi.

0

Quá tải có nghĩa là cùng một thông số khác nhau. Ví dụ:

 class A { 
      public void m1(int a) { 
       System.out.println("class A"); 
      } 
      public void m1(int a,int b) { 
       System.out.prinln("2 parameter"); 
      } 
     } 

Đây được gọi là quá tải phương thức.

+4

Đúng vậy , nhưng điều đó không hoàn toàn trả lời câu hỏi của OP. – awksp

0

Tôi nghĩ bạn đang nhầm lẫn với hệ thống phân cấp của mình.

Thực tế bạn nói: Child mở rộng Parent - điều này có nghĩa là Child "is a" Parent.

Do thực tế điều này không có ý nghĩa trong "thế giới thực" - tuy nhiên, có ý nghĩa trong mã của bạn - bạn đang cung cấp đối tượng con cho phương pháp kiểm tra void (Parent p) - và từ một Child là một Parent - đây là lý do tại sao System.out.println ("Parent") được gọi.

+1

Nhưng một 'Child' cũng là' Grandparent' trong hệ thống phân cấp này, phải không? Vậy tại sao phương thức 'Parent' được gọi ra chứ không phải phương thức' Grandparent'? Về mặt kỹ thuật, bạn không hoàn toàn trả lời câu hỏi của OP. – awksp

+0

Tôi giả sử rằng đưa ra một khai báo phù hợp khác, kiểm tra void - void (Object o) cung cấp một đối tượng Child sau đó sẽ gọi phương thức này, do thực tế lớp Child ngầm mở rộng Object. Tuy nhiên, tôi có thể sai. –

+0

Tùy thuộc vào nếu tôi đang nghĩ cùng một điều như bạn, nó thực sự sẽ không, nếu bạn đã làm 'test (new Child())'. Nếu bạn đã gán 'new Child()' cho một 'Object' và truyền nó, tôi nghĩ nó sẽ như thế. – awksp

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