【问题标题】:calling private variable with abstract method overriding用抽象方法覆盖调用私有变量
【发布时间】:2016-01-23 04:37:53
【问题描述】:

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

赋值的目的是以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
    }    
}

【问题讨论】:

    标签: java inheritance constructor abstract super


    【解决方案1】:

    一种方法是为RegularPolygon 创建一个公共getSide() 方法以检索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();
        }  
    }
    

    【讨论】:

      【解决方案2】:

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

      对此的最佳实践答案是为 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-18
        • 2022-01-07
        • 1970-01-01
        • 2013-09-12
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多