2014-06-27 39 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