我如何从另一个班级的一个班级实现方法

时间:2019-07-26 20:19:01

标签: java

我有一个类Shape2D,在那个类中,我有计算圆面积circleArea的方法,也有类CircleArea,我在其中存储了我的方法所需的所有属性。另外,我的课程CircleArea扩展了课程Shape2D。因此,如何实现从类Shape2D到类CircleArea的方法。

这是我的Shape2D班:

public class Shape2D {
    public static void areaCircle(Circle c) {
        double circleArea = Math.pow(c.getR(), 2) * Math.PI;
    }
}

这是我的Circle课:

public class Circle extends Shape2D {

    private double r;

    public Circle() {
    }

    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

}

2 个答案:

答案 0 :(得分:0)

要实现Shape2D类中Circle类中的一种方法,可以执行以下操作:

Shape2D.areaCircle(circleObject);

以上行可以在Circle类中调用。不要忘记将实际的circle对象传递给函数。

答案 1 :(得分:0)

您在2D形状内有一个静态方法,这意味着您可以在任何类中使用它,而无需实例化2DShape。这也意味着您不需要circle类来扩展2DShape来使用此方法,但是我想您正在为OO范例寻求父子关系。如果您不希望从任何类中调用该方法,请从该方法中删除static。如果您希望在Circle类构造函数中静态调用它,请首先将r实例化为某种东西,然后将其传递给静态方法调用。

public class Circle extends Shape2D {

    private double r;

    public Circle() {
         r=1;
         Shape2D.areaCircle(this);
    }

    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

}

请注意,您的静态函数实际上不会返回任何内容,因此它会计算面积并丢失值。您可以通过更改{{1}的返回类型来在shape2D内部修复此问题。 }代替void翻倍,并适当地返回结果。

circleArea

或非静态地,并受到公众的保护(两者均可行)

public static double areaCircle(Circle c) {
        double circleArea = Math.pow(c.getR(), 2) * Math.PI;
        return circleArea;
    }

如果您想做同样的事情,但是从方法中删除了静态标志,则可以使用protected double areaCircle(Circle c) { double circleArea = Math.pow(c.getR(), 2) * Math.PI; return cricleArea; } 来调用父方法。

super

现在,如果您想将区域实际存储在这个circleObject内,则可以为Circle类创建另一个属性,并像这样修改构造函数。也许甚至添加一个接受一个半径为int参数的构造函数(或者在将来的某个区域中,可以通过某种方式区分两个可以获取半径值的区域)。

public class Circle extends Shape2D {

    private double r;

    public Circle() {
         r=1;
         super.areaCircle(this);
    }

    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

}

还值得一提的是,您应该查看所创建的这些方法的范围以及要使用它们完成的工作。例如,您可以将public class Circle extends Shape2D { private double r; private double area; //Default Constructor public Circle() { r=1; this.area = super.areaCircle(this); } //Radius constructor public Circle(double rad) { this.r = rad; this.area = super.areaCircle(this); } public double getR() { return r; } public void setR(double r) { this.r = r; } } 方法定义为public,此时可以将其定义为protected并在这种情况下具有相似的功能。受保护意味着该方法可以在类以及所有子类(父类的子代,例如circle)中使用。您可以阅读有关这些闭包here的信息。另外,在处理对象继承时,您应该养成使用circleArea关键字来引用您实际希望检索的方法/属性的习惯。 Info on this keyword

我知道这很重要,但是如果您有任何疑问,请随时发表评论!