如何在Java中解决这个“非静态变量”问题?

时间:2012-07-31 04:46:01

标签: java interface

public class InterfaceTest {
    interface  InterfaceA {
         int  len =  1 ;
         void  output();
    }

    interface  InterfaceB {
           int  len =  2 ;
           void  output();
    }

    interface  InterfaceSub  extends  InterfaceA, InterfaceB {            }

    public class Xyz implements  InterfaceSub {

         public   void  output() {
            System.out.println( "output in class Xyz." );
        }

          public   void  outputLen(int  type) {
              switch (type) {
                      case  InterfaceA.len:
                             System.out.println( "len of InterfaceA=." +type);
                              break ;
                      case  InterfaceB.len:
                             System.out.println( "len of InterfaceB=." +type);
                              break ;
             }
        }
    }

    public   static   void  main(String[] args) {
           Xyz xyz = new Xyz();
           xyz.output();
           xyz.outputLen(1);
   }
}

您好, 我想学习Java的接口和多继承概念。 我发现上面的代码并尝试编译它,但发生以下错误。我不知道如何使代码工作,谁可以帮忙? 谢谢!

test$ javac InterfaceTest.java 
InterfaceTest.java:33: error: non-static variable this cannot be referenced from a static context
           Xyz xyz = new Xyz();
                     ^
1 error

3 个答案:

答案 0 :(得分:4)

这是因为非静态内部类无法在静态方法中实例化,因为它没有要使用的封闭类的实例。

如果将Xyz定义为静态内部类,它应该起作用:

public static class Xyz implements InterfaceSub {
  ....
}

或者,您可以在封闭类的实例中创建Xyz - 这里不需要这个,但是如果Xyz需要访问封闭类的某些成员变量,则需要这样做。

答案 1 :(得分:3)

替换

Xyz xyz = new Xyz();

 Xyz xyz = new InterfaceTest().new Xyz();

答案 2 :(得分:2)

您需要在InterfaceTest之外定义Xyz(或更改其可见性)。