Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从另一个类调用一个方法,这个类有一个switch语句,可以调用同一个类中的两个方法?

我不知道如何表达这个问题而不让人感到困惑,但本质上是这样的:

TL;医生: 我一直在尝试从位于主类Shapes中的inputProcess()中的switch语句调用位于子类Circle中的circleChoice()。我不知道怎么做,但我在控制台上看到一个java.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语句,根据用户的输入,应该调用类Circle中的方法circleChoice(),或者类Triangle中的方法triangleChoice。让我们把重点放在Circle上,让它更容易一些

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

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

inputProcess()有一个switch语句,它应该根据s.choice的值调用obj1.circleChoice();obj2.triangleChoice();

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    你真的应该重构你的代码,超类不应该聚合子类。它们也不应该是超类的内部类。那么它应该会起作用