【问题标题】:Why can't I instantiate an instance of an extended class in Java?为什么我不能在 Java 中实例化扩展类的实例?
【发布时间】:2012-10-08 11:04:26
【问题描述】:

我只是想从 LinkedList 扩展一个类。这是我的代码:

  import java.util.*;

  class Test {

    public static void main( String [] args ) {

        OrderedLinkedList ol = new OrderedLinkedList();
    }

    public class OrderedLinkedList extends LinkedList<Integer> {

        public boolean add( Integer item ) {
            for (int i=0; i < size(); i++) {
                Integer itemOfList = get( i );
                if ( itemOfList.compareTo( item ) > 0 ) {
                    add( i, item );
                    break;
                }
            }
            return true;
        }
    }

}

但是,我收到此消息的编译错误:

Test.java:7: non-static variable this cannot be referenced from a static context
        OrderedLinkedList ol = new OrderedLinkedList();
                               ^
1 error

我相信我除了实例化之外没有引用任何东西。

【问题讨论】:

    标签: java oop inheritance static extends


    【解决方案1】:

    除非标记为静态,否则内部类具有对其外部类的隐式引用。

    您需要将内部类标记为静态以避免这种情况:

    public static class OrderedLinkedList extends LinkedList<Integer> {
    

    因此编译器抱怨内部类没有 Test 实例,因为 main 是一个静态方法。

    【讨论】:

      【解决方案2】:

      将这两个类保存在单独的文件中。但是,如果内部类是您的目标,那么

      如下访问它

      new Test().new OrderedLinkedList(); 
      

      【讨论】:

      • 我不知道这种语法。参考?
      【解决方案3】:

      1) 关闭测试类 2)如果您在同一个文件中有两个类, 主类应该是文件名,只有主类应该是 公开。

      public class Test {
      
          public static void main( String [] args ) {
      
              OrderedLinkedList ol = new OrderedLinkedList();
          }
      }
      

      然后

      class OrderedLinkedList extends LinkedList<Integer> {
      
                  public boolean add( Integer item ) {
                      for (int i=0; i < size(); i++) {
                          Integer itemOfList = get( i );
                          if ( itemOfList.compareTo( item ) > 0 ) {
                              add( i, item );
                              break;
                          }
                      }
                      return true;
                  }
              }
      

      如果内部类是您的要求,则将您的类设为静态类

      【讨论】:

      • 原问题中的OrderedLinkList 是一个内部类。作为一个内部类,它被正确放置。
      • @JanDvorak:如果是这种情况,请将内部类设为静态。从问题来看还不清楚。
      【解决方案4】:

      您的课程OrderedLinkedList 不在静态上下文中。请将public class OrderedLinkedList extends LinkedList&lt;Integer&gt; 更改为public static class OrderedLinkedList extends LinkedList&lt;Integer&gt; 并编译它应该可以。阅读静态和实例变量将有助于理解更多。

      【讨论】:

        【解决方案5】:

        尝试将 ol 声明为静态:

        static OrderedLinkedList ol = new OrderedLinkedList();
        

        【讨论】:

          【解决方案6】:

          为什么要在另一个类 Test 中实现 publicOrderedLinkedList

          将你的内部类移动到它自己的文件中。它应该可以工作。

          【讨论】:

            猜你喜欢
            • 2015-02-01
            • 1970-01-01
            • 2014-08-31
            • 2014-03-08
            • 2021-02-19
            • 1970-01-01
            • 2013-07-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多