2011-06-17 47 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