使用抽象方法覆盖调用私有变量

时间:2016-01-23 04:37:54

标签: java inheritance constructor abstract super

我有一个赋值,我需要创建一个包含构造函数的抽象类和一个将被子类覆盖的抽象方法。

赋值的对象是确定不同多边形的区域,同时将RegularPolygon类作为基类。

当我通过子类扩展调用该方法时,它打印出零。我知道问题是变量的范围。基本上我知道我的变量端不是从超类中读取的,因为它是私有的。我不知道如何解决这个问题,而无需将其从私人更改为公共或受保护。它需要保持私密。

找到RegularPolygon

public abstract class RegularPolygon
{
    private double side;

    public RegularPolygon(double length)
    {
        side = length;
    }

    public abstract double getArea();
}

方形

public class Square extends RegularPolygon
{
    private double side;

    public Square(double length)
    {
        super(length);
    }

    public double getArea()
    {
        return side*side; //this returns 0
    }    
}

2 个答案:

答案 0 :(得分:1)

一种方法是为getSide()创建一个公共RegularPolygon方法,以检索side中的值。这样,您只能检索side中的值,但仍然无法更改。

以下是代码的含义:

// Main.java
public static void main(String[] args) {
    Square sq = new Square(3);
    System.out.println(sq.getArea()); // 9.0
}

这将是RegularPolygon类

public abstract class RegularPolygon
{
    private double side;

    public RegularPolygon(double length)
    {
        side = length;
    }

    public abstract double getArea();

    // Add this...
    public double getSide() {
        return side;
    }
}

而且...... Square类

public class Square extends RegularPolygon{
    public Square(double length)
    {
        super(length);
    }
    public double getArea()
    {
        // use 'this.getSide()' to retrieve the value in 'side'
        return this.getSide()*this.getSide();
    }  
}

答案 1 :(得分:0)

您无法在该类的扩展中访问给定类中的private个字段。因此,您在side中访问的getArea()side中的Square,它永远不会被初始化。

最佳实践答案是为side创建一个公共getter,以便子类可以访问它(尽管不编辑它)。

public abstract class RegularPolygon {
    private double side;

    public RegularPolygon(double length) {
        side = length;
    }

    public double getSideLength() {
        return side;
    }

    public abstract double getArea();
}



public class Square extends RegularPolygon {
    public Square(double length) {
        super(length);
    }

    public double getArea() {
        return getSideLength()*getSideLength();
    }    
}

如果您特别希望子类能够直接访问side字段,请将其设为protected而不是private