首页 > 解决方案 > 如何从另一个类调用一个方法,该类具有准备调用同一类中的两个方法的 switch 语句?

问题描述

我不知道如何表达这个问题而不会让它听起来令人困惑,但它本质上是这样的:

TL; DR: 我一直在尝试从位于主类中的 switch 语句调用circleChoice()位于子类中。我不知道怎么做,但我在控制台上得到了一个。我可能搞砸了逻辑。如果不是需要使用子类的学校项目,我可以轻松解决此问题。CircleinputProcess()Shapesjava.lang.StackOverflowError

    package shapes;
import java.lang.Math.*;
import java.util.Scanner;

public class Shapes {
    //CONSTRUCTORS

        //choosing
static Scanner sc = new Scanner(System.in);
        //inputs
protected String radDiameter;   
protected int choice;
protected double a;
protected double b;   //b1
protected double d;   //b2
protected double c;
protected double h;
protected double radius;
        //outputs
protected double perimeter;
protected double area;
    //CONSTUCTORS   
    
public class Circle extends Shapes{  //error

    public void circleChoice() {
        System.out.println("Pick your poison: ");
        System.out.println("[P] Perimeter");
        System.out.println("[A] Area");
        radDiameter = sc.next();
        this.radDiameter.toUpperCase();
        switch (radDiameter) {
        case "P":
            System.out.println("Enter Radius for Perimeter: ");
            CirclePerimeter();
            break;
        case "A":
            System.out.println("Enter Radius for Area: ");
            CircleArea();
            break;
        }       
    }
    
    public double CirclePerimeter() {
        super.radius = sc.nextDouble();
        this.perimeter = 2 * Math.PI * super.radius;
        System.out.println(perimeter);
        return perimeter;
    }
    
    public double CircleArea() {
        super.radius = sc.nextInt();
        this.area = Math.PI * (super.radius*super.radius);
        System.out.println(this.area);
        return area;
    }
    
}   
public class Triangle extends Shapes{
    public void triangleChoice() {
        switch (choice) {
        case 1:
            System.out.println("Enter Radius for Perimeter: ");
            TrianglePerimeter();
            break;
        case 2:
            System.out.println("Enter Radius for Area: ");
            TriangleArea();
            break;
        }
        
    }

    public double TrianglePerimeter() {
        a = sc.nextInt();
        b = sc.nextInt();
        c = sc.nextInt();
        
        perimeter = a*b*c;
        System.out.println(this.perimeter);
        return perimeter;
    }
    public double TriangleArea() {
        b = sc.nextInt();
        h = sc.nextInt();
        area = 12 * (b*h);
        System.out.println(this.area);
        return area;
    }
}


private Circle obj1 = new Circle();       //error
private Triangle obj2 = new Triangle();


    public void inputProcess() {

         Shapes s = new Shapes();
         
            System.out.println("Geometric Shapes");
            System.out.println("Choose Shape to continue:");
            System.out.println("[1] Circle");
            System.out.println("[2] Triangle");
            System.out.println("[0] Exit");
            System.out.println("Enter your choice: ");
            s.choice = sc.nextInt();
            
        switch (s.choice) {
            case 1 :
            obj1.circleChoice();
                break;
                
            
            case 2 :
            obj2.triangleChoice();  
                break;
                
            case 0:
                System.exit(s.choice);
                break;
            default :
                System.out.println("Invalid output! Please run again!");
                
                break;
            }

    }


    
    public static void main(String[] args) {    
        
        Shapes p = new Shapes();
        p.inputProcess();
    }

}

程序应该如何工作: 我有一个包含方法的类,该方法inputProcess有一个 switch 语句,该语句应该调用 class 中的方法circleChoice()或 classCircletriangleChoice的方法,Triangle具体取决于用户的输入。让我们专注于Circle使它更容易一些。

circleChoice()有一个 Scanner 输入 fromradDiameter和一个 switch 语句,它将调用circlePerimeter()or circleArea()。前两种方法的公式可以解决每个方法中另一个扫描仪输入 ( radius) 给出的圆的周长或面积,效果很好。

之后,我在private Circle obj1 = new Circle();每个子类之外创建了对象,但仍在主类Shapes中,以便从Circlein调用方法inputProcess()

inputProcess()有一个 switch 语句应该调用obj1.circleChoice();或者obj2.triangleChoice();取决于s.choice.

问题: 当我尝试运行它时,它只显示一个java.lang.StackOverflowError突出显示第 24 和 93 行的控制台。这显然是一个逻辑错误,因为 Eclipse 没有显示任何警告突出显示。

通常,我可以在不使用任何额外课程的情况下完成这项任务,但这是一个需要我使用它们的学校项目。

标签: javamethodsswitch-statementstack-overflowsubclass

解决方案


答案很简单。因为 Circle 是 Shape 的子类,所以当您实例化 Shape,然后将 Circle 作为它的属性进行实例化时,Circle 将 Circle 实例化为其属性(因为 Circle 是 Shape),然后 Circle 将 Circle 实例化为其属性等等......所以你有无限递归。

你真的应该重构你的代码,超类不应该聚合子类。而且它们也不应该是它们超类的内部类。然后它应该工作。


推荐阅读