2012-09-03 40 views
6

Trong một lớp, trường có cùng tên với trường trong lớp cha ẩn trường của siêu lớp.Ẩn trường trong Thừa kế Java

public class Test { 

    public static void main(String[] args) { 

     Father father = new Son(); 
     System.out.println(father.i); //why 1? 
     System.out.println(father.getI()); //2 
     System.out.println(father.j); //why 10? 
     System.out.println(father.getJ()); //why 10? 

     System.out.println(); 

     Son son = new Son(); 
     System.out.println(son.i); //2 
     System.out.println(son.getI()); //2 
     System.out.println(son.j); //20 
     System.out.println(son.getJ()); //why 10? 
    } 
} 

class Son extends Father { 

    int i = 2; 
    int j = 20; 

    @Override 
    public int getI() { 
     return i; 
    } 
} 

class Father { 

    int i = 1; 
    int j = 10; 

    public int getI() { 
     return i; 
    } 

    public int getJ() { 
     return j; 
    } 
} 

Ai đó có thể giải thích kết quả cho tôi không?

+1

Dựa trên sự hiểu biết của bạn về ẩn và kế thừa có nghĩa là gì; tại sao bạn nghĩ rằng các giá trị là cách họ đang có? Bạn sẽ có thể làm việc này cho chính mình. –

+0

Đây có phải là bài tập về nhà không? –

+0

Một đứa con trai không phải là một loại cha – jsj

Trả lời

8

Trong java, các trường không đa hình.

Father father = new Son(); 
System.out.println(father.i); //why 1? Ans : reference is of type father, so 1 (fields are not polymorphic) 
System.out.println(father.getI()); //2 : overridden method called 
System.out.println(father.j); //why 10? Ans : reference is of type father, so 2 
System.out.println(father.getJ()); //why 10? there is not overridden getJ() method in Son class, so father.getJ() is called 

System.out.println(); 

// same explaination as above for following 
Son son = new Son(); 
System.out.println(son.i); //2 
System.out.println(son.getI()); //2 
System.out.println(son.j); //20 
System.out.println(son.getJ()); //why 10? 
+0

Chỉ trong java? bất kỳ ngôn ngữ nào khác cung cấp đa hình trên các lĩnh vực? – UnKnown

2

Theo Overriding and Hiding Methods

Phiên bản của phương pháp ẩn mà được gọi phụ thuộc vào việc nó được gọi từ lớp cha hoặc subclass.

tức là khi bạn gọi phương thức được ghi đè trong lớp con thông qua tham chiếu siêu lớp, phương thức siêu lớp được gọi và truy cập thành viên siêu lớp.

này giải thích sau đây là tài liệu tham khảo sử dụng là của lớp cha:

System.out.println(father.i); //why 1? 
System.out.println(father.j); //why 10? 
System.out.println(father.getJ()); //why 10? 

Tương tự sau:

System.out.println(son.getJ()); //why 10? 

từ getJ() không được định nghĩa trong Son một phiên bản Father được gọi mà thấy thành viên được xác định trong lớp Father.

Nếu bạn đọc Hiding Fields; họ đặc biệt không đề xuất phương pháp mã hóa như vậy là

Nói chung, chúng tôi khuyên bạn không nên ẩn các trường vì mã khó đọc.

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