【问题标题】:How to implement an arraylist from a superclass in the constructor of a subclass?如何在子类的构造函数中从超类实现数组列表?
【发布时间】:2019-11-23 10:36:07
【问题描述】:

我目前正在尝试学习 Java,但遇到了一个我有点卡住的问题。

我有一个超类和两个扩展它的子类,在超类中我创建了一个 Arraylist,我想在子类的构造函数中使用它,但我不太确定我的解决方案。

我很乐意为您提供任何帮助,如果您需要任何进一步的信息来理解我的问题,请告诉我。

所以这是我尝试过的:

public class Superclass{ 
    private String something;
    private ArrayList<String> list;

    public Superclass(String something){ 
      this.something = something; 
      list = new ArrayList<String>(); 
    }
}


public class Subclass extends Superclass{ 

     public String someelse; 

     public Subclass(String name, ArrayList<String> list, String 
                   someelse){ 
          super(name); 
          this.someelse = someelse; 
          list = new ArrayList<String> 
     }
}

它没有出现任何错误,但这样做是正确的方法,还是有办法将 ArrayList 放在超级括号中? 我想将它初始化为超类,在子类中添加元素并在不同的类中使用它。

【问题讨论】:

  • 如果你想访问子类中的列表,它必须声明为非private(所以要么protected要么public或包默认)然后你需要初始化它只在超级
  • 此代码不是有效的 Java 代码。所以它不可能编译。所以不,这不是做你想做的事的正确方法(不管那可能是什么)。
  • 如果你已经在超类ctor中这样做了,为什么还要在子类ctor中为list分配一个空的ArrayList?
  • 所以你是说我可以在超类中将其设置为受保护,然后只在那里初始化它,而不是在两者中都初始化两次?

标签: java arraylist constructor subclass superclass


【解决方案1】:

抱歉,我没有完全理解这个问题。我建议将Superclass 中的列表设置为受保护的,这允许您的Subclass 单独访问它,而无需公共访问。见下文:

public class Superclass {

    private String name;
    protected List<String> list;

    public Superclass(String name) {
        this.name = name;
        this.list = new ArrayList<>();
    }
}

public class Subclass  {

    public String someName;

    public Subclass(String name) {
        super(name);
        this.someName = name;
    }

    public void add(String string) {
        list.add(string); <- because of the list being protected, this refers to the list in the super class
    }
}

我的建议是将元素的添加和删除留给Superclass,除非您计划在从列表中添加/删除元素时在Subclass 中进行任何额外的检查。这意味着将add 方法移动到Superclass,如下所示:

public class Superclass {

    private String name;
    protected List<String> list;

    public Superclass(String name) {
        this.name = name;
        this.list = new ArrayList<>();
    }

    public void add(String string) {
        list.add(string);
    }
}

public class Subclass  {

    public String someName;

    public Subclass(String name) {
        super(name);
        this.someName = name;
    }
}

然后您将创建并使用它(适用于上述两个示例):

Subclass subclass = new Subclass("sub1");
subclass.add("string1"); <- gets added to superclass list

有关范围标识符的详细信息,请参阅this

【讨论】:

  • 为什么会这样?这是做什么的?你改变了什么?你为什么改变它?一个好的答案包含解释,它不只是转储代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多