2014-11-23 199 views
3

我讀過一本教科書,標記爲私人的班級成員不會繼承。 所以,我認爲如果Aprivate變量xB類延長A類,那麼類B將不會有變量x。 但是一個下面的例子證明了我的誤解,認爲:私人會員和繼承

public class testdrive 
{ 
    public static void main(String[] args) { 
     B b = new B(); 
     b.setLength(32); 
     System.out.print(b.getLength()); 
    } 
} 

class A { 
    private int length; 
    public void setLength(int len) { 
     length = len; 
    } 
    public int getLength() { 
     return length; 
    } 
} 

class B extends A { 
    public void dummy() { 
    } 
} 

結果是32,我很困惑,因爲它看起來像物體與裁判b現在有變量length,它的值是32,但是裁判b指從類B創建的對象,其中length變量未定義。 那麼,怎麼樣,類B繼承private變量length?如果是這樣,那麼private變量是不會被繼承的呢?

+0

不要在標題中加入「Java」,你已經用'java'標記了你的問題。 – Pshemo 2014-11-23 17:45:47

回答

3

該字段爲private隱藏於B。但是,您的public方法是繼承的並且可以訪問,並且它們可以訪問專用字段。

2

嗨,哥們這不是你是怎麼想的是,私有字段只能存在於同一個類中的方法(ofcourse鑑於方法是從其他類訪問)

它不是,你可以直接進行訪問撥打:

b.length=8; 

或者你甚至不能做到這一點:(寫這篇文章,你創造了B中的對象),這兩種方法都是invali

A a = new A(); 
a.length=8; 

d!

欲瞭解更多信息:

你甚至都不需要從延長B,只是在主創建一個的對象,並使用這些獲取和設置你的方法和它的工作呢!

-1

您不能直接訪問超類的私有字段和方法,但可以通過使用其他公共方法訪問它們。

這是面向對象編程的基本概念之一,它被命名爲封裝。 閱讀更多關於這裏:TutorialsPoint

底線:您不能直接訪問私有字段或方法這樣

b.length = 32; 

也不是像這樣(爲超)

A a = new A(); 
a.length = 32; 

但你可以通過使用公共方法來操作這些字段,就像你的例子。

原因很簡單:你的私人字段/方法隱藏其他類除了持有他們類的,但你的公共場/不隱藏方法。

+1

這個問題不是關於getters/setters如何工作,而是如果'private'字段沒有被繼承,爲什麼'length'字段被繼承*或者*可以在類B中訪問。 – 2014-11-23 17:53:20

+0

我編輯了這篇文章並糾正了我的錯誤。謝謝回覆!:) – SCBbestof 2014-11-23 18:01:46