【问题标题】:How to call on methods held inside an array? [closed]如何调用数组中的方法? [关闭]
【发布时间】:2021-04-25 21:37:51
【问题描述】:
public class Main {
    public static void main(String[] args) {
        shape[] myShapes = new shape[3];
        myShapes[0] = new cube(3);
        myShapes[1] = new Sphere(2);
        myShapes[2] = new Cylinder(3, 4);
        
        for (shape: myShapes)
            System.out.println()
    }
}

class cube extends shape {

    public double side;
    public double newSide;
    public double volume;
    public double surface;

    public cube(double side) {
        this.side = side;
    }

    public void cubeVolume(){
        volume = Math.pow(side,3);
        System.out.println (volume);
    }

    public void cubeSurface(){
        surface = Math.pow(side,2) * 6;
        System.out.println (surface);
    }


}

abstract class shape{
    protected double volume;
    protected double surface;

}

public class Sphere extends shape {

    public double radius;
    public double volume;
    public double area;
    public double i = 4;
    public double j = 3;

    public Sphere(double radius) {
        this.radius = radius;
    }

    public void sphereVolume(){
        volume = i/j * Math.PI * Math.pow(radius,3);
        System.out.println(volume);
    }

    public void surfaceArea(){
        area = 4 * Math.PI * Math.pow(radius,2);
        System.out.println(area);

    }

}

public class Cylinder extends shape{

    public double radius;
    public double height;
    public double cylinderVolume;
    public double cylinderArea;

    public Cylinder(double radius, double height) {
        this.radius = radius;
        this.height = height;
    }

    public void surface(){
        cylinderArea = 2 * Math.PI * radius * height;
        System.out.println(cylinderArea);
    }

    public void volume(){
        cylinderVolume = Math.PI * Math.pow(radius, 2) * height;
        System.out.println(cylinderVolume);
    }

}

我不认为标题很好地包含了我的问题。我正在实例化一个新对象并将该对象存储在数组 myShapes 中。每个对象的类都有一个计算表面积和体积的方法。我需要调用所有这些方法,我相信这可以通过 for 循环来完成,但我不确定如何。我完全被难住了。

【问题讨论】:

  • 这将有助于我们查看您的类层次结构。什么是 Cube、Sphere、Cylinder 和 Shape 对象?如果在 Shape 对象中声明了表面积和体积方法,那么它应该可以工作。
  • 您的基类shape 是否声明了您要调用的那些方法?
  • 对不起,我刚刚添加了其他类。形状类是抽象的,声明了变量volume和area。
  • 如果你关注Java Naming Conventions,它将极大地提高可读性,尤其是类应该是SentenceCase和变量/参数camelCase

标签: java arrays methods instantiation


【解决方案1】:

向你的超类添加抽象方法:

abstract class Shape {
    // Note: No fields
    public abstract double surfaceArea();
    public abstract double volume();
}

在您的子类中实现它们,例如Cylinder

public class Cylinder extends Shape {
    // radius and height fields and constructor not shown

    public double surfaceArea() {
        return 2 * Math.PI * radius * height;
    }

    public double volume() {
        return Math.PI * Math.pow(radius, 2) * height;
    }
}

然后在循环中打印它们:

for (shape : myShapes) {
    System.out.println("Surface area = " + shape.surfaceArea + ", volume = " + shape.volume());
}

请注意,您不想在方法内部打印 - 这是一个渲染问题,如果合适,应该由调用者完成。例如,如果您只是进行形状的计算和比较,您不会想要大量的输出。

另外,如果你关注Java Naming Conventions,它会极大地提高可读性,尤其是类应该是SentenceCase 和变量/参数camelCase,所以调用你的类Shape 而不是shapeCube 而不是@ 987654331@等

如果您没有公共字段,则首选 interface 而不是 abstract class 作为超类型。

【讨论】:

  • 好的,现在我得到这个错误:立方体不是抽象的,并且不会覆盖形状类立方体扩展形状中的抽象方法表面()。这就是为什么我一开始就没有包含抽象方法的原因。我不明白为什么它对不抽象的立方体类大惊小怪。我认为抽象方法的重点是通过非抽象的子方法覆盖它们。
  • @Noobprogrammer 是的,然后你的具体类需要提供基类中声明为抽象的方法的实现。
  • @Noobprogrammer 确保子类中的方法名称与超类中的方法名称完全匹配
【解决方案2】:

如果您将对象存储在 shape[] 数组中,那么您需要确保定义 volume() & surfaceArea() 作为shape class 中的抽象方法,这样您的每个形状(圆柱体、球体等)都将能够覆盖和实现。它们也需要命名相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多