Java

Объясните пожалуйста, что происходит в этом коде:

Задача: Реализовать метод addPrice(int applesPrice), чтобы при его вызове суммарная стоимость яблок увеличивалось на переданное значение.
Ответ: 150
Код (верный):
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("Apples price is " + Apple.applesPrice);
}

public static class Apple {
public static int applesPrice = 0;

public static void addPrice(int applesPrice) {
Apple.applesPrice = applesPrice + Apple.applesPrice;
}
}
}

Интересует строчка Apple.applesPrice = applesPrice + Apple.applesPrice;. Я понял, что вначале плюсуется 50+0=50. Но как программа берет значение apple2.addPrice(100)? В строке же не указано, что берется значение apple2.
Уже несколько комментариев прочитал, но все равно до меня не доходит именно этот момент.
А это потомушта код написан мягко говоря нипанятна... Но сначала давай-ка разберём "public static class Apple"
public static int applesPrice = 0; //вот эта строчка говоряти что у яблок есть цена и она равна 0. но также тут есть волшебное слово "static" - оно говорит что у всех яблок это цена будет ВСЕГДА одинакова что у apple1, что у apple2 или даже у appleAbraCadabra.
метод:
public static void addPrice(int applesPrice) {
Apple.applesPrice = applesPrice + Apple.applesPrice;
}
точно также обновляет цену для яблочков, но поскольку метод статичен (как и поле applesPrice) (статичен значит принадлежит на объекту, например apple1 или apple2, а вообще всему классу), то цена точно также обновляется. А дальше начинается долбанная магия. Вот так вот:
Apple apple = new Apple();
apple.addPrice(50); //в этой строчке мы вызваем статический метод у объекта, так делать не рекомендуется, но джава это позволяет, ну типа если человек дурак то и чёрт с ним. Она тихо офигевает конечно, но разрешает. Хотя вот так правильнее и синтаксически и вообще:
Apple.apple.addPrice(50);
получается что код:
Apple apple = new Apple();
apple.addPrice(50);
Apple apple2 = new Apple();
apple2.addPrice(100);
Абсолютно идентичен:
Apple.apple.addPrice(50);
Apple.apple.addPrice(100);
Но последний не вносит сумятицы. Т. е. ты выполняя первый код, думаешь что устанавливаешь отдельно цену для apple1 и apple2, а по факту ты устанавливаешь цену для всего класса, и соответсвенно у всех объектов этого класса цена будет одинаковая, она же одна на всех.
Сергей Силосеев
Сергей Силосеев
4 644
Лучший ответ
Сергей Силосеев Сори, строчки:
Хотя вот так правильнее и синтаксически и вообще:
Apple.apple.addPrice(50);
Должны быть такими:
Apple.addPrice(50);
а строочки:
Абсолютно идентичен:
Apple.apple.addPrice(50);
Apple.apple.addPrice(100);
такими:
Абсолютно идентичен:
Apple.addPrice(50);
Apple.addPrice(100);
>В строке же не указано, что берется значение apple2.
Как это "не указано"? Еще как указано:

apple2.addPrice(100);

Ты просто не отличаешь объекты от классов, в этом вся проблема.
public STATIC int applesPrice как раз и означает, что данная переменная принадлежит всему классу, а не какому-то конкретному элементу