2013-04-25 13 views
14

Hãy xem xét các loại sau đây:Liệu một đối tượng con mất tính độc đáo của nó sau khi đúc qua lại giữa một lớp cha mẹ

public class Phone { 
    private boolean has3g; 

    public boolean has3g() { 
     return has3g; 
    } 

    public void setHas3g(boolean newVal) { 
     has3g = newVal; 
    } 
} 

public class Blackberry extends Phone { 
    private boolean hasKeyboard; 

    public boolean hasKeyboard() { 
     return hasKeyboard; 
    } 

    public void setHasKeyboard(boolean newVal) { 
     hasKeyboard = newVal; 
    } 
} 

Nếu tôi là tạo ra một thể hiện của Blackberry, bỏ nó vào một đối tượng Phone và sau đó đưa nó trở lại Blackberry, đối tượng gốc Blackberry sẽ mất các biến thành viên của nó? Ví dụ:

Blackbery blackbery = new Blackberry(); 
blackbery.setHasKeyboard(true); 

Phone phone = (Phone)blackbery; 

Blackberry blackberry2 = (Blackberry)phone; 

// would blackberry2 still contain its original hasKeyboard value? 
boolean hasKeyBoard = blackberry2.hasKeyboard(); 
+0

Bạn đã thử chưa? Điều gì đã xảy ra khi bạn làm vậy? – Kal

+0

Tôi đã thử nó và nó hoạt động tốt –

Trả lời

22

Đúc không thay đổi đối tượng tiềm ẩn ở tất cả - nó chỉ là một thông điệp tới các trình biên dịch mà nó có thể đối xử với một A như một B.

Bạn cũng không cần phải bỏ một số A đến B nếu A extends B, tức là bạn không cần phải truyền loại phụ cho siêu kiểu; bạn chỉ cần cast nếu nó từ một supertype để một subtype

9

Nếu tôi là tạo ra một thể hiện của Blackberry, bỏ nó vào một đối tượng Điện thoại và sau đó đúc lại cho Blackberry, sẽ bản gốc Blackberry đối tượng mất các biến thành viên của nó?

Bạn đã khởi tạo Blackberry. Điều này sẽ vẫn là một Blackberry cho đến khi nó được GC.
Khi bạn truyền tới Phone bạn không thay đổi thực tế là loại là Blackberry. Bạn chỉ coi nó là một số Phone tức là bạn chỉ có quyền truy cập vào các thuộc tính chung của nó (số Phone).
Các thuộc tính mở rộng của Blackberry không còn hiển thị mặc dù thực tế là trường hợp cụ thể vẫn là Blackberry và bạn có thể truyền thành công trở lại để truy cập thuộc tính Blackberry.

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