2011-06-17 101 views
1

據我瞭解,在Java中,所有的變量是引用。在java和c + +中的實例變量

在接下來的代碼:

class Parent { 
    public int x = 12; 
} 
class Child extend Parent { 
public int x = 42; 
} 
Parent p = new Parent(); 
System.out.println(p.x); 
12 
Child c = new Child(); 
System.out.println(c.x); 
42 
p = c; // be careful here! 
System.out.println(p.x); 
12 

我認爲沒有切片在這裏,因爲我們談論refernces。出於這個原因,我不明白爲什麼要打印"12"p是現在指向的c面積,c.x是42

同樣是在接下來的代碼發生在C++:

class Parent { 
    public: 
    void example() { cout << "Parent" << endl; } 
}; 
class Child : public Parent { 
    public: 
    void example() { cout << "Child" << endl; } 
}; 

Parent * p = new Parent(); 
p->example() 
Parent 

Child * c = new Child(); 
c->example() 
Child 

p = c; // be careful here! 
p->example() 
Parent 

回答

7

你是隱藏的成員,不重寫。對於Java示例,您不能覆蓋字段。你需要使用一個功能。對於C++示例,Parent中的函數必須是虛擬的,可被Child覆蓋。否則,你只需隱藏該功能。

C++:

class Parent { 
    public: 
    virtual void example() { cout << "Parent" << endl; } 
}; 
class Child : public Parent { 
    public: 
    void example() { cout << "Child" << endl; } 
}; 
+0

+1:但你是什麼性質呢? – 2011-06-17 13:37:50

4

在Java中,你不能忽略一個字段,你只能將其隱藏。孩子有兩個字段Parent.xChild.x。參考類型決定了爲要聲明2個獨立的變量

意味着對於一個Child cc.x((Parent)c).x符合其自己的值不同的變量的Java端裝置通過.x

1

哪個字段

0

那是因爲你使用px而不是cx字段x不被Child重寫(例如getX()方法)。相反,它在子對象中,對應於一個Child類。所以,你實際上有2個:Parent.x和Child.x。

0

在Java中,您只能隱藏該字段而不能覆蓋它。 For Java

p=c

現在p具有C的參考這樣你可以獲得回答= 12