2015-07-10 61 views
-2
package accesslevelmodifiers; 

public class AccessLevelModifiers { 

    public static void main(String[] args) { 

    Parent parent =new Parent(); 
    Subclass subclass = new Subclass(); 
    parent.go(); 
    subclass.go(); 

    System.out.println("==========="); 

    subclass.setNumberPu(3); 
    parent.go(); 
    subclass.go(); 
    } 
} 


public class Parent { 

    public int NumberPu=100; 

    public void go(){ 
     System.out.println(NumberPu); 
    } 
} 

class Subclass extends Parent{ 

    public void setNumberPu(int NumberPu) { 
     super.NumberPu = NumberPu; 
    } 


} 

它成功地建立並運行;但結果是爲什麼我不能用這個程序重新分配父變量?

100 
100 
=========== 
100 
3 

我很困惑的兩件事情。 1.爲什麼我可以在子類中使用super.NumberPu?我的意思是如果我寫

class Subclass extends Parent{ 
     super.NumberPu = 3; 
} 

IDE會說找不到符號。

  1. 我使用超級,所以我認爲NumberPu在父級的值將被分配爲3,但相反,它是分配的子類中的一個。誰能告訴我發生了什麼事?超級怎麼樣。成了這個。 ? 非常感謝!
+1

你認爲你在這裏有多少物體? –

+0

我有兩個實例父和子類在這裏,我有父對象NumberPu(int類型)和子類中NumberPu(int類型)兩個對象。我對麼? – Oscar

+0

你不是。這個'new Parent()'創建一個類型爲'Parent'的對象。這個「新的Subclass()」創建一個類型爲「Subclass」的對象。這兩個對象都可以訪問自己的'NumberPu'字段。 –

回答

0

你有兩個不同的對象這裏,所以當你改變其中之一的數量,另外一個不會改變,因爲他們是無關

Parent parent =new Parent(); 
Subclass subclass = new Subclass(); 

看看您在這裏如何使用newnew運算符通過爲新對象分配內存並返回對該內存的引用來實例化一個類。所以你有兩個不同的記憶,完全不相關。

+0

謝謝你的回答!我明白你的意思了! – Oscar

+0

@Oscar沒問題!請記住,如果我的答案回答了您的問題,請[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)作爲解答的答案,所以其他人你的問題知道答案:)。 –

0
  1. 您可以在類級別放置聲明(例如爲您的子類添加新變量),但不能聲明。在這裏你沒有聲明一個新的變量,你爲現有的變量賦值,所以它應該在構造函數中完成,沒關係。
  2. 你混淆了類和實例。您的父類和您的子類對象是兩個不同的實例,修改一個不會影響另一個實例,它們是具有不同成員字段實例的兩個不同對象。 super是一種在不明確的情況下引用超類中的字段的方法,this是引用當前實例,因此它們處於兩個不同的級別。
+0

謝謝你的回答!我明白應該在構造函數中完成賦值給現有值的意義。但是我仍然不明白super.NumberPu指的是什麼?我應該把它改成this.NumberPu來得到上面的結果。 – Oscar

+0

在你的情況下,super.NumberPu和this.NumberPu引用同樣的事物:在當前實例中,在SubClass的超類中定義的NumberPu字段。 –

+0

所以我可以說在對象的子類中,只有一個名爲NumberPu的字段。 NumberPu由兩個類共享:Parent,聲明它的那個。和子類,誰從父母繼承它?因此,當我重新分配NumberPu的價值時,我是否使用它並不重要。或超級。因爲他們都指的是唯一的一個? – Oscar

相關問題