Юля Оболоша

Здравствуйте.

В уроке в последнем примере есть вызов класса: setSetSpeed(newSpeed); В классе setSetSpeed задана переменная int speed.

Я сначала думала, что раз setSetSpeed мы вызываем с newSpeed, то int speed должно стать равно newSpeed.

Но вы говорите, что setSetSpeed просто вызывается с newSpeed (newSpeed у нас 8) и переходите к showSpeed(), который выводит 3.

Вопрос 1: а в чем тогда смысл строчки setSetSpeed(newSpeed)? Она вроде как вызывает класс setSetSpeed, но никак не связана с его переменной int speed. Строчка setSetSpeed(newSpeed) значение на экран тоже не выводит.

Вопрос 2: если бы было setSetSpeed(10), то:

public void setSetSpeed (int speed);
    showSpeed(); 

... показал бы 10 или 3?

Скрин строчек, о которых идет речь

1 0

Добрый день.

Вопрос 1: а в чем тогда смысл строчки setSetSpeed(newSpeed)? Она вроде как вызывает класс setSetSpeed, но никак не связана с его переменной int speed. Строчка setSetSpeed(newSpeed) значение на экран тоже не выводит.

Из-за опечаток не уверен что правильно понял вопрос.

Строчка setSetSpeed(newSpeed) и не должна выводить на экран ничего. Это же не System.out.println().

Вопрос 2: если бы было setSetSpeed(10), то: ... показал бы 10 или 3?

Конечно десять. Ведь мы явно передаем в метод конкретное число. И выводим его на экран без каких либо манипуляций.

Тут нужно понимать где и какая память используется.

Эта тема не столь сложна как кажется. Просто нужно немного скрупулезности и неторопливости. Задавайте вопросы (только перечитывайте их). :)

Прочитайте весь текстовый материал под видео. Там подробно расписана эта часть кода из урока, с комментариями. И стоит внимательно пересмотреть лекцию с тайминга 08:01 -- там как раз про работу памяти JVM.

И этот пример с Car как раз демонстрирует то как работает стек и хип (куча). Для понимания где и какое значение переменной -- нужно представлять в какой части памяти эта переменная находится.

Стек хранит в себе фреймы методов. Условная "полочка" только для методов. Для работы метода в стеке выделяется своя область памяти, которая отделена от других методов. И, если что, любая программа начинается с main() метода. Но! Методы у нас не пустые и могут содержать в себе различные переменные или свои какие-то поля. И тут нужно внимание: эти самые переменные/поля тоже где-то хранить. Примитивного типа поля/переменные хранят данные прямо в фрейме метода. Ссылочного(не примитивы) типа переменные уже хранят данные в хипе (куче), а в фрейме метода находится просто ссылка на конкретный объект.

Каждый фрейм метода не видит переменные/поля внутри другого фрейма метода. По сути каждый метод видит только свои внутренние переменные. Аргументы метода -- тоже являются внутренними переменными этого метода.

Например:

public class Main {

    public static void main(String[] args) {
        int a = 10; // Эта хранится в стеке в фрейме метода main.
        Integer b = 999999999; // Эта храниться уже в хипе(куче). В самом фрейме метода 
                               // имеется лишь ссылка на объект.
    }
}

Методы одного и того же объекта видят одни и те же поля этого объекта. Напоминаю: поля объектов хранятся в куче(хипе). И методы могут с ними взаимодействовать. Поскольку у методов своя отдельная память -- то и переменные там свои, а не только уровня объекта. По этой причине мы можем иметь переменную/поле с идентичным именем на уровне объекта и на уровне метода, да хоть в каждом методе -- они не пересекаются. Правда для адекватной работы с переменными/полями объекта и метода, при совпадении их имен, нужно уже применять ключевое слово this перед именем переменной/поля для обозначения обращения к переменной/полю объекта, а не метода. Если же совпадают имена переменных в разных методах -- то это уже не важно в данном случае.

0

Похожие вопросы

Konstantin Valeev 03 ноября 2019 →

Как правильно компилировать код с кириллицей? У меня при компиляции возникает error: unmappable character f...

Egor Bulkov 23 июля 2019 →

Думал промолчу...Но после третьего просмотра ролика, все же решил оставить небольшой комментарий, для нович...

Владимир Плигин 19 июня 2019 →

Здравствуйте! В описании есть следующий абзац: Если метод статический, то его можна вызвать как через объек...

Viktor Podzirov 09 мая 2019 →

Здравствуйте. Ссылочная переменная это же по сути указатель как в си ? Когда мы создаем объект у нас созд...

Чингиз Жарас 25 декабря 2018 →

У метода main есть переменная this?

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →