【问题标题】:Problems with inheritance from ArrayList class, 'receiving non-static method can not be referenced in static context' error从 ArrayList 类继承的问题,“无法在静态上下文中引用接收非静态方法”错误
【发布时间】:2014-12-02 21:32:52
【问题描述】:

这是我第一次处理继承问题,我正在尝试创建 ArrayList 类的子类,但我很早就停止了。

import java.util.ArrayList;

/**
 * extending to ArrayList
 */
public class SortedArrayList<E> extends ArrayList<E>
{



/**
 * Inheriting the supers constructors
 */
public SortedArrayList()
{
   super();

  }


 public void add(){

  SortedArrayList.add(); // testing out inherited method.
}


  }

但是,当我尝试编译它时,我得到一个错误,“非静态方法 add() 不能从静态上下文中引用”

我做错了什么?

【问题讨论】:

    标签: java inheritance arraylist subclass superclass


    【解决方案1】:

    就风格而言......我不认为你真的想这样做。

    虽然 ArrayList 被记录为继承,但这并不典型。从未明确为继承而设计的基类跨包边界子类化可能会使您的代码脆弱、容易出错和不安全。原因是继承破坏了封装。您的子类变得依赖于基类的实现细节。

    如果您正在编写新代码,我建议您使用以下样式替代 ArrayList 的子类:

    • 改为子类 AbstractList(IS 记录并设计用于继承)
    • 使 ArrayList 成为 SortedArrayList 的实现细节,将其设为私有字段(即,优先组合而不是继承);向现有类添加检测通常最好通过组合并将方法调用转发到包含的实例来完成。

    这些建议非常符合 Effective Java,第 2 版中给出的建议。

    【讨论】:

      【解决方案2】:

      ArrayList 中没有可调用的无参数 add 方法。如果有,那么你会写super.add();。但是重写一个方法只是为了调用super.add() 而没有其他任何东西与根本不重写该方法并让您的子类继承该方法是一样的。

      我怀疑你想要这样的东西:

      @Override
      public void add(E e) {
          // Write code here to find the index where it belongs, in an "index" variable.
          // Then call super.add with the proper index so it remains sorted.
          super.add(index, e);
      }
      

      【讨论】:

        【解决方案3】:

        在父类上调用方法的正确方法是

        super.add();
        

        【讨论】:

          【解决方案4】:

          几个问题:

          错误信息给你一个主要线索;静态成员与类相关联,而不是对象实例,这通常通过专门引用类名来完成,就像您所做的一样(一个简单的例子是MyClass.myStaticMethod())。但是,在您的情况下,add() 方法是非静态的;它一个实例方法。

          目前尚不清楚您正在尝试做什么,特别是目前使用这种方法。如果您删除方法调用的SortedArrayList 部分,您将进入无限递归循环,因为它会不断地调用自己。

          我假设您正在尝试调用超类的 add 方法,但是您缺少方法签名。如果你试图覆盖ArrayList add 方法,你应该注意有两个版本;如果你想覆盖这些方法,它们应该包含相同的签名,看起来更像这样:

          First Version

          public boolean add(E e){
              // your code
          }
          

          或者second version

          public void add(int index, E element){
              // your code
          }
          

          【讨论】:

            【解决方案5】:

            当您编写SortedArrayList.add(); 时,您正在调用“SortedArrayList”类的静态方法“add”......但它不存在。 如果你必须调用超类的add()方法(非静态),那么你应该使用super.add()

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-25
              • 2011-06-22
              • 1970-01-01
              相关资源
              最近更新 更多