ArrayList不同方法的范围

时间:2014-06-27 01:48:16

标签: java arraylist scope

我的代码存在问题。我根据声明行list = new ArrayList<InClass>();的位置获得了不同的结果。到位//B但是当我将其添加到//A时,一切正常,我无法理解其中的区别。这是代码:

import java.util.*;
import java.io.*;
public class ArrayListOne {
private ArrayList<InClass> list;
private InClass in;

public static void main(String args[]) {
    ArrayListOne a = new ArrayListOne();
    a.readFile();
}

public void readFile() {
    //A
    /**
     * adding "list = new ArrayList<InClass>();"
     * getting all 4 lines of test.txt
     */
    try {
        File file = new File("test.txt");
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = null;
        while ((line = reader.readLine()) != null) {
            assignToObject(line);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    readObject();
}


public void assignToObject(String s) {
    //B
    /**
     * adding "list = new ArrayList<InClass>();"
     * getting just last line of test.txt
     */
    InClass n = new InClass(s);
    list.add(n);
    System.out.println(list.size());
}

public void readObject() {
    for (int i=0; i<list.size(); i++) {
        in = list.get(i);
        System.out.println(in.stTest);
    }
}

//inner class
public class InClass {
    String stTest;
    public InClass(String s) {
        stTest = s;
    }
}
}

test.txt有3行。在//A中,我得到了所有三行(我想要的),但在//B中,我只得到最后一行。

1 个答案:

答案 0 :(得分:2)

如果你&#34;内联&#34;更容易看出差异。 assignToObject()assignToObject()的内容复制粘贴到readFile()中的适当位置{/ 1}}:

public void readFile() {

    // B
    // list = new ArrayList<InClass>();

    try {
        File file = new File("test.txt");
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = null;
        while ((line = reader.readLine()) != null) {
            // Here is where assignToObject() was //

            // B
            // list = new ArrayList<InClass>();

            InClass n = new InClass(line);
            list.add(n);
            System.out.println(list.size());
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    readObject();
}

现在考虑一下list = new ArrayList<InClass>()A中是否有B

如果您在list = new ArrayList<InClass>()(即A内)声明readFile(),则语句将执行一次 - 当readFile()被调用时在main()。因此,您最终会得到一个 ArrayList,其中包含您需要的所有内容。

但是,如果您在list = new ArrayList<InClass>()(即B内)声明assignToObject(),那么您将获得 list您阅读的每一行(即每次拨打assignToObject()时)。这意味着每次迭代都会以 ArrayList结束仅包含最近读取的行。包含前一行的ArrayList被丢弃,因为用于指向它的引用现在指向一个新对象。