Когда мы обсуждали пример с автомобилем, я упомянул, что каждый раз, когда новый объект автомобиля создается с помощью ключевого слова new, необходимо выделить объем памяти для хранения всей необходимой информации об объекте автомобиля.
Здесь диаграмма иллюстрирует информацию, необходимую для представления объекта Сar2.
Здесь есть конструктор, который мы определили для Сar2.
Когда объявляется переменная Сar2, будет выделен объем памяти для переменной carOfJohn.
И когда создается новый объект автомобиля carOfJohn с помощью оператора new, будет выделен объем памяти для всех переменных экземпляра, которые относятся к этому объекту.
Аналогичным образом, когда еще один экземпляр Сar2 создается, будет выделен объем памяти для переменной carOfMary.
Когда объект создается с помощью оператора new, отдельное пространство памяти затем будет выделено для объекта carOfMary.
Пространство памяти для локальных переменных называется стеком, и пространство памяти для переменных экземпляра выделяется из кучи.
Обратите внимание, что вместо того, чтобы указать значения в ячейках памяти для carOfJohn и carOfMary, я использую стрелки, чтобы указать что значения, устанавливаемые в ячейках, являются ссылочными адресами.
Позвольте мне объяснить, что это значит.
Когда мы обсуждаем примитивные типы, такие как целочисленные и дробные числа, мы используем почтовый ящик в качестве аналогии для пространства памяти, выделенного для переменных, которые объявлены с примитивным типом.
Например, если объявляется переменная с именем примитивного типа, почтовый ящик будет обозначен как это имя.
Когда переменная инициализируется с определенным значением, значение будет храниться в соответствующем ящике почты.
Такая схема выделения памяти работает, если тип имеет некоторые предопределенные размеры.
Что делать, если мы получаем большие посылки, которые не будут вписываться в почтовый ящик?
И вот что почтальон будет делать, когда посылка слишком большая, чтобы поместиться в почтовом ящике, он оставляет посылку в почтовой комнате, и оставляет записку в почтовом ящике с инструкциями о том, куда прийти за посылкой.
Таким образом, вместо того чтобы хранить информацию о переменных экземпляра вместе с примитивными типами, память, выделенная для ссылочных типов, будет хранить ссылочный адрес туда, где переменные экземпляра на самом деле находятся.
Я буду использовать таблицу, чтобы подвести итог обсуждения переменных класса, экземпляра и локальных переменных.
Локальные переменные объявляются внутри метода или конструктора.
Параметры, используемые в методе или конструкторе также локальные переменные.
Переменные класса и экземпляра объявляются внутри класса, но за пределами методов или конструкторов.
В случае переменных класса, используется ключевое слово static.
Локальные переменные объявляются, когда определяется метод. Они используются для хранения немедленных результатов, действуя как кратковременная память. И они будут уничтожены после выхода из метода.
Отдельная копия переменных экземпляра создается для каждого объекта, когда используется ключевое слово new.
Java будет освобождать память посредством процесса, называемого сбором мусора, когда больше не используется ссылка на этот объект.
Только один единственный экземпляр статической переменной создается для класса без необходимости создания экземпляра объекта. Они существуют с начала и до конца программы.
В таблице есть некоторые примеры различных типов переменных, которые могут быть использованы для автомобиля.
Мы указали в примере, что gasUsed это локальная переменная для движения вперед, и не может быть использована в другом методе, таком как addGas.
Здесь же некоторые из переменных экземпляра.
Мы можем объявить статическую переменную, NUMOFWHEEL, чтобы указать, что все автомобили имеют четыре колеса.
Она также объявлена как финальная, которая является постоянной.
Отметим также, что часто используются все заглавные буквы для именования констант.
Как уже говорилось ранее, все локальные переменные должны быть инициализированы, прежде чем они на самом деле могут быть использованы, в противном случае это приведет к ошибке компиляции.
Java обеспечивает значения по умолчанию для переменных экземпляра и переменных класса.
Все типы переменных следуют правилам видимости, которые мы только что обсудили.
Поскольку локальные переменные имеют смысл только в рамках методов, где они объявлены, модификаторы доступа не могут быть использованы для локальных переменных.
Переменные экземпляра часто объявляются как private для того, чтобы защитить их от случайного изменения.
И переменные класса часто объявляются как константы.
Что будет на выходе этой программы?
Ответ:
One: 7,5,10
Two: 4,5,5
Main: 5,4,5
Давайте теперь перейдем к новой теме.
Когда мы обсуждали выражения, я упомянул, что существует два типа выражений, а именно арифметические выражения и логические выражения.
Логические выражения аналогичны арифметическим выражением, за исключением того, что булевы (логические) типы объявляются с помощью ключевого слова Boolean.
Название Boolean используется, потому что булева логика была введена в 1950 Джорджем Булем, английским математиком.
Булевы переменные имеют только два возможных значения, истина или ложь.
При этом арифметические операторы заменяются операторами отношения или условными операторами.
Прежде чем обсуждать операторы отношения или условные операторы, давайте сначала посмотрим на то, как логические выражения могут использоваться в примерах, которые мы обсуждали ранее.
В классе автомобиля, например, мы можем захотеть проверить, пуст ли топливный бак.
Выражение, gasInTank == 0 дает true, если значение gasInTank равно 0, и false в другом случае.
В примере courseGrade будет полезно проверить, чтобы вводимые баллы были в пределах диапазона.
Выражение examScore <= 100 дает true, если значение examScore меньше, чем 100, и false в другом случае.
Если мы хотим проверить как верхний диапазон, так и нижний диапазон, выражение, которое соединяет два логические выражения, использует условный оператор && (и), и возвращает true, если examScore находится в диапазоне от 0 до 100, и false в противном случае.
Обратите внимание, что для того чтобы протестировать значение examScore между 0 и 100, в математике мы можем использовать математическое выражение 0 < examScore < 100, но это незаконно в Java.
Я поговорю больше о синтаксисе, используя эти условные операторы.
Вот список из операторов отношений.
Оператор «<» – это меньше чем.
Выражение «2 < 3» будет оцениваться как true.
Оператор «<=» – это меньше или равно.
Обратите внимание, что касается вопроса порядка, Java не признает оператор «=<».
Выражение «2 <= 3» будет оцениваться как true.
Аналогичным образом, мы имеем операторы «>» и «>=».
Выражения «2 > 3», и «2 >= 3» оба дают ложь.
Оператор равенства состоит из двух последовательных знаков равенства.
Помните, что, если есть только один знак равенства, вы имеете в виду оператор присваивания, а не логический оператор равенства.
И наконец, восклицательный знак вместе со знаком равенства, это оператор не равенства.
Выражение «2 != 3» дает true.
Помните, что восклицательный знак не нужно путать с вертикальной чертой.
Мы можем использовать условные операторы или логические операторы для соединения нескольких логических выражений.
Это три логических операторов: логическое НЕТ, которое представлено восклицательным знаком, логическое И, представленное символами амперсанда &&, и логическое ИЛИ, представленное двумя вертикальными линиями.
Значения в приведенных примерах в последнем столбце могут быть определены по таблицам истинности, которые мы будем обсуждать далее.
Таблица истинности является математической таблицей, которая используется в логике, чтобы вычислять значения логических выражений.
Вот таблица истинности для логического оператора НЕТ.
Логический оператор НЕТ делает реверс истинному значению логических выражений, ложь станет правдой, и правда станет ложью.
Вот таблица истинности для логического И.
Учитывая два логические выражения, P и Q, логическое И между Р и Q будет возвращать истину, если оба верны, иначе результат будет ложью.
В качестве примера, мы уже видели условия для определения, будет ли examScore находиться в диапазоне.
Вот таблица истинности для логического ИЛИ.
Учитывая два логические выражения, P и Q, логическое ИЛИ между Р и Q будет возвращать ложь, только если оба ложны.
В противном случае результат будет true.
Мы уже рассматривали приоритеты операторов, когда мы обсуждали арифметические выражений.
Теперь, когда у нас есть дополнительные операторы отношения и логические операторы, вот обновленный список приоритетов операторов.
И обратите внимание, что операции отношения выполняются после умножения, деления и вычитание, но прежде, чем логические операторы.