所以我试图做一个简单的计算,但遇到了一些问题错误消息:此行有多个标记 - 无法访问应用程序类型的封闭实例。必须使用封闭实例限定分配 应用程序类型(例如 x.new A((,其中 x 是应用程序的实例(。 - 行断点:应用程序 [行: 64] - 主(字符串[](
我做错了什么?有人能看到错误并修复它吗?
public class Application {
interface MathOp {
public double doMath(double a, double b);
}
class Add implements MathOp{
public double doMath(double a, double b) {
return (a + b);
}
}
class Sub implements MathOp{
public double doMath(double a, double b) {
return (a - b);
}
}
class Div implements MathOp{
public double doMath(double a, double b){
return (a / b);
}
}
class Mul implements MathOp{
public double doMath(double a, double b){
return (a * b);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a,b,c;
int choice = 0;
a=b=c=0.0;
while(true) {
System.out.println("Enter two numbers");
a = Double.parseDouble(sc.nextLine());
b = Double.parseDouble(sc.nextLine());
System.out.println("Enter your choice");
System.out.println("1. Add");
System.out.println("2. Sub");
System.out.println("3. Mul");
System.out.println("4. Div");
choice = Integer.parseInt(sc.nextLine());
switch(choice) {
case 1 :
c = new Add().doMath(a,b);
break;
case 2 :
c = new Sub().doMath(a,b);
break;
case 3 :
c = new Div().doMath(a,b);
break;
case 4 :
c = new Mul().doMath(a,b);
break;
default:
break;
}
System.out.println(c + "this is the answere");
System.out.println("would you like to continue? (Y/N)");
if("N".equalsIgnoreCase(sc.nextLine())) { // careful with the paranthesis
break;
}
}
}
问题是你的Add
、Sub
等类是内部类,这意味着你必须有一个包含类的实例......而此时你还没有。
选项:
-
(最好!摆脱你的接口,而是创建一个
enum
(在顶层;而不是嵌套的(,每个操作都有一个成员。枚举将声明一个抽象方法,然后在每个成员中覆盖该方法:public enum MathOperation { ADDITION { @Override public double doMath(double a, double b) { return a + b; } }, SUBTRACTION { @Override public double doMath(double a, double b) { return a - b; } } // etc ; public abstract double doMath(double a, double b); }
- (好的(保留接口和实现类,但将它们移到
Application
类之外。 嵌套类型应该非常罕见,IMO。 - (不是很好(将
static
修饰符添加到每个实现类。它们仍然是嵌套的,但它们不需要隐式引用Application
实例。 - (呃!创建
Application
的实例,以便可以创建操作类的实例。别这样。我只是为了完整起见而包含它。
虽然嵌套类肯定是有用的,但如果你是Java的新手,我建议你暂时避免使用它们。它们有自己的规则和语法,一开始可能有点奇怪。坚持在顶层声明所有类型。