2017-12-05 66 views
17

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ì)?

+2

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 –

+0

@RC. Thú vị đọc, đã được tìm kiếm cho điều đó. Cảm ơn. – moffeltje

+1

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 *. –

Trả lời

22

Các age trong Barbóng các age trong Foo.

Hơn nữa, các trường là không đa hình (xem chức năng).

Vì vậy, khi bạn viết Foo bar = new Bar();, loại tĩnh của bar được sử dụng khi truy cập vào lĩnh vực age, để trở về 2. Và các loại động của bar được sử dụng khi quyết định ghi đè test() để gọi, và đó là lý một loại Bar.

+0

Tôi hiểu rằng nó in 'age = 2'. Nhưng sau đó tôi vẫn không hiểu tại sao nó lại gọi 'Bar.test(); 'trong khi nó là kiểu op' Foo'. – moffeltje

+0

@moffeltje: thêm vào đó. Chức năng là đa hình. – Bathsheba

4

Vì bạn đã xác định hai trường độ tuổi khác nhau, một trường trong mỗi lớp. Các trường không bị ghi đè.

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