2011-12-13 12 views
3

может кто-нибудь объяснить, что здесь происходит. У меня создалось впечатление, что размер массива не может быть изменен после его создания и объявления.Изменение размера массива после создания

public class ArrayManipulation 
{ 
    public static void main(String[] args) 
    { 
     int a[] = {1, 2, 3};//new int[3]; 
     int b[] = new int[a.length-1]; 

     System.out.print("a = "); 
     for (int i = 0; i < a.length; i++) 
      System.out.print(a[i] + " "); 
     System.out.println(); 

     for (int i = 0; i < b.length; i++) 
      b[i] = a[i]; 
     //This is the bit I am confused about.. I was expecting an error here 
     a = b; 

     System.out.print("a = "); 
     for (int i = 0; i < a.length; i++) 
      System.out.print(a[i] + " "); 
     System.out.println();  
    } 
} 

ответ

6

Массивы - это объекты, и да, как только они создаются, их размер не меняется.

в строке:

a= b; 

вы направляете a ссылка на b объект. Таким образом, ваш первоначальный объект, который ссылался на a, все еще находится в виртуальной машине до тех пор, пока не будет собран мусор.

Но вашего размер массива изменить, но техника его подводит вы ссылаетесь теперь

0

Оба a и b указывая на гладкошерстный массив/объект типа int[]. Таким образом, a = b просто присвойте значение a значению b.

После этого задания, как a и b относятся к одной и той же матрицей и исходного массива, на который ссылается a может быть собрана сборщика мусора, поскольку он не может получить доступ больше.

+1

Да размер не является частью типа/класса. Некоторые языки (например, Pascal, Algol68) предлагают это. Но в java переменная массива - это просто указатель, а значение массива содержит длину поля. –

0

Вы меняете ссылку, что a указывает, когда вы говорите a = b.

Поскольку массивы являются объектами, установка одного значения, равного другому, изменяет ссылку. Оба массива все еще существуют, но обе ссылки - a и b - указывают на местоположение b. Единственный способ удалить массив a - это сбор мусора.

На самом деле вы не меняете размер массива, это похоже на это.

0
//This is the bit I am confused about.. I was expecting an error here 
    a = b; 

Да, вы сбиты с толку правильно! a и b имеют собственную память, выделенную для себя. С помощью a = b вы делаете a направили на выделение памяти для b.

Возможно добавление этой дополнительная sysouts коды поможет, увидеть выход:

public class ArrayManipulation 
{ 
    public static void main(String[] args) 
    { 
     int a[] = {1, 2, 3};//new int[3]; 
     int b[] = new int[a.length-1]; 


     System.out.print("a = "); 
     for (int i = 0; i < a.length; i++) 
      System.out.print(a[i] + " "); 
     System.out.println(); 

     for (int i = 0; i < b.length; i++) 
      b[i] = a[i]; 

     System.out.print("NEW -- before a=b. a = " + a); 
     System.out.print("NEW -- before a=b. b = " + b); 
     //This is the bit I am confused about.. I was expecting an error here 
     a = b; 
     System.out.print("NEW -- after a=b. a = " + a); 
     System.out.print("NEW -- after a=b. b = " + b); 

     System.out.print("a = "); 
     for (int i = 0; i < a.length; i++) 
      System.out.print(a[i] + " "); 
     System.out.println();  
    } 
} 
Смежные вопросы