2012-09-04 40 views
7

Nếu tôi có hai lớp, A và B,Java gọi phương thức lớp con khi cố gắng sử dụng phương pháp lớp cha

public class A { 
    public int test() { 
     return 1; 
    } 
} 

public class B extends A{ 
    public int test() { 
     return 2; 
    } 
} 

Nếu tôi làm: A a1 = new B(), sau đó a1.test() returns 2 thay vì 1 như mong muốn. Đây có phải chỉ là một điều kỳ quặc của Java, hay có lý do nào đó cho hành vi này?

+1

Đây được gọi là 'liên kết động', Bạn cũng cần biết về' liên kết tĩnh'. Sẽ phức tạp hơn khi bạn cố ghi đè (ẩn ẩn) các trường thay vì các phương thức. Bạn sẽ tìm thấy rất nhiều câu hỏi về điều này trên SO hoặc google. –

Trả lời

3

Không, đó là chính xác (đó là do đa hình). Tất cả các cuộc gọi phương thức hoạt động trên đối tượng, không phải loại tham chiếu.

Ở đây đối tượng của bạn thuộc loại B, do đó phương pháp thử nghiệm của class B sẽ được gọi.

+0

Cảm ơn, đây là những gì tôi đã nhầm lẫn. Đã được mong đợi hành vi dựa trên loại tài liệu tham khảo. –

5

Điều này được gọi là polymorphism. Khi chạy, phương thức chính xác sẽ được gọi theo loại "thực" của a1, là B trong trường hợp này.

Như wikipedia đặt nó độc đáo:

Việc sử dụng chính của đa hình trong ngành công nghiệp (hướng đối tượng lý thuyết lập trình) là khả năng của các đối tượng thuộc loại khác nhau để đáp ứng với phương pháp, lĩnh vực, hoặc tài sản các cuộc gọi cùng tên, mỗi cuộc gọi theo một hành vi cụ thể theo loại thích hợp. Lập trình viên (và chương trình) không phải biết chính xác loại đối tượng trước và do đó hành vi chính xác được xác định tại thời gian chạy (điều này được gọi là ràng buộc trễ hoặc liên kết động).

+0

+1 cho đa hình –

0

Đây là hành vi dự định. Phương pháp test() trong lớp B được trọng dụng phương pháp test() của lớp A.

0

Đối

A a1 = new B(); 

a1 đang hướng về phía đối tượng của B là loại thực tại thời gian chạy. Do đó giá trị được in từ Object B.

0
A obj = new A(); 
obj.test() 

sẽ trở lại 1

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

sẽ trở lại 2

B obj = new B(); 
obj.test() 

sẽ trở lại 2

Như đã nêu trong câu trả lời khác đây là cách đa hình hoạt động.

This bài có thể làm cho mọi việc rõ ràng hơn một chút

0

Java sử dụng động ràng buộc (hoặc cuối ràng buộc), vì vậy phương pháp B được gọi, không A. Điều này ngược lại với ràng buộc tĩnh. Có một ví dụ tốt đẹp here.

0

Bạn khai báo đối tượng là A nhưng đối tượng của bạn là B. Vì vậy, phương thức sẽ được gọi là từ lớp B.B mở rộng A (chúng ta có thể nói rằng A là cha mẹ cho B) nếu bạn sẽ bình luận thử nghiệm phương pháp trong B và sau đó gọi lại phương pháp này, trong trường hợp này phương pháp được gọi sẽ được kiểm tra từ lớp A và sẽ trả về 1.

2

polymorphism và cụ thể hơn trong Java overriding. Nếu bạn muốn gọi phương thức test Class A từ lớp B thì bạn cần sử dụng super để gọi phương thức super classes. ví dụ:

public class B extends A{ 
    public int test() { 
     return super.test(); 
} 
Các vấn đề liên quan