派生类具有基类私有成员

时间:2018-03-20 22:58:13

标签: java oop inheritance private

我有这个问题,我一直在考虑它。我想弄清楚这实际上是如何工作的,为什么?

所以,我有这个基类:

public class Shape 
{
  private float width;
  private float height;

  public Shape(float width, float height) {
    this.width = width;
    this.height = height;
  }

  public void setWidth(float x){
    this.width = x;
  }

  public float getWidth() {
    return width;
  }

  public float getHeight() {
    return height;
  }
}

和这个派生类:

public class Rectangle extends Shape 
{
  public Rectangle(float width, float height) {
    super(width, height);
  }

  public float area (){
    float x = getHeight();
    float y = getWidth();
    return x*y;
  }
}

为什么派生类使用widthheight
我的意思是,我可以实例化像:

这样的对象
Shape s = new Shape(1,1);
Rectangle rect = new Rectangle(3,5);

Rectangle包含变量widthheight。我正在使用基类构造函数,但是当它通过super(width, height)时,它会转到this.width = width,而height则相同。

什么是this.width? 它只是基类的一种副本或它是如何工作的?

2 个答案:

答案 0 :(得分:1)

理解这里的关键是要注意在基类构造函数中我们有两个'width'和'height'变量的变体:一个是类对象中的成员,另一个是传递的参数到构造函数,每个使用与其他

相同的名称

this.height = height;获取构造函数参数的值,并将其分配给类成员。这有点奇怪,但是在构造过程中可以很容易地直观地检查构造函数参数是否分配给了正确的类成员。

答案 1 :(得分:0)

private float width;
private float height;

public Shape(float width, float height) {
this.width = width;
this.height = height;
}

在上面的代码中,全局变量是width,height。类似地,局部变量也是Shape Constructor中存在的width,height。因此,我们使用此关键字来区分局部变量和全局变量,因为它们都具有相同的名称。