Java中创建并填充Shape类型数组及子类方法调用问题
解决Shape数组调用子类方法的问题
先确认基础类结构
确保Shape和Sphere的类定义符合继承规范,示例如下:
Shape类(父类)
public abstract class Shape { // 抽象方法,子类必须实现 public abstract double getArea(); // 普通成员方法 public void printBasicInfo() { System.out.println("这是一个几何图形"); } }
Sphere类(子类)
public class Sphere extends Shape { private double radius; public Sphere(double radius) { this.radius = radius; } // 重写父类的抽象方法 @Override public double getArea() { return 4 * Math.PI * radius * radius; } // Sphere类特有的方法 public double getVolume() { return (4.0/3) * Math.PI * Math.pow(radius, 3); } }
调用方法的两种场景
1. 调用父类Shape中定义的方法(含子类重写的)
当你把Sphere实例存入Shape类型数组时,编译器会将数组元素视为Shape类型,但多态机制会自动调用子类的重写实现,直接调用即可:
public class ShapeManager { public static void main(String[] args) { Shape[] shapes = new Shape[1]; shapes[0] = new Sphere(5.0); // 调用父类的普通方法 shapes[0].printBasicInfo(); // 调用子类重写的getArea方法 System.out.println("球体表面积:" + shapes[0].getArea()); } }
2. 调用Sphere类的特有方法
由于数组声明为Shape类型,直接调用子类特有方法会编译报错,需要先判断类型再向下转型:
public class ShapeManager { public static void main(String[] args) { Shape[] shapes = new Shape[1]; shapes[0] = new Sphere(5.0); // 先判断元素是否为Sphere类型,避免转型异常 if (shapes[0] instanceof Sphere) { Sphere sphere = (Sphere) shapes[0]; // 调用Sphere特有方法 System.out.println("球体体积:" + sphere.getVolume()); } } }
排查常见问题
- 确保
Shape类的方法是public访问权限,否则其他类无法调用 - 确认
Sphere类通过extends Shape正确继承父类 - 如果
Shape是接口,需保证Sphere实现了接口的所有抽象方法
内容的提问来源于stack exchange,提问作者Alexandros Fourtounis
相关产品推荐
相关产品推荐

