2014-11-11 5 views
4
public abstract class Class1 { 
    protected static Object object1 = null; 
    protected static Object object2 = null; 

    public static Object[] objects = { object1, object2 }; 

    public static void main(String[] args) { 
     new Class2(); 

     for (Object o : objects) { 
      System.out.println(o); 
     } 
    } 
} 

public class Class2 extends Class1 { 
    public Class2() { 
     Class1.object1 = new String("String 1"); 
     Class1.object2 = new String("String 2"); 
    } 
} 

Воспроизводит:ссылки на массив Java являются недействительными после того, как установлено

null 
null 

Почему?

Когда я создаю новый экземпляр Class2, конструктор этого класса инициализирует object1 и object2.

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

Может ли кто-нибудь объяснить? Благодарю.

+0

'int x = 3; int y = x; x = 5; 'y все равно 3. –

+0

@SotiriosDelimanolis * Слегка * не согласен с дубликатом, поскольку ссылка касается параметров функции, и даже если это та же идея, было бы сложно, чтобы ОП здесь совершил этот прыжок. –

+0

Если вы этого не обнаружили раньше, прочитайте [this] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value). –

ответ

5

object не содержит ссылки на эти object1 и object2, но содержит скопированные ссылки на эти объекты.

Если вы:

public static Object[] objects; 

public static void main(String[] args) { 
    new Class2(); 

    objects = { object1, object2 }; 
    for (Object o : objects) { 
     System.out.println(o); 
    } 
} 

т.е. инициализировать object после инициализации object1 и object2 вы будете иметь копии в массиве, которые не являются пустыми.

+0

Это имеет смысл. Благодаря! – Josh

3

Когда instanciating ваш объект первым это

protected static Object object1 = null; 
protected static Object object2 = null; 

наборы object1 и object2 быть null -references.

Тогда это

objects = { object1, object2 }; 

копирует ссылки, которые object1 и object2 содержат в то время к objects[0] и objects[1].

Тогда здесь

Class1.object1 = new String("String 1"); 
    Class1.object2 = new String("String 2"); 

создавать новые String -references, которые откладываются в object1 и object2 - но копии в objects[0] и objects[1] не изменяются.

Смежные вопросы