DateFormat dateFormat = new SimpleDateFormat("MMMMM d yyyy", Locale.ENGLISH);
Date currentDate = dateFormat.parse(date); //присваиваем переменной currentDate значение из строки date
Date yearStartTime = currentDate; // объявляем переменную yearStartTime и заносим значение переменной currentDate
yearStartTime.setMonth(0); yearStartTime.setDate(1); // приводим дату переменной yearStartTime к 1 января для вычисления разницы между датами
Вопрос в том, что после данных манипуляций переменная currentDate также приводится к началу года. Почему?
Задачу решил, только запарсив переменную currentDate заново
Александр
14 уровень
Странная работа методов setMonth() setDate()
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
28 октября 2019, 10:25
В Head FIrst Java приводится аналогия ссылки как пульт от телевизора. Объект как телевизор.
Есть примитивы, есть переменные ссылочного типа.
в этих строках в памяти будет создана ячейка, с именем а, которая хранит 5.
Cat cat1 = new Cat("Vaska");
Это переменная ссылочного типа. В памяти создастся объект - Кот Васька. Оператор new создаст этот объект, и вернет ссылку к нему - это наш поводок/пульт управления, ссылка где этот объект находится в памяти. Эта ссылка будет присвоена переменной cat1.
То есть переменная cat1 хранит ссылку - адрес в памяти, где этот объект находится.
И когда мы пишем:
мы говорим программе - пойди по адресу Х34356, там наш объект, и вызови у него такой-то метод.
Но мы можем написать и так:
Cat cat2 = cat1;
Что произойдет, объявится новая переменная, кот2, в значение которой будет передаваться значение переменной cat1. То есть ссылка на нашого Кота Ваську.
Значение будет передаваться путем копирования этой ссылки и присвоения этой ссылки новой переменной cat2.
И в результате, у нас объект один - Кот Васька.
А ссылок/пультов управления к этому объекту два - переменные cat1 и cat2.
То есть эти две переменные указывают на один объект. Как два пульта к одному телевизору.
Какой бы не использовали, будет меняться сам объект.
Тоже самое произошло у тебя, ты присвоил ссылку на один и тот же объект еще одной переменной (пульту управлению), поменял что-то, и естественно если используешь другой пульт к этому же объекту, то он тебе покажет изменения, поскольку объект то 1, а две переменные ссылаются на один и тот же объект в памяти.
Так что различай переменные и объекты.
Переменные это ячейка в памяти, которая хранит ссылку на какой-то объект.
Если ты пишешь cat2 = cat3;
ты просто присваиваешь коту2 копию ссылки на объект,на который указывает кот3 +1
ДМИТРИЙ
28 октября 2019, 10:07
нужно это помнить всегда, что при создании примитивных типов, создается новая ячейка в памяти.
int a=4;
int b=a;
это две разные ячейки, и изменение одной переменной никак не влияет на другую.
с сылочными переменными все иначе, им присваиваются ссылки на адресс в памяти, и следовательно, переменные обмениваются ссылками, а не, собственно, значениями.
+1
Justinian Judge в Mega City One Master
28 октября 2019, 10:11
обмениваются значениями, в качестве которых выступают копия ссылки на объект.
+1
ДМИТРИЙ
28 октября 2019, 09:58решение
Потому что переменной yearStartTime вы присвоили ссылку на объект созданный ранее currentDate. Итогом стало, что две переменные хранят ссылку на одну ячейку в памяти. следовательно применив методы изменения даты к любой из переменных изменяется объект в этой ячейке памяти.
+2
Александр
28 октября 2019, 10:01
Я тоже так подумал, но это не казалось мне очевидным и до сих пор кажется странным)
0
Александр
28 октября 2019, 11:23
Просто в переменных сложных типов хранится ссылка, а не объект. Всегда.
+1