Vấn đề của tôi là tôi không thể hiểu cách phân giải phương thức hoạt động trong trường hợp sau: Giả sử, chúng tôi có hai gói, A
và B
. Có hai lớp, A
được đặt trong số A
, B
trong phạm vi B
.Cách ghi đè phương thức với phạm vi hiển thị (gói) mặc định?
A:
package com.eka.IO.a;
import com.eka.IO.b.B;
public class A {
void foo() {
System.out.println("parent");
}
public static void main(String... args) {
B obj = new B();
obj.foo();
}
}
B:
package com.eka.IO.b;
import com.eka.IO.a.A;
public class B extends A {
public void foo() {
System.out.println("child");
}
}
Đoạn mã trên bản in "trẻ em", mà là hoàn toàn OK. Nhưng nếu tôi thay đổi phương thức theo cách sau:
public static void main(String... args) {
A obj = new B();
obj.foo();
}
mã in "gốc" và tôi không hiểu tại sao. (obj
có kiểu runtime B
, B
có một phương pháp nào foo
)
Tiếp theo, tôi thay đổi tầm nhìn foo của công chúng,
public class A {
public void foo() {
và in mã "con" một lần nữa.
Theo như tôi biết, phương pháp dụ được giải quyết trong thời gian chạy, sử dụng theo nguyên tắc sau đây:
- JVM kiểm tra lớp thời gian chạy của đối tượng.
- JVM tìm phương pháp của lớp thời gian chạy
- Nếu phương pháp được tìm thấy, JVM gọi nó, nếu không di chuyển đến lớp thời gian chạy cha mẹ.
Trong ví dụ của tôi, trong bất kỳ trường hợp nào, lớp thời gian chạy cho obj
luôn là B
. Phương phápfoo
luôn công khai. Tại sao trong trường hợp thứ hai JVM gọi phương thức của A
?
Lên: Câu trả lời hay, nhưng vẫn còn một số điều không rõ ràng đối với tôi. a) Trình biên dịch kiểm tra xem phương thức ghi đè phương thức khác hay không. (Hy vọng, tôi đúng). b) trong trường hợp A obj = new B();
trình biên dịch tạo ra các mã sau:
INVOKEVIRTUAL com/eka/IO/a/A.foo()V
b1) nếu A của foo được khai báo mà không sửa đổi (tầm nhìn gói), sau đó JVM gọi phương thức của một. b2) nếu foo của A được khai báo công khai, thì JVM gọi phương thức B.
Điều không rõ ràng là lý do tại sao trong trường hợp thứ hai INVOKEVIRTUAL thực sự gọi B.foo. Làm thế nào để nó biết, rằng B ghi đè phương pháp?
Tôi đã xóa nhận xét đó và chuyển vào câu trả lời. Thuật ngữ thích hợp là bóng. –