0

所以我试图做一个简单的计算但有一些问题错误消息:这一行有多个标记 - 没有应用程序类型的封闭实例是可访问的。必须使用 Application 类型的封闭实例来限定分配(例如 xnew A(),其中 x 是 Application 的实例)。- 行断点:Application [line: 64] - main(String[])

我究竟做错了什么?有人能看到问题并修复它吗?

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;
              }
            }

}

4

1 回答 1

2

问题是你的Add, Subetc 类是内部类,这意味着你必须有一个包含类的实例......你现在没有。

选项:

  • (最好!)摆脱你的界面,而不是创建一个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.
  • (Urrgh!)创建一个实例,Application以便您可以创建操作类的实例。不要这样做。我只是为了完整性而将其包括在内。

虽然嵌套类肯定很有用,但如果您是 Java 的新手,我建议您暂时避免使用它们。它们有自己的规则和语法,一开始可能有点奇怪。坚持在顶层声明所有类型。

于 2013-09-28T07:12:09.220 回答