使用覆盖方法

时间:2015-10-28 15:29:51

标签: java arraylist

在任务的条款中,我需要覆盖toString方法以返回ArrayList的每个第二个元素:

@Override
public String toString() {
    String str = "";
    for (int y = 1; y <= list.size() - 2; y += 2) {
        str += list.get(y) + " ";
    }
    return str;
}

但是当我尝试从另一种方法调用它来打印保存的字符串值时:

public void print() {
    System.out.println(list.toString());
}

它打印出数组的所有元素,如:[0,1,2,3,4,5]。

我做错了什么?

4 个答案:

答案 0 :(得分:2)

包含的代码不足以确定,但有两个可能存在的问题:

  1. 您的答案中显示的方法不在扩展ArrayList的类中。这是正确覆盖方法的唯一方法
  2. list未实例化为您创建的类的对象。如果将list实例化为ArrayList,则创建新类将不起作用。
  3. 必须创建一个新类,list必须是新类的成员。

答案 1 :(得分:1)

如果要覆盖方法,则必须创建自己的类。例如:

public class MyList<T> extends ArrayList<T> {
    private static final long serialVersionUID = 1L;

    public MyList() {
        super();
    }

    @Override
    public String toString() {
        String str = "";
        for (int y = 1; y < super.size(); y += 2) {
            str += super.get(y) + " ";
        }
        return str;
    }
}

如果你实例化MyList,你会看到你想要的东西。

public static void main(String... args) throws Exception {
    MyList<String> list = new MyList<String>();
    for(int i = 0; i < 10; i++) {
        list.add(String.valueOf(i));
    }

    System.out.println(list);
}

输出:

1 3 5 7 9 

或者,可能更好的方法是简单地定义接受参数并调用它的方法。

public String toString(Collection<?> list) {
    String str = "";
    for (int y = 1; y < super.size(); y += 2) {
        str += super.get(y) + " ";
    }
    return str;
}

这样称呼:

System.out.println(toString(list));

答案 2 :(得分:0)

您似乎没有覆盖toString类中的ArrayList,而只是来自您自己班级的默认toString。只有在执行myclass.toString()时才会调用此方法。

另外为什么要尝试通过覆盖toString来做到这一点?这将对整个项目产生影响,因此您将无法在其他类中使用默认的toString

只需创建一个返回所需字符串的函数吗?

public String customArrayListToString(ArrayList<> list){
    String str = "";
    for (int y = 1; y <= list.size()-1; y += 2) {
        str += list.get(y) + " ";
    }
    return str;
}

或在其他答案中发布,并创建自己的扩展ArrayList

的类

答案 3 :(得分:-1)

您必须覆盖要使用它的类中的toString,否则将调用非重写方法,因为该类会调用默认的`consturctor及其方法。