2013-09-28 70 views
0

所以即时尝试做一个简单的计算,但有一些问题 错误消息:在该行多个标记 - 没有封闭的类型应用程序的实例是可访问的。必须使用类型为Application的封闭实例 来限定分配(例如,x.new A(),其中x是Application的一个实例)。 - 行断点:应用[行:64] - 主(字符串[])开关计算器错误错误消息java eclipse

我做错了什么?任何人都可以看到错误并修复它吗?

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

}

+0

为什么在所有这些类中都有'Application'类的内部类? –

+0

不知道为什么..即时通讯新的和即时通讯尝试学习如何创建差异类等 – user2825771

+0

好吧,如果你不确定,只需将这些类移到外面,然后你的代码就可以编译。 –

回答

2

的问题是,你的AddSub等类内部类,这意味着你必须有包含类的实例......你这个不点。

选项:

  • (最好的!)摆脱你的界面,而不是创建一个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的新手,我建议你现在就避免使用它们。他们有自己的规则和语法,从一开始可能有点奇怪。坚持要在顶层声明所有类型。

+2

我是期待第一个是(最好!)。 :) –

+1

@RohitJain:我鞠躬你的喜好:) –

+1

你让我的周末:) –