public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat.name);
changeName(cat);
System.out.println(cat.name);
}
public static void changeName(Cat cat) {
cat.name = "Jerry";
}
public static class Cat {
String name = "Tom";
}
}
Вывод:
Tom
Jerry
Объясните как это работает?
public static void changeName(Cat cat) {
cat.name = "Jerry"; - понял что void значение не возвращает, но почему меняются местами значения "Jerry" и "Tom" на "Tom" и "Jerry" не понятно)
Олег
3 уровень
Почему меняется порядок значений
Решен
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Егор ГераськинExpert
5 февраля 2020, 14:10
Вопрос непонятен. Меняется значение поля name объекта cat. Оно выводится до и после изменения.
0
hidden #598481
5 февраля 2020, 14:06
Что именно непонятно?
Cat - это ссылочный тип данных, поэтому cat в методе main и локальный cat в методе changeName ссылаются на одну и ту же область памяти, на один и тот же объект. Метод меняет ему значение поля name, и ты видишь результат этого в main.
Метод void, потому что он ничего не возвращает, он просто выполняет возложенную функцию - изменяет определенным образом переданный в него объект.
+1
Олег
5 февраля 2020, 14:19
"Cat - это ссылочный тип данных, поэтому cat в методе main и локальный cat в методе changeName ссылаются на одну и ту же область памяти, на один и тот же объект." - этот момент уяснил.
"Метод меняет ему значение поля name, и ты видишь результат этого в main." - здесь не понял.
0
hidden #598481
5 февраля 2020, 14:21
Что не понял? Это команда
присваивает полю (переменной) name твоего кота cat значение "Jerry" 0
Олег
5 февраля 2020, 14:26
Почему в консоль выводит тогда не "Jerry Tom" а меняет их местами?
Команда с выводом "Jerry" должна выводиться в консоль первой/
0
hidden #598481
5 февраля 2020, 14:34
Это твой класс Cat. Тут написано, что у каждого объекта Cat изначально имя "Tom". Ты создал кота с именем Tom. Вывел его имя на экран. После этого выполнил метод changeName, в котором изменил имя своего кота на "Jerry". Вывел имя на экран.
Всегда выполняется только метод main(). Этот метод уже обращается к другим классам и методам, в каком порядке и где они написаны - роли не играет, они могут вообще в разных файлах быть. Команды в методе main выполняются по порядку, сверху вниз.
Первая команда Она обращается к классу Cat и создает новый объект этого класса. И кладет в переменную cat.
Ну и все остальное дальше по порядку, как я выше написал.
+2
Олег
5 февраля 2020, 14:46
Не сложились пазлы, буду дальше искать инфу, спасибо что попытались объяснить.
0
hidden #598481
5 февраля 2020, 14:48
Да какие пазлы? Лучше спроси еще раз, что непонятно.
0
Олег
5 февраля 2020, 15:19
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat.name);
changeName(cat); - объявляется переменная ей присваивается значение cat?
System.out.println(cat.name);
} для чего выводится дважды строка System.out.println(cat.name);?
public static void changeName(Cat cat) { - переменная changeName присваивается к
новому созданному объекту Cat cat?
cat.name = "Jerry"; - c помощью какой команды выводится на консоль?
Не могу связать порядок выполнения команд, с верху в низ, хаотично как то связываются они между собой у меня)
0
hidden #598481
5 февраля 2020, 15:38
Сосредоточься :)
Программа начинается с выполнения метода main и заканчивается вместе с ним.
Первая команда в этом методе
Эта команда делает три вещи:
1) Создает переменную под названием cat класса Cat.
2) Создает в памяти компьютера новый объект класса Cat
3) Ссылку на созданный объект кладет в созданную переменную.
Чтобы понять, каким должен создаться объект класса Cat в п.2 программа обращается к написанному классу Cat. Конструкторы ты пройдешь чуть позже, пока не забивай голову. Просто пойми, что программа проанализирует описание класса Cat и создаст нашего кота с полем name со значением "Tom"
С созданием объекта и первой строчкой в main разобрались. Дальше выполняется вторая строчка В ней мы обращаемся к полю name нашего свежесозданного кота и выводим его содержимое в консоль. Выводится строка "Tom", мы убедились, что создался объект с именем Том.
Дальше третья команда. Это вызов метода changeName с параметром cat. Метод - это как функция в алгебре. Допустим, у тебя есть функция с одним аргументом f(x) = 3*x + 5 и тебя просят посчитать чему равно значение этой функции в точке x = 4. Что ты делаешь? Ты подставляешь вместо x четверку и вычисляешь: f(4) = 3*4 + 5 = 17.
Здесь то же самое. У тебя есть функция (метод) changeName(Cat x), которая заключается в выполнении следующей команды: x.name = "Jerry". И третья строчка в main это вызов этого метода с параметром x = cat. Точно так же, как в алгебре мы писали f(4) здесь мы пишем changeName(cat)
Продолжение ниже +2
hidden #598481
5 февраля 2020, 15:50
Таким образом ты передал значение переменной твоей переменной cat из main (а в переменную, как ты помнишь, мы самой первой командой мы положили ссылку на созданного кота).
Поскольку мы вызвали метод changeName(), то твоя программа приступила к его выполнению. Когда выполнится метод changeName(), то выполнится и третья строка метода main.
Итак, в третьей строчке метод main вызвал метод changeName, значит выполняется первая команда вызванного метода:
Она меняет имя переданному коту на Jerry. Больше в этом методе команд нет, метод changeName завершается. Вместе с этим завершается и третья строчка метода main.
В main осталась последняя команда, которая снова выводит текущее значение поля name на экран. Поскольку значение изменилось, то теперь в консоль выводится слово Jerry.
Вместо резюме.
Вызов метода от имени переменной можно отличить по наличию скобок. Если есть скобки - значит это вызов метода. Даже если метод не принимает параметры, нужно написать пустые скобки после названия, чтобы вызвать его.
Методы похожи на алгебраические функции, только сложнее. Методы могут принимать сколько угодно параметров различных типов, и их выполнение заключается в выполнении всех команд, написанных в теле метода. Чтобы узнать, какие параметры принимает метод, надо посмотреть на заголовок метода: Тут сказано, что в метод надо передать один параметр класса Cat. И что этот параметр будет использоваться внутри метода под именем cat. +4
Олег
5 февраля 2020, 16:05
Теперь сложилась картинка, но тяжело) Спасибо!!!
0