2017-06-02 105 views
0

例1循環中的序列化陣列

  Person person = (Person)os.readObject(); 
     System.out.println(person); 
     person = (Person)os.readObject(); 
     System.out.println(person); 
     person = (Person)os.readObject(); 
     System.out.println(person); 

例2

for(int i=0;i<num;i++) { 
      Person person = (Person)os.readObject(); 
      System.out.println(person); 
     } 

顯然,他們都因爲一個閱讀對象時正常工作只是另一個的環形版本,但我主要好奇心在於爲什麼在示例2中,Person對象正在循環但沒有錯誤,但是如果我這樣做:

例3

 Person person = (Person)os.readObject(); 
    System.out.println(person); 
    Person person = (Person)os.readObject(); 
    System.out.println(person); 
    Person person = (Person)os.readObject(); 
    System.out.println(person); 

我得到重複的變量錯誤。我認爲例3與例2中的for循環相同,任何人都會解釋?

回答

0

您要重新聲明具有相同名稱的變量(非法)

嘗試

Person person = (Person)os.readObject(); 
System.out.println(person); 
person = (Person)os.readObject(); 
System.out.println(person); 
person = (Person)os.readObject(); 
System.out.println(person); 
0

您可以在一個循環中聲明變量。每次循環執行時,它都會讀取變量的聲明,並且一切正常。否則,你將無法在循環中聲明變量。實際上,你只聲明一次。 但在示例3中,您正在聲明相同的變量三次。

0

其實你的問題不是關於序列化數組,而是關於非常基本的Java知識。

在示例1中,您重用了該變量,所以沒關係。在示例3中,您嘗試聲明一個已經存在的變量,它會產生編譯錯誤。你的問題是你對例子2的理解。在2中,代碼不會在編譯時或其他東西上重複。您創建一個循環中多次執行的代碼塊。

如果在一個塊中聲明一個變量,它只存在於該塊內。在for循環的一個循環結束時,您在該塊中聲明的每個變量都將被「刪除」/丟棄。

你甚至可以爲你的變量使用「final」。示例:

public static void main(String[] args) { 

    final int[] samples = { 1, 3, 5, 7, 11 }; 
    for (int i = 0; i < samples.length; i++) { // Start of block 
     // works because value is gone after this block 
     final int value = samples[i]; 
     System.out.println(value); 
    } // end of block 

    // Won't work: 
    System.out.println(value); 
} 

見我在 cannot be resolved to variable 評論有關大括號是如何工作的另一個例子。