Vì vậy, tôi đã thử nghiệm với một số đoạn mã để quấn quanh đầu của tôi xung quanh khái niệm về thừa kế, khi tôi bắt gặp điều này - đối với tôi - hiện tượng kỳ lạ.Tại sao thay đổi loại dẫn đến sử dụng khác nhau của các thành viên?
Vì vậy, đầu tiên tôi đã được thử nghiệm mã đơn giản này:
public class Main{
public static void main(String[] args) {
Bar bar = new Bar();
System.out.println("age = " + bar.age);
bar.test();
}
}
class Foo{
int age = 2;
void test(){
System.out.println("TEST FOO");
}
}
class Bar extends Foo{
int age = 4;
void test(){
System.out.println("TEST BAR");
}
}
Và kết quả là như tôi mong đợi:
age = 4
TEST BAR
Sau đó, tôi đã thực hiện một thay đổi nhỏ cho dòng 3, nơi tôi đã thay đổi kiểu Bar
để Foo
như thế này:
Foo bar = new Bar();
Bây giờ khi tôi chạy cod e, nó mang lại cho tôi một đầu ra tôi tin là lạ:
age = 2
TEST BAR
Làm thế nào để cho nó xảy ra rằng mã bar.age
hiện đang sử dụng age
thành viên của lớp Foo
(có ý nghĩa), trong khi bar.test();
vẫn sử dụng phương pháp lớp Bar
(và không phải từ Foo vì đó là loại gì)?
https://stackoverflow.com/questions/12589274/slight-confusion-regarding-overriding-where-variables-are-concerned hoặc https://stackoverflow.com/questions/10722110/overriding-member-variables-in -java –
@RC. Thú vị đọc, đã được tìm kiếm cho điều đó. Cảm ơn. – moffeltje
Bên cạnh khía cạnh kỹ thuật: làm như vậy đây là ** không ** OOP vì nó vi phạm nguyên tắc quan trọng nhất của OO: * che giấu/đóng gói thông tin *. –