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 楼答案
答案很简单。因为Circle是Shape的子类,当你实例化Shape,然后将Circle作为它的属性,然后Circle将Circle实例化为它的属性(因为Circle是Shape),然后Circle将Circle实例化为它的属性等等。。。所以你有无限递归
你真的应该重构你的代码,超类不应该聚合子类。它们也不应该是超类的内部类。那么它应该会起作用