2014-06-27 18 views
0

我对下面的代码有问题。基于list = new ArrayList<InClass>();行的声明,我得到了不同的结果。 //B,但一切正常,当我将它添加到//A,我无法理解它们之间的区别。以下是代码:ArrayList不同方法的作用域

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我只是得到最后一行。

回答

2

它很容易看出差别,如果你“内联” assignToObject()通过复制粘贴的assignToObject()到适当的位置内容readFile()

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>()AB

如果您在声明Alist = new ArrayList<InClass>()(即内readFile()),该语句将被执行一次 - 当readFile()被称为main()。所以你最终会以一个ArrayList包含你需要的一切。

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

+0

哦,现在我明白了。非常感谢你 – Yar