2016-08-19 1 views
-1
final DateFormat dateFormat = DateFormat.getDateTimeInstance() ; 
    GregorianCalendar time = new GregorianCalendar(); 
    GregorianCalendar limit = time; 
    limit.add(GregorianCalendar.HOUR_OF_DAY, 4); 

    String timeForm = dateFormat.format(time.getTime()); 
    String limitForm = dateFormat.format(limit.getTime()); 
    System.out.println(timeForm); 
    System.out.println(limitForm); 

Выход должен быть временем «сейчас», после которого следует время через 4 часа.Когда я меняю один экземпляр GregorianCalendar, меняет другой экземпляр

Когда он распечатывается, как timeForm, так и limitForm показывают время после 4 часов. Почему это?

+0

Там только один экземпляр. Переменная не является экземпляром, это ссылка на одну. 'GeorgianCalendar limit = time;' не создает новый экземпляр 'GeorgianCalendar', он просто сообщает' limit' ссылаться на тот же объект, на который ссылается 'time'. –

ответ

1

Вы устанавливаете второй календарь равным первому, а не создаете второй экземпляр. Поэтому, когда вы меняете экземпляр, это влияет на обе переменные. Если вы сделаете limit = new GregorianCalendar();, на выходе будет отображаться 2 разных значения.

1

Вы хотите отступить и прочитать, как Java имеет дело с «ссылочными типами».

Другими словами: что-либо в Java, которое является своего рода объектом (например, объектами GregorianCalendar), идентифицируется с помощью ссылки.

И когда вы делаете назначение как

limit = time; 

тогда вы не создания другого объекта. У вас просто есть две переменные, время и предел, которые оба «указывают» на тот же самый объект.

Таким образом, когда вы используете одну переменную и изменяете статус на ссылочном объекте; конечно, другая переменная «видит» эти изменения.