package com.javarush.task.task04.task0402;
/*
Цена яблок
*/
public class Solution {
public static void main(String[] args) {
Apple apple = new Apple();
apple.addPrice(50);
Apple apple2 = new Apple();
apple2.addPrice(100);
System.out.println("Стоимость яблок " + Apple.applesPrice);
}
public static class Apple {
public static int applesPrice = 0;
public static void addPrice(int applesPrice) {
Apple.applesPrice = Apple.applesPrice + applesPrice;//напишите тут ваш код
}
}
}
Анатолий
4 уровень
Подскажите,как работает эта программа? куда что отсылает,что переприсваивает и т.д. Несколько раз перечитал тему - не совсем понял. И раздел помощь не посеял зерно понимания:(
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Александр Дорофеев Backend Developer в Ай-Теко Expert
27 мая 2019, 20:44решение
Apple apple = new Apple(); - создается новый объект типа Apple
apple.addPrice(50); - добавляем 50 к цене.
Apple apple2 = new Apple(); создается новый объект типа Apple
apple2.addPrice(100); добавляем 100 к цене.
System.out.println("Стоимость яблок " + Apple.applesPrice); Выводим стоимость.
Скорее всего, тебя смущает, почему выводится 150, а не 100.
Дело в том, что переменная applesPrice - статическая, то есть она едина для всех экземпляров класса.
Неважно, сколько объектов класса ты создаешь, при создании нового объекта статические переменные уже существуют, и они равны для всех экземпляров класса.
+10
Анатолий
28 мая 2019, 08:21
Хм..
Попробую уточняющий вопрос сформулировать,не знаю поможет ли он мне понять или нет.
Вот каким образом "Метод main должен вызывать метод addPrice только два раза." ? Опишите этот механизм как оно ввзывает и работает.
И второе: непонятна эта конструкция "Apple.applesPrice = Apple.applesPrice + applesPrice;"...тоже хотелось бы понять как она работает и почему именно так
+1
Haumi Java Developer
28 мая 2019, 08:43
Вот каким образом "Метод main должен вызывать метод addPrice только два раза." ?
в этом методе вы должны 2 раза использовать метод addPrice.
если 1 или 3 раза будете использовать, то это не выполняет условия задачи.
"Apple.applesPrice = Apple.applesPrice + applesPrice;"
Apple.applesPrice - это доступ к статической переменной applesPrice
в данном выражении обновляется applesPrice если в него поступает из вне новая цена applesPrice.
Apple.applesPrice(внутренняя статическая переменная) = Apple.applesPrice(берется старое значение) + applesPrice(значение которое вы передаете);
при первом вызове вы передаете 50
это выглядит так:
Apple.applesPrice = 0 + 50;
после чего переменая уже не 0, а 50 и при след вызове будет выглядеть так:
Apple.applesPrice = 50 + 100;
+6
Анатолий
28 мая 2019, 17:12
А вот разве вот здесь "Apple.applesPrice(внутренняя статическая переменная) = Apple.applesPrice(берется старое значение) + applesPrice(значение которое вы передаете);" в этой строчке последнее слагаемое должно быть не "addPrice"? Просто тогда для кого написана эта переменная apple.addPrice(50) со своим передаваемым параметром?Она роли не играет? Мне кажется её надо суммировать последним слагаемым,чтобы всё было логично...
0
Haumi Java Developer
28 мая 2019, 18:00
когда мы написали apple.addPrice(50)
внутренняя статическая переменная
при следующем вызове метода и передаче туда 100
apple.addPrice(100)
внутри уже есть значение которое равно 50
оно берется и получается что:
и в конце получаем 150
просто этот клас статика, если убрать статику, это все равно что:
+8
Viktor Kupreyenko
14 июня 2019, 05:23
Александр прекрасное объяснение! А если есть у вас пару минут - не могли бы кинуть похожую задачу, без вывих мозгов с запутыванием яблок. Чтобы разобраться окончательно, или ссылку на какой то видеоурок? Заранее Благодарен!
0
Elchin Musaev
16 июня 2019, 02:42
вы могли бы объяснить почему значения 50 и 100 не присваиваются, а складываются с предыдущем значением?
я понимаю, что это статическая переменная и она для всех одна, но у меня в голове не может уложится то, что новое значение суммируется с предыдущем, а не присваивается новое. Или это не надо понимать и просто принять как данность?
а судя по этой записи кажется, что переменная в самом классе не изменялась и была всегда равна нулю, а аргумент функции изменялся с каждым новым объектом, но ведь этот аргумент и переменная - одно и то же, как они могут независимо друг от друга меняться?!
Ведь я правильно понимаю, что Apple.applesPrice - переменная в классе Apple, а applesPrice - аргумент функции addPrice ?
это разрывает все мои шаблоны и получается, что я вообще ничерта не понимаю до сих пор +3
Александр Дорофеев Backend Developer в Ай-Теко Expert
24 июня 2019, 04:20
Есть такое понятие - видимость переменной. Для нового объекта класса переменные при создании определяются начальными значениями и увидеть их можно только обратившись к объекту класса. Для статических переменных значение задается вне зависимости от того, существует ли хоть один объект этого класса. Происходит это еще до запуска самой программы. Более того, к статической переменной можно обращаться даже не создавая объект класса, таким образом при создании объекта эта переменная может иметь другое значение, нежели заданное по умолчанию.
+1
Elchin Musaev
27 июня 2019, 16:17
только сейчас вроде дошло, спасибо)
0
Asike
13 июля 2019, 03:15
Когда изучал объяснение задачи на ум пришла аналогия. Статическая переменная как ведро накрытое крышкой с дырочками. Я закидываю в одну дырочку яблоко потом в другую дырочку но все в итоге оказывается в одном ведре. Более опытные товарищи подскажите пожалуйста верна ли данная аналогия?
0