java和c++中的实例变量

Instance variable in java and c++

本文关键字:实例 变量 c++ java      更新时间:2023-10-16
正如我所理解的,在java中,所有的变量都是引用。

关于下一个代码:

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

我认为这里没有Slicing,因为我们谈论的是推荐人。因此,我不明白为什么要打印"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

您隐藏的是成员,而不是覆盖。对于Java示例,不能重写字段。你需要使用一个函数。对于C++示例,Parent中的函数必须是虚拟的,才能被Child覆盖。否则,您只需隐藏该函数。

C++:

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

在Java中,不能覆盖字段,只能隐藏它。Child有两个字段Parent.xChild.x。引用类型决定了.x 所指的字段

对于java端,您正在声明两个独立的变量

这意味着对于Child c,存在c.x((Parent)c).x,它们是不同的变量,具有各自的值

这是因为您使用的是p.x,而不是c.x。字段x不会被Child覆盖(例如,方法getX(((。相反,它位于子对象中,对应于子类。因此,实际上有2个:Parent.x和Child.x。

在Java中,只能隐藏字段而不能覆盖它。For Java

p=c

现在p有了c的引用,因此您可以得到答案=12