HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>Внимание. В слайде была ошибка.</strong>time: 01</p>
1 <p><strong>Внимание. В слайде была ошибка.</strong>time: 01</p>
2 <p>в классе Main метод main должен быть void, а не voind.</p>
2 <p>в классе Main метод main должен быть void, а не voind.</p>
3 <blockquote><p>В этом уроке много базовых терминов. Их нужно знать как алфавит. Вам придется неоднократно возвращаться и повторять этот материал - это нормально. :)</p>
3 <blockquote><p>В этом уроке много базовых терминов. Их нужно знать как алфавит. Вам придется неоднократно возвращаться и повторять этот материал - это нормально. :)</p>
4 </blockquote><p><em><strong>Java Virtual Machine (JVM)</strong></em>- это программная система, в которой исполняются java-программы. Для java-программ JVM является реальной, а не виртуальной вычислительной машиной. А вот уже JVM написана под различные платформы и операционные системы.</p>
4 </blockquote><p><em><strong>Java Virtual Machine (JVM)</strong></em>- это программная система, в которой исполняются java-программы. Для java-программ JVM является реальной, а не виртуальной вычислительной машиной. А вот уже JVM написана под различные платформы и операционные системы.</p>
5 <p><em><strong>blueprint</strong></em>- буквально это "фотографическая копия раннего плана здания или машины". Выполняется на бумаге синего (голубого) цвета. В рамках программирования это тоже чертеж, на основании которого будет создан объект. Только этот чертеж состоит не из линий на чертежной доске, а из строк кода, которые задают свойства и возможности будущих объектов.</p>
5 <p><em><strong>blueprint</strong></em>- буквально это "фотографическая копия раннего плана здания или машины". Выполняется на бумаге синего (голубого) цвета. В рамках программирования это тоже чертеж, на основании которого будет создан объект. Только этот чертеж состоит не из линий на чертежной доске, а из строк кода, которые задают свойства и возможности будущих объектов.</p>
6 <p><em><strong>класс</strong></em>- это тот самый<em>blueprint</em>в мире java, по которому будут создаваться объекты. Класс состоит из кода, который хранится в соответствующем файле.</p>
6 <p><em><strong>класс</strong></em>- это тот самый<em>blueprint</em>в мире java, по которому будут создаваться объекты. Класс состоит из кода, который хранится в соответствующем файле.</p>
7 <p>Вот пример кода класса Human, который должен обязательно находится в файле Human.java:</p>
7 <p>Вот пример кода класса Human, который должен обязательно находится в файле Human.java:</p>
8 <p>На основе этих строк будут создаваться объекты.</p>
8 <p>На основе этих строк будут создаваться объекты.</p>
9 <p><em><strong>члены класса</strong></em>- это основные элементы, которые может содержать в себе класс. Ими являются<strong>переменные (поля)</strong>и<strong>методы</strong>.</p>
9 <p><em><strong>члены класса</strong></em>- это основные элементы, которые может содержать в себе класс. Ими являются<strong>переменные (поля)</strong>и<strong>методы</strong>.</p>
10 <p><em><strong>экземпляр, объект, instance</strong></em>- это сущность созданная на основе класса. Так же как и деталь на токарном станке создается на основе чертежа или человек "создается" на основе ДНК. Например, объект класса Object создается так: new Object(). А объект класса Human - new Human(). В мире java все является объектом.</p>
10 <p><em><strong>экземпляр, объект, instance</strong></em>- это сущность созданная на основе класса. Так же как и деталь на токарном станке создается на основе чертежа или человек "создается" на основе ДНК. Например, объект класса Object создается так: new Object(). А объект класса Human - new Human(). В мире java все является объектом.</p>
11 <p><em><strong>оператор new</strong></em>выделяет место в памяти JVM под объект.</p>
11 <p><em><strong>оператор new</strong></em>выделяет место в памяти JVM под объект.</p>
12 <p><em><strong>идентификатор</strong></em>(<a>ссылка на документацию</a>) - это, по сути, имя. Такое же, как и у людей, мест, объектов во всем мире. Но в документации java применяется термин "identifier". Потому что он позволяет идентифицировать конкретную сущность в мире java. В java идентификатор используется для<strong>переменных</strong>,<strong>методов</strong>,<strong>классов</strong>. Например, Object, String, Human, SomeClassName - это примеры идентификаторов (имен) классов. Имена классов<strong>всегда</strong>пишутся с большой буквы в<a>camelStyle</a>. Имена методов мы разберем в отдельном уроке. А имена переменных - в этом.</p>
12 <p><em><strong>идентификатор</strong></em>(<a>ссылка на документацию</a>) - это, по сути, имя. Такое же, как и у людей, мест, объектов во всем мире. Но в документации java применяется термин "identifier". Потому что он позволяет идентифицировать конкретную сущность в мире java. В java идентификатор используется для<strong>переменных</strong>,<strong>методов</strong>,<strong>классов</strong>. Например, Object, String, Human, SomeClassName - это примеры идентификаторов (имен) классов. Имена классов<strong>всегда</strong>пишутся с большой буквы в<a>camelStyle</a>. Имена методов мы разберем в отдельном уроке. А имена переменных - в этом.</p>
13 <p><em><strong>метод</strong></em>- это член класса в котором описывается логика (последовательность действий) над данными. О методах мы поговорим в других уроках.</p>
13 <p><em><strong>метод</strong></em>- это член класса в котором описывается логика (последовательность действий) над данными. О методах мы поговорим в других уроках.</p>
14 <p><em><strong>reference, ссылка, переменная</strong></em>- это идентификатор (имя), с заданным типом, который может указывать на конкретный объект в оперативной памяти или на значение примитива. Ссылку часто называют<strong>переменной</strong>, но это не всегда соответствует ее свойствам. Важно понимать, что любая переменная предназначена для хранения адреса в памяти на конкретный объект или значение примитива, потому - ссылка на что-то. Правила именования ссылок будут даны ниже. При объявлении ссылки, естественно, нужно указать ее тип и имя. Например, так: Object myObject. Здесь Object - это тип, который сможет хранить в себе данная ссылка. myObject - это имя. Но эта ссылка, пока что, указывает в никуда, в null. Ей нужно присвоить объект - инициализировать.</p>
14 <p><em><strong>reference, ссылка, переменная</strong></em>- это идентификатор (имя), с заданным типом, который может указывать на конкретный объект в оперативной памяти или на значение примитива. Ссылку часто называют<strong>переменной</strong>, но это не всегда соответствует ее свойствам. Важно понимать, что любая переменная предназначена для хранения адреса в памяти на конкретный объект или значение примитива, потому - ссылка на что-то. Правила именования ссылок будут даны ниже. При объявлении ссылки, естественно, нужно указать ее тип и имя. Например, так: Object myObject. Здесь Object - это тип, который сможет хранить в себе данная ссылка. myObject - это имя. Но эта ссылка, пока что, указывает в никуда, в null. Ей нужно присвоить объект - инициализировать.</p>
15 <blockquote><p>null - это специальное ключевое слово, которое означает буквально "ничто".</p>
15 <blockquote><p>null - это специальное ключевое слово, которое означает буквально "ничто".</p>
16 </blockquote><p><em><strong>инициализация переменной</strong></em>- это присвоение ссылке адреса конкретного объекта. Делается это с помощью знака равно "=". В java это оператор присваивания. Запишем объявление ссылки, ее инициализацию и создание объекта в одну строчку: Object otherObject = new Object();.</p>
16 </blockquote><p><em><strong>инициализация переменной</strong></em>- это присвоение ссылке адреса конкретного объекта. Делается это с помощью знака равно "=". В java это оператор присваивания. Запишем объявление ссылки, ее инициализацию и создание объекта в одну строчку: Object otherObject = new Object();.</p>
17 <blockquote><p>На один и тот же объект могут ссылаться несколько ссылок:</p>
17 <blockquote><p>На один и тот же объект могут ссылаться несколько ссылок:</p>
18 <p>В данном кусочке кода создан один объект типа Human и присвоен трем ссылкам (передан его адрес в памяти по цепочке). А вот если написать напротив каждой ссылки new Human() - то у каждой ссылки будет свой объект.</p>
18 <p>В данном кусочке кода создан один объект типа Human и присвоен трем ссылкам (передан его адрес в памяти по цепочке). А вот если написать напротив каждой ссылки new Human() - то у каждой ссылки будет свой объект.</p>
19 <p><em><strong>У одной ссылки (идентификатора) - может быть только один объект!</strong></em></p>
19 <p><em><strong>У одной ссылки (идентификатора) - может быть только один объект!</strong></em></p>
20 </blockquote><p><em><strong>блок кода</strong></em>- это часть кода, заключенная в фигурные скобки: {}. { - открывает блок кода. } - закрывает блок кода. Класс, метод, цикл, условный оператор - имеют свои блоки кода. Блок кода каждого из них, для простоты, называют телами. Методы, циклы, условные операторы - мы рассмотрим в других уроках. А сейчас давайте просто посмотрим на их тела в таком примере:</p>
20 </blockquote><p><em><strong>блок кода</strong></em>- это часть кода, заключенная в фигурные скобки: {}. { - открывает блок кода. } - закрывает блок кода. Класс, метод, цикл, условный оператор - имеют свои блоки кода. Блок кода каждого из них, для простоты, называют телами. Методы, циклы, условные операторы - мы рассмотрим в других уроках. А сейчас давайте просто посмотрим на их тела в таком примере:</p>
21 <p>Переменные (ссылки),<a>согласно документации</a>, делятся на такие типы:</p>
21 <p>Переменные (ссылки),<a>согласно документации</a>, делятся на такие типы:</p>
22 <ul><li><strong>Поля класса.</strong>Это ссылки, которые объявлены в теле класса. Если взять в пример класс Human, то его полями будут name и age. В классе Computer это будет поле с именем foo. Объявление и инициализация поля класса не может быть разбито на две строки в рамках тела класса! Например, нельзя написать так:</li>
22 <ul><li><strong>Поля класса.</strong>Это ссылки, которые объявлены в теле класса. Если взять в пример класс Human, то его полями будут name и age. В классе Computer это будет поле с именем foo. Объявление и инициализация поля класса не может быть разбито на две строки в рамках тела класса! Например, нельзя написать так:</li>
23 </ul><p>Но можно вынести инициализацию в другой блок кода так:</p>
23 </ul><p>Но можно вынести инициализацию в другой блок кода так:</p>
24 <p>Где, как и когда инициализировать поля класса - зависит от условий задачи, которую Вы решаете.</p>
24 <p>Где, как и когда инициализировать поля класса - зависит от условий задачи, которую Вы решаете.</p>
25 <ul><li><strong>Локальные переменные.</strong>Это ссылки, которые объявлены в любом блоке кода, который вложен в тело класса. Если рассмотреть класс Computer, то в нем локальной переменной будет result, поскольку эта ссылка объявлена внутри тела метода computeSumm.</li>
25 <ul><li><strong>Локальные переменные.</strong>Это ссылки, которые объявлены в любом блоке кода, который вложен в тело класса. Если рассмотреть класс Computer, то в нем локальной переменной будет result, поскольку эта ссылка объявлена внутри тела метода computeSumm.</li>
26 <li><strong>Параметры.</strong>Это ссылки, задающие начальное состояние блока кода. Например, у метода computeSumm есть свой параметр incomeArray, который имеет тип int[]. Параметры метода еще называют "аргументы метода". А вот number уже является параметром цикла for.</li>
26 <li><strong>Параметры.</strong>Это ссылки, задающие начальное состояние блока кода. Например, у метода computeSumm есть свой параметр incomeArray, который имеет тип int[]. Параметры метода еще называют "аргументы метода". А вот number уже является параметром цикла for.</li>
27 </ul><blockquote><p>Любая переменная - это просто ссылка на конкретный объект или значение (примитив) в памяти компьютера.</p>
27 </ul><blockquote><p>Любая переменная - это просто ссылка на конкретный объект или значение (примитив) в памяти компьютера.</p>
28 </blockquote><p><em><strong>область видимости</strong></em>- это границы, в которых доступны переменные для членов класса. Каждый блок кода видит переменные внешнего блока кода, но не видит содержимое внутренних блоков кода. Например, ссылка foo объявлена в теле класса Computer - она видна любым другим членам текущего класса и вложенным друг в друга блокам кода. То есть мы можем печатать переменную foo не только в методе printFoo, но и в методе computeSumm или даже в цикле for. А вот переменная (параметр метода computeSumm) incomeArray - видна только в рамках тела этого метода. Это значит, что класс Computer не знает о существовании incomeArray. И метод printFoo, соответственно, тоже не знает о существовании переменной incomeArray. Зато все вложенные в метод computeSumm блоки кода (циклы, условные операторы и все, что мы туда засунем) могут обращаться к incomeArray и использовать эту переменную. Аналогичной по видимости incomeArray является переменная result. А переменная number видна только в рамках тела цикла for.</p>
28 </blockquote><p><em><strong>область видимости</strong></em>- это границы, в которых доступны переменные для членов класса. Каждый блок кода видит переменные внешнего блока кода, но не видит содержимое внутренних блоков кода. Например, ссылка foo объявлена в теле класса Computer - она видна любым другим членам текущего класса и вложенным друг в друга блокам кода. То есть мы можем печатать переменную foo не только в методе printFoo, но и в методе computeSumm или даже в цикле for. А вот переменная (параметр метода computeSumm) incomeArray - видна только в рамках тела этого метода. Это значит, что класс Computer не знает о существовании incomeArray. И метод printFoo, соответственно, тоже не знает о существовании переменной incomeArray. Зато все вложенные в метод computeSumm блоки кода (циклы, условные операторы и все, что мы туда засунем) могут обращаться к incomeArray и использовать эту переменную. Аналогичной по видимости incomeArray является переменная result. А переменная number видна только в рамках тела цикла for.</p>
29 <h2>Правила именования ссылок переменных</h2>
29 <h2>Правила именования ссылок переменных</h2>
30 <ol><li>имя ссылки всегда пишется с маленькой буквы;</li>
30 <ol><li>имя ссылки всегда пишется с маленькой буквы;</li>
31 <li>в<a>верблюжем стиле</a>и слитно, если более одного слова в имени ссылки, например, theAdam;</li>
31 <li>в<a>верблюжем стиле</a>и слитно, если более одного слова в имени ссылки, например, theAdam;</li>
32 <li>константы пишутся в теле класса и ПОЛНОСТЬЮ_ЗАГЛАВНЫМИ_БУКВАМИ с подчеркиванием между словами, например: double NUMBER_PI = 3,14;</li>
32 <li>константы пишутся в теле класса и ПОЛНОСТЬЮ_ЗАГЛАВНЫМИ_БУКВАМИ с подчеркиванием между словами, например: double NUMBER_PI = 3,14;</li>
33 <li>имена переменных могут начинаться с: a - z, _, $;</li>
33 <li>имена переменных могут начинаться с: a - z, _, $;</li>
34 <li>имена не могут начинаться с любого числа или точки;</li>
34 <li>имена не могут начинаться с любого числа или точки;</li>
35 <li>имена не могут содержать в себе #, :, / и прочих символов, но могут содержать числа (не в начале!);</li>
35 <li>имена не могут содержать в себе #, :, / и прочих символов, но могут содержать числа (не в начале!);</li>
36 <li>имена не могут состоять<strong>только</strong>из ключевого слова синтаксиса java или литерала; например, нельзя объявить int new;, но можно объявить int newCounter;; нельзя объявить String true;, но можно объявить String someTrueString;;</li>
36 <li>имена не могут состоять<strong>только</strong>из ключевого слова синтаксиса java или литерала; например, нельзя объявить int new;, но можно объявить int newCounter;; нельзя объявить String true;, но можно объявить String someTrueString;;</li>
37 <li>в теле одного блока кода не может быть полей с одинаковыми идентификаторами (именами)! Это значит, что если мы уже объявили в теле класса Computer поле String foo, то второй раз уже не нужно писать String foo в теле этого класса. Но зная об<em><strong>области видимости</strong></em>мы смело можем объявить еще один раз String foo, например, в рамках тела метода. Попробуйте это прямо сейчас в коде. Экспериментируйте и внимательно изучайте вывод компилятора - он дает много подсказок об ошибках в коде.</li>
37 <li>в теле одного блока кода не может быть полей с одинаковыми идентификаторами (именами)! Это значит, что если мы уже объявили в теле класса Computer поле String foo, то второй раз уже не нужно писать String foo в теле этого класса. Но зная об<em><strong>области видимости</strong></em>мы смело можем объявить еще один раз String foo, например, в рамках тела метода. Попробуйте это прямо сейчас в коде. Экспериментируйте и внимательно изучайте вывод компилятора - он дает много подсказок об ошибках в коде.</li>
38 </ol><p><a>Ссылка на перечень ключевых слов в документации</a>. Ознакомьтесь с ними.</p>
38 </ol><p><a>Ссылка на перечень ключевых слов в документации</a>. Ознакомьтесь с ними.</p>
39 <p><a>Ссылка на перечень разновидностей литералов</a>. Для начала, проще запомнить эти литералы, которые нельзя использовать как готовые имена: true, false, null.</p>
39 <p><a>Ссылка на перечень разновидностей литералов</a>. Для начала, проще запомнить эти литералы, которые нельзя использовать как готовые имена: true, false, null.</p>
40 <h2>Использование объектов</h2>
40 <h2>Использование объектов</h2>
41 <blockquote><p>Объект можно создать только из ссылочного типа бесконечное количество раз (в пределах возможностей компьютера). Примитивные типы просто имеют уже конечный перечень значений, которые мы можем использовать, а создавать объекты на их основе примитивов - невозможно. Но есть "обертки" над примитивами, из которых можно создавать объекты. Обертки являются ссылочными типами данных (см. предыдущий урок).</p>
41 <blockquote><p>Объект можно создать только из ссылочного типа бесконечное количество раз (в пределах возможностей компьютера). Примитивные типы просто имеют уже конечный перечень значений, которые мы можем использовать, а создавать объекты на их основе примитивов - невозможно. Но есть "обертки" над примитивами, из которых можно создавать объекты. Обертки являются ссылочными типами данных (см. предыдущий урок).</p>
42 </blockquote><p>Для начала рассмотрим пример создания объектов на основе класса Human. Изучите код:</p>
42 </blockquote><p>Для начала рассмотрим пример создания объектов на основе класса Human. Изучите код:</p>
43 <blockquote><p>Экспериментируйте с этим кодом. Покрутите его в IDEA. Только ж не забудьте еще написать класс Human. ;)</p>
43 <blockquote><p>Экспериментируйте с этим кодом. Покрутите его в IDEA. Только ж не забудьте еще написать класс Human. ;)</p>
44 </blockquote><p><em><strong>использование объекта</strong></em>- это любая форма взаимодействия с объектом. Например, обращение к его членам или передача объекта в качестве параметра (аргумента) метода.</p>
44 </blockquote><p><em><strong>использование объекта</strong></em>- это любая форма взаимодействия с объектом. Например, обращение к его членам или передача объекта в качестве параметра (аргумента) метода.</p>
45 <p>Для обращения к объекту,<em><strong>почти всегда</strong></em>, необходимо имя его ссылки. Например, для обращения к одному из двух объектов класса Human нам нужно написать theAdam или theEve. А дальше мы можем получить доступ к членам этих объектов.</p>
45 <p>Для обращения к объекту,<em><strong>почти всегда</strong></em>, необходимо имя его ссылки. Например, для обращения к одному из двух объектов класса Human нам нужно написать theAdam или theEve. А дальше мы можем получить доступ к членам этих объектов.</p>
46 <p><em><strong>доступ к членам объектов</strong></em>осуществляется посредством обычной точки ".". Точка говорит: "Раскрыть этот объект!". А за точкой нужно указать идентификатор нужного нам члена объекта.</p>
46 <p><em><strong>доступ к членам объектов</strong></em>осуществляется посредством обычной точки ".". Точка говорит: "Раскрыть этот объект!". А за точкой нужно указать идентификатор нужного нам члена объекта.</p>
47 <p>Например, обратимся к полю name объекта theAdam и назначим ему нормальное имя: theAdam.name = "Adam";. Так же можно поменять имя и для theEve: theEve.name = "Eve";. Рассмотрим это чуть ниже в примерах.</p>
47 <p>Например, обратимся к полю name объекта theAdam и назначим ему нормальное имя: theAdam.name = "Adam";. Так же можно поменять имя и для theEve: theEve.name = "Eve";. Рассмотрим это чуть ниже в примерах.</p>
48 <p>Обратите внимание, что поле name ссылается на конкретные объекты класса String. А это значит, что мы можем получить доступ к членам и этого объекта! Например так: theAdam.name.length(). Рассмотрим это в коде:</p>
48 <p>Обратите внимание, что поле name ссылается на конкретные объекты класса String. А это значит, что мы можем получить доступ к членам и этого объекта! Например так: theAdam.name.length(). Рассмотрим это в коде:</p>
49 <p>Рассмотрим инициализацию переменной lengthOfName:</p>
49 <p>Рассмотрим инициализацию переменной lengthOfName:</p>
50 <ol><li>обращаемся к объекту переменной theAdam;</li>
50 <ol><li>обращаемся к объекту переменной theAdam;</li>
51 <li>"раскрыли" его точкой;</li>
51 <li>"раскрыли" его точкой;</li>
52 <li>обращаемся к полю name, который по сути есть ссылка на объект класса String;</li>
52 <li>обращаемся к полю name, который по сути есть ссылка на объект класса String;</li>
53 <li>"раскрыли" его точкой;</li>
53 <li>"раскрыли" его точкой;</li>
54 <li>а у любого объекта класса String есть метод length(), к которому мы и обратились; он вернет число символов в текущем объекте;</li>
54 <li>а у любого объекта класса String есть метод length(), к которому мы и обратились; он вернет число символов в текущем объекте;</li>
55 <li>записываем результат работы нашей цепочки вызовов в локальную переменную lengthOfName.</li>
55 <li>записываем результат работы нашей цепочки вызовов в локальную переменную lengthOfName.</li>
56 </ol><p>Для обращения к объекту<em><strong>не всегда</strong></em>необходимо использовать имя его ссылки. Например, мы можем создать объект и тут же передать его в какой-то метод, при этом не сохраняя адрес этого объекта в коде: System.out.println(new Human()). И к его членам мы тоже можем обратиться. Рассмотрим в коде:</p>
56 </ol><p>Для обращения к объекту<em><strong>не всегда</strong></em>необходимо использовать имя его ссылки. Например, мы можем создать объект и тут же передать его в какой-то метод, при этом не сохраняя адрес этого объекта в коде: System.out.println(new Human()). И к его членам мы тоже можем обратиться. Рассмотрим в коде:</p>
57 <p>Как видно из этого примера, мы создали несколько объектов и ни одной ссылки на них. Так стоит поступать только и только тогда, когда мы точно знаем, что не станем повторно использовать один и тот же объект.</p>
57 <p>Как видно из этого примера, мы создали несколько объектов и ни одной ссылки на них. Так стоит поступать только и только тогда, когда мы точно знаем, что не станем повторно использовать один и тот же объект.</p>
58 <p>Что такое Human@1b6d3586 - это то, как JVM видит внутри себя конкретный объект класса Human. У каждого нового объекта будет свой адрес в памяти JVM на подобии Human@1b6d3586.</p>
58 <p>Что такое Human@1b6d3586 - это то, как JVM видит внутри себя конкретный объект класса Human. У каждого нового объекта будет свой адрес в памяти JVM на подобии Human@1b6d3586.</p>
59 <p>В данном случае, у каждого нового объекта класса Human всегда поле name будет содержать "Oldman", а age - 99. Потому что изначально в классе были "зашиты" эти параметры, для удобства примеров кода. В рабочем коде предопределять значения рекомендуется только КОНСТАНТАМ.</p>
59 <p>В данном случае, у каждого нового объекта класса Human всегда поле name будет содержать "Oldman", а age - 99. Потому что изначально в классе были "зашиты" эти параметры, для удобства примеров кода. В рабочем коде предопределять значения рекомендуется только КОНСТАНТАМ.</p>
60 <ul><li>дизайн класса (design) - предварительная проектировка, до написания кода. Например, в UML-диаграмме;</li>
60 <ul><li>дизайн класса (design) - предварительная проектировка, до написания кода. Например, в UML-диаграмме;</li>
61 </ul><p>Предварительное описание классов и его членов - является хорошей практикой!</p>
61 </ul><p>Предварительное описание классов и его членов - является хорошей практикой!</p>
62 <ul><li>имплементация класса (реализация класса в редакторе) - описываем класс в виде кода в файле с расширением *.java;</li>
62 <ul><li>имплементация класса (реализация класса в редакторе) - описываем класс в виде кода в файле с расширением *.java;</li>
63 </ul><ul><li>использование класса - это создание объекта на его основе.</li>
63 </ul><ul><li>использование класса - это создание объекта на его основе.</li>
64 </ul><h2>Жизненный цикл instances (<strong>объектов</strong>) класса</h2>
64 </ul><h2>Жизненный цикл instances (<strong>объектов</strong>) класса</h2>
65 <ul><li>Создание (creation) в памяти нового instance, реального объекта, который создается на базе класса, например, так: new Human(). Но лучше сразу объявить ссылку и передать ей этот объект: Human human = new Human();.</li>
65 <ul><li>Создание (creation) в памяти нового instance, реального объекта, который создается на базе класса, например, так: new Human(). Но лучше сразу объявить ссылку и передать ей этот объект: Human human = new Human();.</li>
66 <li>Жизнь (living)/использование instance. Любые манипуляции с объектом, например, human.age = 12; или System.out.println(human.age);.</li>
66 <li>Жизнь (living)/использование instance. Любые манипуляции с объектом, например, human.age = 12; или System.out.println(human.age);.</li>
67 </ul><blockquote><p>Доступ к полям объекта осуществляется через точку. Точка раскрывает объект и позволят добраться к полям этого объекта.</p>
67 </ul><blockquote><p>Доступ к полям объекта осуществляется через точку. Точка раскрывает объект и позволят добраться к полям этого объекта.</p>
68 </blockquote><ul><li>releasing (освобождать, отпускать, сбрасывать) - отвязываем текущий объект от ссылки, например, так human = null; или так human = new Human();. Суть в том, что ссылка human больше не ссылается на тот же объект;</li>
68 </blockquote><ul><li>releasing (освобождать, отпускать, сбрасывать) - отвязываем текущий объект от ссылки, например, так human = null; или так human = new Human();. Суть в том, что ссылка human больше не ссылается на тот же объект;</li>
69 <li>уничтожение (removing) - объект удаляется из памяти мусорщиком, если на него не ссылается ни одной ссылки в текущей программе.</li>
69 <li>уничтожение (removing) - объект удаляется из памяти мусорщиком, если на него не ссылается ни одной ссылки в текущей программе.</li>
70 </ul><p><em>Итак, у класса есть три этапа жизненного цикла: design, implementation, usage. А у объектов их четыре: creation, living, releasing, removing.</em></p>
70 </ul><p><em>Итак, у класса есть три этапа жизненного цикла: design, implementation, usage. А у объектов их четыре: creation, living, releasing, removing.</em></p>
71 <h2>Память и объекты</h2>
71 <h2>Память и объекты</h2>
72 <blockquote><p><em>Мы еще будем детально рассматривать stack и heap в грядущих уроках про методы. А пока взглянем на это в общих чертах для общего понимания. Ведь объекты эти существуют не в вакууме.</em></p>
72 <blockquote><p><em>Мы еще будем детально рассматривать stack и heap в грядущих уроках про методы. А пока взглянем на это в общих чертах для общего понимания. Ведь объекты эти существуют не в вакууме.</em></p>
73 </blockquote><p>JVM разделяет свою память на stack &amp; heap(куча). Стек служит для обеспечения работы методов. У каждой программы, у каждого потока свой стек. В стеке создаются фреймы вызываемых методов. А куча служит для хранения и доступа к объектам (одна куча на всю программу). Для простоты понимания:</p>
73 </blockquote><p>JVM разделяет свою память на stack &amp; heap(куча). Стек служит для обеспечения работы методов. У каждой программы, у каждого потока свой стек. В стеке создаются фреймы вызываемых методов. А куча служит для хранения и доступа к объектам (одна куча на всю программу). Для простоты понимания:</p>
74 <ul><li>Стек удобно рассматривать как стопку монет, в которой каждая монета - это запущенный метод. Так называемый "фрейм метода". Пока не отработает верхняя монета - остальные недоступны. Работает стек по принципу<a>LIFO</a>. Повторюсь: детальнее рассмотрим это в другом уроке.</li>
74 <ul><li>Стек удобно рассматривать как стопку монет, в которой каждая монета - это запущенный метод. Так называемый "фрейм метода". Пока не отработает верхняя монета - остальные недоступны. Работает стек по принципу<a>LIFO</a>. Повторюсь: детальнее рассмотрим это в другом уроке.</li>
75 <li>Куча хоть и говорящее название, но эту область памяти JVM лучше воспринимать как библиотеку или склад, в которой каждая книжка имеет свой адрес.</li>
75 <li>Куча хоть и говорящее название, но эту область памяти JVM лучше воспринимать как библиотеку или склад, в которой каждая книжка имеет свой адрес.</li>
76 </ul><p>Примитивы хранятся как в стеке, так и в хипе. Это зависит от места их объявления: в методе или на уровне класса. А объекты ссылочных типов хранятся только в хипе.</p>
76 </ul><p>Примитивы хранятся как в стеке, так и в хипе. Это зависит от места их объявления: в методе или на уровне класса. А объекты ссылочных типов хранятся только в хипе.</p>
77 <p>Рассмотрим такой пример:</p>
77 <p>Рассмотрим такой пример:</p>
78 <p>someNumber - эта ссылка находится в фрейме метода main, а фрейм в стеке. И память под значение 999999 тоже выделена в стеке, в фрейме текущего метода.</p>
78 <p>someNumber - эта ссылка находится в фрейме метода main, а фрейм в стеке. И память под значение 999999 тоже выделена в стеке, в фрейме текущего метода.</p>
79 <p>human - эта ссылка находится в стеке метода main. О стеке методов, повторюсь, мы узнаем больше в следующих уроках. И указывает human на адрес в хипе, где находится экземпляр (инстанс) класса Human.</p>
79 <p>human - эта ссылка находится в стеке метода main. О стеке методов, повторюсь, мы узнаем больше в следующих уроках. И указывает human на адрес в хипе, где находится экземпляр (инстанс) класса Human.</p>
80 <p>Сам объект human содержит в себе еще две ссылки: name типа String и age типа int. В строчках human.age = 12; и human.name = "Testor"; мы присваиваем этим ссылкам конкретные объекты.</p>
80 <p>Сам объект human содержит в себе еще две ссылки: name типа String и age типа int. В строчках human.age = 12; и human.name = "Testor"; мы присваиваем этим ссылкам конкретные объекты.</p>
81 <p>В хипе это выглядит так:</p>
81 <p>В хипе это выглядит так:</p>
82 <ol><li>Для int age значение хранится в пределах объекта human, а сам объект в хипе.</li>
82 <ol><li>Для int age значение хранится в пределах объекта human, а сам объект в хипе.</li>
83 <li>Для String name значение хранится где-то в хипе, так же как и human. Может даже в соседнем регистре памяти JVM. А в пределах объекта human просто записан адрес объекта в поле name. Поскольку тип String является ссылочным типом, а не примитивом.</li>
83 <li>Для String name значение хранится где-то в хипе, так же как и human. Может даже в соседнем регистре памяти JVM. А в пределах объекта human просто записан адрес объекта в поле name. Поскольку тип String является ссылочным типом, а не примитивом.</li>
84 </ol><h2>Рекомендация</h2>
84 </ol><h2>Рекомендация</h2>
85 <p>Перед тем как пойти далее, решать тесты, поэкспериментируйте с кодом в примерах этого урока. Посмотрите что будет с программой, если поменять местами инициализацию, оставить поля без значений, вывести несколько разных объектов на экран и т.п.</p>
85 <p>Перед тем как пойти далее, решать тесты, поэкспериментируйте с кодом в примерах этого урока. Посмотрите что будет с программой, если поменять местами инициализацию, оставить поля без значений, вывести несколько разных объектов на экран и т.п.</p>
86 <p>Именно эксперименты над кодом позволяют компенсировать недопонимание чего-либо в программировании. И в работе это приходиться делать частенько.</p>
86 <p>Именно эксперименты над кодом позволяют компенсировать недопонимание чего-либо в программировании. И в работе это приходиться делать частенько.</p>
87 <h2>Полезные ссылки</h2>
87 <h2>Полезные ссылки</h2>
88 <ul><li><a>NullPointerException</a></li>
88 <ul><li><a>NullPointerException</a></li>
89 <li><a>Как понять NullPointerException</a></li>
89 <li><a>Как понять NullPointerException</a></li>
90 </ul><ul><li>Дополнительная<a>информация про стек и хип</a>.</li>
90 </ul><ul><li>Дополнительная<a>информация про стек и хип</a>.</li>
91 <li>Для более глубокого понимания, того как объекты занимают память, рекомендую прочитать<a>вот эту статью.</a></li>
91 <li>Для более глубокого понимания, того как объекты занимают память, рекомендую прочитать<a>вот эту статью.</a></li>
92 </ul>
92 </ul>