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 += applesPrice;
}
}
}
Почему например не одно и то же имя принимает 2 разных значения? Почему не apple.adPrice + apple2.addPrice, например? Александр
16 уровень
Решительно не понимаю!)
Решен
Комментарии (44)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Олег
27 января 2019, 07:49
Все, буксую конкретно. Дым есть, злость есть, толку нет.
+5
Александр
29 января 2019, 21:19
толк есть, просто не сразу заметно) вся дорога такая будет) крепись!
+6
Seryoga Gabov
10 января 2019, 19:44
Apple.applesPrice = Apple.applesPrice + applesPrice эквивалентна Apple.applesPrice += applesPrice.
Почему если Apple.applesPrice = applesPrice (кот.принадлежит addprice) ответ принимает значение последнего объекта. Не понимаю каким образом строчка Apple.applesPrice = Apple.applesPrice + applesPrice складывает вообще все объекты, даже если добавить ещё 1 или 2?
0
Seryoga Gabov
10 января 2019, 20:10
Получается прибавление идёт с последнего объекта? И почему если написать Apple.applesPrice = Apple.applesPrice + Apple.applesPrice; и в public static class Apple, applesPrice = 2, ответ 8? Я ничего не понимаю...
+1
Александр
21 января 2019, 22:27
Смотри, Серег!
Строчками Apple apple = new Apple(); и Apple apple2 = new Apple(); мы создаем объекты класса Apple, чтобы с их помощью иметь доступ к переменной applesPrice и обращаться к ней.
Так же в классе Apple находится метод addPrice(int applesPrice) , к нему мы тоже можем обращаться только через объект класса, который как я говорил создается вот так: Apple apple = new Apple(); . Мы можем создавать неограниченное количество объектов класса. Чтобы обратиться к методу или переменной класса нужно написать "имя объекта"."переменная", либо "метод".
В будущем будет много классов, а в них методы и переменные, которые мы будем вызывать из main`а, например. А таким поступая таким образом и всем будет понятно, к какой переменной ты обращаешься (в каком классе она находится.)
Теперь обрати внимание на метод public static void addPrice(int applesPrice). Метод это что-то типа конструктора, шаблона и в данный метод addPrice требует чтобы в него передавалась int переменная, тут это выглядит как (int applesPrice). То есть метод называется addPrice, а в скобках мы должны передаем значение, что и сделали apple.addPrice(50). Ещё раз: apple здесь указывает на класс, в котором этот метод находится, далее название метода и в скобках значение которое мы в этот метод хотим передать.
Теперь смотрим в "тело" метода! Apple.applesPrice += applesPrice; Пойдем по порядку. Apple.applesPrice: "Apple." - имя класса, "applesPrice" - переменная этого класса. Это как путь к папке C:\Users\1\Desktop\ (ещё раз) на компе много файлов с одинаковым именем может быть , поэтому нужно указать путь к нужному ).
Тут у тебя возможно начинает все путаться в голове, говорили про объекты, чтобы путь указать.) Но так как класс и переменная статическая (STATIC), то это означает что мы можем к ней обращаться и просто по через имя класса "Apple.applesPrice"! И проинициализирована она у нулем.
+72
Александр
21 января 2019, 22:36
Далее по телу метода Apple.applesPrice += applesPrice. Здесь applesPrice совпадает со значением которое мы запрашиваем в методе addPrice(int applesPrice). Это говорит о том, что мы именно, то значение которое мы передаем в метод путем apple.addPrice(50) и будет у нас прибавляться сначала к нулю, ну а потом к 50 сатэн)
Вообще можно переписать метод так, для понятности:
результат не изменится. Так как это лишь конструктор, что куда должно идти.
Извиняюсь что много букв!) Хотел разжевать как следует, что уж понятно было. Я помню как буксовал тут. До конца не понял пошел дальше..) Но со временем все укладывается по полочкам. Не опускайте руки если не понятно, для этого ещё будет много других прекрасных возможностей! +58
Seryoga Gabov
28 января 2019, 13:02
Спасибо
0
Rocket7th
3 февраля 2019, 15:47
Строчками Apple apple = new Apple(); и Apple apple2 = new Apple(); мы создаем объекты класса Apple, чтобы с их помощью иметь доступ к переменной applesPrice и обращаться к ней.
Разве это не 1 объект с двумя переменными? ведь Apple - объект, а apple1 - apple2 это название переменных?
Или я очень сильно ошибаюсь?
0
Dimasta
6 февраля 2019, 23:39
По идее apple1 и apple 2 это ссылки на два разных объекта, которые ты собственно и создаешь этими записями,
помни что Apple - это класс(просмотри получше код)
просто довольно непривычная форма записи, и сразу невольно ошибочно думаешь что Apple это объект, а не объекты типа Apple
0
Askar
18 февраля 2019, 22:34
Спасибо за подробное объяснение!!!
0
Владлен
23 февраля 2019, 11:32
Вот и я так понял.
0
Владлен
23 февраля 2019, 11:32
JavaRush торчит тебе бесплатную подписку, делаешь их работу. Спасибо)
+2
Глеб Антосик
1 марта 2019, 20:38
спасибо
0
Anonymous #2053422
12 марта 2019, 14:29
А теперь, Христа ради, как метод называется addPrice, а в скобках мы должны передаем значение, что и сделали apple.addPrice(50). Ещё раз: apple здесь указывает на класс, в котором этот метод находится, далее название метода и в скобках, как apple может указывать на класс, если класс называется Apple?
+1
Александр
12 марта 2019, 14:38
apple это объект класса Apple. Apple apple = new Apple();
Объект класса apple может обращаться ко всем полям и методам своего класса, то есть Apple.
0
Ellerina
9 ноября 2019, 04:06
Спасибо, дружище!
0
Олег Севрук
23 сентября 2018, 22:03
Ребят, а можно сделать так:
public static void addPrice(int newApplesPrice) {
applesPrice += newApplesPrice;
}
ведь в задании нигде не говорится что нельзя менять имен переменных.
Код скомпелировался успешно
+6
Зеленая лягушка
22 июня 2018, 16:06решение
Добрый день, Александр!
Как говорят фокусники - следите за руками...
Поле applesPrice является статическим. Это значит, что оно существует только у класса Apple и не существует у объектов типа Apple. Все, что делает любой объект типа Apple происходит с одним единственным полем самого класса Apple.
Метод addPrice прибавляет к полю applesPrice значение, полученное в качестве аргумента (int applesPrice). Прибавляется каждый раз к одному и тому же полю класса applesPrice. Также следует понимать, что статическая переменная applesPrice и локальная переменная int applesPrice, передаваемая в качестве аргумента, это совершенно разные переменные с разной областью видимости, хотя имена и типы у них одинаковые.
После выполнения выражения в строке 4 apple.addPrice(50); значение поля applesPrice стало 50, т.к. к 0 прибавили 50.
После выполнения выражения в строке 6 apple2.addPrice(100); значение поля applesPrice стало 150, т.к. к 50 прибавили 100.
apple.adPrice + apple2.addPrice было бы верным если бы поле applesPrice не было бы статическим и соответственно существовало бы в каждом объекте. В этом случае, в каждом объекте хранилось бы свое значение и для получения их суммы нужно было бы их сложить. В нашем случае сумму хранит сам класс.
Надеюсь, что правильно понял ваш вопрос.
С уважением,
Зеленая лягушка.
+144
Александр
23 июня 2018, 13:14
Благодарю за ответ!
1)Правильно ли я понимаю, что программа читается сверху вниз и когда доходит apple.addPrice , то находит метод addPrice, в котором в Apple.applesPrice заносит значение 50, далее так же для 100?
2) Как значение 150 из public static void addPrice передается в печать? void же не возвращает..
3) почему Apple.applesPrice каждый раз не обнуляется, когда к нему обращаются при выводе или Apple.applesPrice += applesPrice; ?
+6
Зеленая лягушка
25 июня 2018, 14:18
1) Правильно. У объекта apple вызывается метод addPrice, в который передается в качестве аргумента число 50. Такой метод (включая обязательный аргумент типа int) у объекта есть, т.к. он создан на основании класса Apple, объявившего и реализовавшего такой метод.
2) Метод addPrice не передает ничего "на печать", так как имеет специальный тип возвращаемого значения - void. Этот тип значит, что метод ничего не возвращает, просто производит определенные действия при вызове. Методу println выводящему в консоль значение поля System.out (это статическое поле класса System) передается в параметре не результат работы метода addPrice, а значение поля applesPrice класса Apple. Именно класса, а не объекта созданного на базе этого класса, т.к. поле статическое.
3) Поле не "обнуляется", т.к. программа не содержит инструкций "обнуления". Вообще, с полем происходит строго то, что написано в программе. Написано следующее: каждый раз, когда у объекта типа Apple вызывается метод addPrice к текущему значению поля applesPrice прибавляется число, переданное в качестве аргумента в метод addPrice. Если до строки 6 вы укажете еще одну инструкцию
то она выведет в консоль "Стоимость яблок 50".
Также инструкцию
можно написать два раза подряд и тогда в консоль выведется - 250.
Мои ответы на вопросы можно лайкать или дизлайкат. Не знаю как это повлияет на карму, но будет информативно в качестве оценки полезности ответов. Если есть еще вопросы, задавайте. Постараюсь ответить.
С уважением,
Зеленая лягушка. +213
Александр
26 июня 2018, 15:03
Непонятным остался момент:
"Методу println выводящему в консоль значение поля System.out (это статическое поле класса System) передается в параметре не результат работы метода addPrice, а значение поля applesPrice класса Apple." А ведь там к нулю приравнивается и оттуда уже получается идет в печать... как-то выглядит для меня пока...
0
Зеленая лягушка
27 июня 2018, 11:13полезный
Добрый день, Александр!
Исполнение программы на java начинается с последовательного (сверху вниз) исполнения выражений метода main. Первое выражение метода main
В нем объявляется ссылочная переменная типа (класса) Apple и сразу инициализируется (т.е.
присваивается определенное значение) объектом типа Apple. Такая инициализация называется инициализацией в месте объявления. Так как переменная ссылочная, в нее заносится ссылка на область памяти, где размещен объект Apple. Встретив упоминание класса Apple java-машина загружает в память класс Apple. (Я не силен в механизме загрузки классов и может оказаться, что раз класс Apple является вложенным классом класса Solution он будет загружен при загрузке класса Solution, а не так как я написал. Этот момент не знаю точно). При
этой загрузке будут инициализированны все статические поля инициализирующиеся в месте объявления. То есть, поле
Будет инициализировано нулем при загрузке класса Apple. В памяти будет выделено место для поля типа int (4 байта) и туда будет занесено значение 0. Класс больше загружаться в память не будет. Далее в память будут загружаться только объекты, созданные на основании этого класса. Но так как поле applesPrice статическое, т.е. принадлежит классу, а не объектам, другого такого поля не будет и все действия будут производится с ним. А именно, при выполнении выражения
в поле будет занесено значение 50, полученное путем сложения текущего значения 0 и значения 50.
При выполнении выражения
в поле будет занесено значение 150, полученное путем сложения текущего значения 50 и значения 100.
+82
Зеленая лягушка
27 июня 2018, 11:14полезный
Про метод addPrice() я уже писал, что он не возвращает, а меняет значение поля applesPrice путем сложения текущего значения поля и значения, переданного в качестве аргумента в метод.
Спасибо за лайки. Готов отвечать на вопросы дальше. Это весьма полезно и для меня самого.
С уважением,
Зеленая лягушка.
+74
Аюна Владимировна Backend Developer в Кит Консалтинг
20 августа 2018, 19:07
Вы просто бест оф зэ бест. Огромное спасибо :)
0
Mr.Zefirka
19 ноября 2018, 08:38
Вообщем я понял,что познания программирования для меня кончились на стадии "методы и классы",ибо сколько не читал(и ответы лягушки),все равно не понял как они взаимодействуют.
Удачи остальным в этом деле.
Пойду мешки ворочать.
+4
Зеленая лягушка
29 ноября 2018, 11:25
Привет, Mr.Zefirka!
Что конкретно тебе не понятно во взаимодействии методов и классов? Я понимаю, что задать вопрос, особенно правильный не менее тяжело, чем ответить на него. Поэтому вот тебе для затравки общая информация.
Программы в Java состоят из классов. Класс это некоторая абстракция чертежа. Чертежа чего-либо. При этом класс может содержать в себе некоторые внутренние структуры. Во-первых, поля, они же данные. Поле это абстрактное представление некоторой информации как факта. Во-вторых, методы. Они же функции в других языках программирования. Методы представляют собой абстрактное описание действий с данными из полей или получаемых
иным способом. Если упростить, то синтаксически поля и методы различаются наличием пары круглых скобок после имени. У полей их нет, а у методов есть. Поле это ответ на вопрос что?. А метод это ответ на вопрос как? Соответственно класс это инструкция что взять и как обработать для получения некоторого результата.
С уважением,
Зеленая лягушка.
+39
Ivan Bukrieiev
8 января 2019, 02:21
просто поставлю эти мешки и пойду дальше проходить курс
+16
Bo_Jackson
12 января 2019, 21:45
Пусть тебя возьмут к себе в штат, ты та необходим! JavaRush-цы возмите его. Он необходи для таких неандертальцев как я.
+1
DenisKa
13 января 2019, 16:32
Лягушка, почему this.applesPrice = this.applesPrice + applesPrice; низя писать если метод addPrice() статичен?
0
Зеленая лягушка
13 января 2019, 17:56
Привет, Richard Hendricks!
Уточняющий вопрос в комментариях кода.
С уважением,
Зеленая лягушка. +3
DenisKa
13 января 2019, 18:20
да!
+2
Зеленая лягушка
13 января 2019, 19:07
Вообще, ключевое слово THIS – это ссылочная переменная, которая ссылается на текущий объект. Его можно использовать для ссылки на переменную экземпляра текущего класса(https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html#brandProdName).
Конкретно по вопросу. Вы НЕ можете получить доступ к НЕ статическим членам класса, внутри статического контекста, как вариант, метода или блока. Используя ключевое слово this, вы подразумеваете, что обращаетесь к текущему объекту. А текущий объект не статичен. Нельзя из статичного метода addPrice обратиться к нестатичному объекту.
Подробнее о ключевом слове THIS читай здесь: https://javarush.com/groups/posts/608-kljuchevoe-slovo-this-v-primerakh
Подробнее о ключевом слове static читай здесь: https://javarush.com/groups/posts/800-10-zametok-o-modifikatore-static-v-java
С уважением,
Зеленая лягушка.
+9
DenisKa
13 января 2019, 20:10
Спасибо! да, про то что статические методы работают только со статическими переменными я понял. Но у меня жеж тут и метод статичен и переменная класса статична
public static class Apple {
public static int applesPrice = 0; // ПЕРЕМЕННАЯ СТАТИЧНА
public static void addPrice(int applesPrice) { // МЕТОД СТАТИЧЕН
this.applesPrice = this.applesPrice + applesPrice; // ИДЕЯ РУГАЕТСЯ НА СЛОВО THIS, ЕСЛИ УБРАТЬ СЛОВО STATIC У МЕТОДА, ТО ВСЁ РАБОТАЕТ ХОРОШО
}
}
0
Алексей Software Developer в АО СибКом
21 января 2019, 21:15
Mr.Zefirka, не сдавайся) Кажется Анри Пуанкаре говорил "Делай, а понимание придет потом"
0
Paulig
25 марта 2019, 10:49
Благодаря такому примеру всё ясно становится как происходит процесс внутри кода)
0
Иван Лаврентьев
22 июня 2018, 11:26
из того, что ты написал -
возвращает void, то есть пустоту, поэтому нельзя их складывать и тд 0
Иван Лаврентьев
22 июня 2018, 11:25
выложи полностью код + условие какое
0
Александр
22 июня 2018, 11:36
Да я собственно почти полностью выложил. Программа работает правильно, проверку прошла. Но понимания нет.
Цена яблок
Подсчитать суммарную стоимость яблок.
За суммарную стоимость яблок отвечает переменная public static int applesPrice.
Требования:
1. Программа должна выводить текст на экран.
2. Метод addPrice класса Apple не должен выводить текст на экран.
3. Переменная applesPrice класса Apple должна быть статической, иметь тип int и проинициализирована нулем.
4. Метод main должен вызывать метод addPrice только два раза.
5. Метод addPrice класса Apple должен увеличивать стоимость яблок на переданное значение.
0
Александр
22 июня 2018, 12:16
А какой результат выдает после выполнения?
0
Александр
22 июня 2018, 12:26
150
0
Александр
22 июня 2018, 14:31
Исходя из заданных условий это верный ответ.
В чем тогда проблема?
0
Александр
22 июня 2018, 15:45
Вопрос был озвучен.
0
Александр
22 июня 2018, 15:59
Почему не apple.adPrice + apple2.addPrice, например?
Метод adPrice являются void, то есть не возвращают значений, если он не возвращает результата то и плюсовать нечего.
Если бы метод выглядел так
public static int addPrice(int applesPrice) {
return applesPrice;
}
То значения можно сложить.
0
item
22 июня 2018, 16:02
Почему например не одно и то же имя принимает 2 разных значения? Почему не apple.adPrice + apple2.addPrice, например?
Почитай теорию про методы и классы.
addPrice - это метод, который принимает входящее значение int.
apple и apple2 два разных экземпляра класса Apple.
при вызове метода каждого из этих экземпляров ты передаешь значение, которое суммируется с предыдущим переданным значением и записывается в статическую переменную applesPrice.
+2