2013-02-25 32 views
6

Giả sử tôi có các lớp sauJava Đúc với phương pháp kêu gọi

class A{ 
    public method(A a) { 
     System.out.println(3); 
    } 
} 

class B extends A{ 
    public void method (A a) { 
     System.out.println(2); 
    } 
    public void method (B b) { 
     System.out.println(1); 
    } 
} 

A obj = new B(); 
obj.method((B) obj); 
((B) obj).method((B) obj); 

Các bản in gọi phương thức đầu tiên ra 2 trong khi in Phương pháp thứ hai gọi ra 1. Tại sao không phải cả hai phương pháp gọi là in ra 1?

+0

Lưu ý rằng mã sẽ không biên dịch. –

Trả lời

3

Vì java chọn phương thức để gọi trong thời gian biên dịch. Và trình biên dịch chỉ tính đến "bên trái" của một nhiệm vụ.

Vì vậy, khi bạn nhập A obj = new B() trình biên dịch chỉ "thấy" các phương thức trong lớp A.

+0

Vâng ... trình biên dịch chỉ "thấy" rằng các phương thức như vậy được định nghĩa, nhưng gọi các phương thức của đối tượng, trong trường hợp này là các phương thức của lớp B vì nó có cùng phương thức với cùng các đối số. Điều đó xảy ra bởi vì tất cả các phương thức trong java đều là ảo. –

4

void method (B b) của B là hoàn toàn vô danh cho cha mẹ A. nó

Đó là hợp lý, bởi vì trong obj.method((B) obj);, loại obj là A có trong quy tắc đa hình nó chỉ có thể gọi void method(A a) phiên bản của lớp B.

class B extends A { 

    // This is an overridden method visible to A 
    public void method(A a) { 
     System.out.println(2); 
    } 

    // This is an overloaded method unknown from A 
    public void method(B b) { 
     System.out.println(1); 
    } 
} 

You can read this SO answer which explained Override vs. Overload.

1

Gọi phương thức đầu tiên được thực hiện bằng cách sử dụng tham chiếu đối tượng loại A, vì vậy phương pháp tương ứng có thể bị ghi đè, được gọi là .

Trong trường hợp thứ hai đầu tiên các diễn viên được thực hiện để loại B, vì vậy phương pháp quy định tại lớp B tương ứng, tức là,

method (B b) 

được gọi.

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