Java 如何调用数组中的方法?

Java 如何调用数组中的方法?,java,arrays,methods,instantiation,Java,Arrays,Methods,Instantiation,我认为这个题目不能很好地涵盖我的问题。我正在实例化一个新对象,并将该对象存储在数组myShapes中。每个对象的类都有一个计算表面积和体积的方法。我需要调用所有这些方法,我相信这可以通过for循环实现,但我不确定如何实现。我完全被难住了。如果您将对象存储在形状[]数组中,那么您需要确保定义 volume()&surfaceearea()作为shape类中的抽象方法,这样,每个形状(圆柱体、球体等)都将能够重写和实现。它们也需要命名相同。向超类添加抽象方法: public class Main {

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

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

向超类添加抽象方法:

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);
    }

}
在您的子类中实现它们,例如对于
圆柱体

abstract class Shape {
    // Note: No fields
    public abstract double surfaceArea();
    public abstract double volume();
}
然后在循环中打印它们:

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;
    }
}
请注意,您不希望在方法内部打印-这是一个呈现问题,如果合适,应该由调用方完成。例如,如果只是对形状进行计算和比较,则不需要大量输出

此外,如果您遵循,它对可读性也有很大帮助,尤其是类应该是
SentenceCase
和变量/参数
camelCase
,因此请调用类
Shape
,而不是
Shape
Cube
,等等


如果您没有公共字段,则对于超类型,首选
接口
而不是
抽象类

它将帮助我们查看您的类层次结构。什么是立方体、球体、圆柱体和形状对象?如果在Shape对象中声明了surface area和volume方法,那么它应该可以工作。您的基类
Shape
是否声明了您要调用的那些方法?抱歉,我刚刚添加了其他类。shape类是抽象的,它声明了变量体积和面积。如果您遵循,它将极大地提高可读性,尤其是类应该是
SentenceCase
和变量/参数
camelCase
。好的,现在我得到了这个错误:cube不是抽象的,并且不会覆盖shape类cube扩展shape中的抽象方法surface()。这就是为什么我一开始没有包括抽象方法。我不明白为什么它会对多维数据集类不是抽象的问题大惊小怪。我认为抽象方法的关键在于通过非抽象的子方法重写它们。@Noobprogrammer是的,然后,您的具体类需要提供基类中声明为抽象的方法的实现。@Noobprogrammer确保子类中的方法名称与超类中的方法名称完全匹配
for (shape : myShapes) {
    System.out.println("Surface area = " + shape.surfaceArea + ", volume = " + shape.volume());
}