java - 如何从另一个类调用一个方法,该类具有准备调用同一类中的两个方法的 switch 语句?
问题描述
我不知道如何表达这个问题而不会让它听起来令人困惑,但它本质上是这样的:
TL; DR:
我一直在尝试从位于主类中的 switch 语句调用circleChoice()
位于子类中。我不知道怎么做,但我在控制台上得到了一个。我可能搞砸了逻辑。如果不是需要使用子类的学校项目,我可以轻松解决此问题。Circle
inputProcess()
Shapes
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 语句,该语句应该调用 class 中的方法circleChoice()
或 classCircle
中triangleChoice
的方法,Triangle
具体取决于用户的输入。让我们专注于Circle
使它更容易一些。
circleChoice()
有一个 Scanner 输入 fromradDiameter
和一个 switch 语句,它将调用circlePerimeter()
or circleArea()
。前两种方法的公式可以解决每个方法中另一个扫描仪输入 ( radius
) 给出的圆的周长或面积,效果很好。
之后,我在private Circle obj1 = new Circle();
每个子类之外创建了对象,但仍在主类Shapes
中,以便从Circle
in调用方法inputProcess()
。
inputProcess()
有一个 switch 语句应该调用obj1.circleChoice();
或者obj2.triangleChoice();
取决于s.choice
.
问题:
当我尝试运行它时,它只显示一个java.lang.StackOverflowError
突出显示第 24 和 93 行的控制台。这显然是一个逻辑错误,因为 Eclipse 没有显示任何警告突出显示。
通常,我可以在不使用任何额外课程的情况下完成这项任务,但这是一个需要我使用它们的学校项目。
解决方案
答案很简单。因为 Circle 是 Shape 的子类,所以当您实例化 Shape,然后将 Circle 作为它的属性进行实例化时,Circle 将 Circle 实例化为其属性(因为 Circle 是 Shape),然后 Circle 将 Circle 实例化为其属性等等......所以你有无限递归。
你真的应该重构你的代码,超类不应该聚合子类。而且它们也不应该是它们超类的内部类。然后它应该工作。
推荐阅读
- s4sdk - AuthTokenAccessException:无法解码 JWT 承载:请求的“授权”标头中不存在 JWT 承载
- azure - 在多个区域的 Azure 中部署的优化方式?
- mule - Cloud Hub 中的应用程序数据选项卡包含什么?
- vb.net - 多行文本框中的不同数字
- database - 如何在codeigniter的config.php文件中设置环境变量
- python - GAE:为什么 GAE 的表现比归一化回报和优势差
- c++ - 为什么 std::string::max_size 的值“奇怪”?
- python - 如何修复 Python 错误:AttributeError: type object X has no attribute Y
- android - 当 html 有特殊字符时,Android WebView 无法执行 Javascript ✓
- vuejs2 - vuetify组件的v-select文本如何居中对齐