started seminars, finished meth03
BIN
build/jc3-03.pdf
428
jc3-03.tex
|
@ -1,428 +0,0 @@
|
||||||
\documentclass[j-spec.tex]{subfiles}
|
|
||||||
|
|
||||||
\begin{document}
|
|
||||||
\setcounter{section}{2}
|
|
||||||
\pagestyle{plain}
|
|
||||||
\sloppy
|
|
||||||
\tableofcontents
|
|
||||||
\section{Специализация: ООП}
|
|
||||||
\subsection{В предыдущем разделе}
|
|
||||||
Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами).
|
|
||||||
|
|
||||||
\subsection{В этом разделе}
|
|
||||||
Разберём такие основополагающих в Java вещи, как классы и объекты, а также с тем, как применять на практике основные принципы ООП: наследование, полиморфизм и инкапсуляцию. Дополнительно рассмотрим устройство памяти в джава.
|
|
||||||
\begin{itemize}
|
|
||||||
\item \nom{Класс}{определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java. Определяет новый тип данных};
|
|
||||||
\item \nom{Объект}{конкретный экземпляр класса, созданный в программе};
|
|
||||||
\item \nom{Статика}{(статический контекст) static - (от греч. неподвижный) — раздел механики, в котором изучаются условия равновесия механических систем под действием приложенных к ним сил и возникших моментов. В языке программирования Java - принадлежность поля и его значения не объекту, а классу, и, как следствие, доступность такого поля и его значения в единственном экземпляре всем объектам класса.};
|
|
||||||
\item \nom{Стек}{- };
|
|
||||||
\item \nom{Куча}{- };
|
|
||||||
\item \nom{Сборщик мусора}{- };
|
|
||||||
\item \nom{Конструктор}{- };
|
|
||||||
\item \nom{Вложенный класс}{- };
|
|
||||||
\item \nom{Внутренний класс}{- };
|
|
||||||
\item \nom{Инкапсуляция}{- };
|
|
||||||
\item \nom{Наследование}{- };
|
|
||||||
\item \nom{Полиморфизм }{- };
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\subsection{Классы и объекты, поля и методы, статика}
|
|
||||||
\subsubsection{Классы}
|
|
||||||
Что такое класс? С точки зрения ООП, \textbf{класс} определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java.
|
|
||||||
|
|
||||||
\begin{frm}\info
|
|
||||||
Наиболее важная особенность класса состоит в том, что он определяет новый тип данных, которым можно воспользоваться для создания объектов этого типа
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
То есть класс — это шаблон (чертёж), по которому создаются объекты (экземпляры класса). Для определения формы и сущности класса указываются данные, которые он должен содержать, а также код, воздействующий на эти данные. Создаем мы свои классы, когда у нас не хватает уже созданных.
|
|
||||||
|
|
||||||
Например, если мы хотим работать в нашем приложении с документами, то необходимо для начала объяснить приложению, что такое документ, описать его в виде класса (чертежа) \code{Document}. Указать, какие у него должны быть свойства: название, содержание, количество страниц, информация о том, кем он подписан и т.п. В этом же классе мы обычно описываем, что можно делать с документами: печатать в консоль, подписывать, изменять содержание, название и т.д. Результатом такого описания и будет класс \code{Document}. Однако, это по-прежнему всего лишь чертеж хранимых данных (состояний) и способы взаимодействия с этими данными.
|
|
||||||
|
|
||||||
Если нам нужны конкретные документы, а нам они обязательно нужны, то необходимо создавать \textbf{объекты}: документ №1, документ №2, документ №3. Все эти документы будут иметь одну и ту же структуру (описанные нами название, содержание, ...), с ними можно выполнять одни и те же описанные нами действия (печатать, подписать, ...), но наполнение будет разным, например, в первом документе содержится приказ о назначении работника на должность, во втором, о выдаче премии отделу разработки и т.д.
|
|
||||||
|
|
||||||
Начнём с малого, напишем свой первый класс. Представим, что необходимо работать в приложении с котами. Java ничего не знает о том, что такое коты, поэтому необходимо создать новый класс (тип данных), и объяснить что такое кот. Создадим новый файл, для простоты в том же пакете, что и главный класс программы.
|
|
||||||
|
|
||||||
\begin{figure}[H]
|
|
||||||
\begin{forest}
|
|
||||||
for tree={
|
|
||||||
font=\ttfamily, grow'=0, child anchor=west,
|
|
||||||
parent anchor=south, anchor=west, calign=first,
|
|
||||||
edge path={
|
|
||||||
\noexpand\path [draw, \forestoption{edge}]
|
|
||||||
(!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.5pt]
|
|
||||||
{} (.child anchor)\forestoption{edge label};
|
|
||||||
}, before typesetting nodes={
|
|
||||||
if n=1 {insert before={[,phantom]}} {} },
|
|
||||||
fit=band, before computing xy={l=20pt},
|
|
||||||
}
|
|
||||||
[Sample
|
|
||||||
[src
|
|
||||||
[ru
|
|
||||||
[gb
|
|
||||||
[jcore
|
|
||||||
[sample
|
|
||||||
[Main.java]
|
|
||||||
[Cat.java]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
[out
|
|
||||||
]
|
|
||||||
[README.md]
|
|
||||||
]
|
|
||||||
\end{forest}
|
|
||||||
\caption{Структура проекта}
|
|
||||||
\label{pic:simple-tree}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\subsubsection{Поля класса}
|
|
||||||
Начнем описывать в классе \code{Cat} так называемый API кота. Как изестно, имя класса должно совпадать с именем файла, в котором он объявлен, т.е. класс \code{Cat} должен находиться в файле \code{Cat.java}. Пусть у котов есть три свойства: \code{name} (кличка), \code{color} (цвет) и \code{age} (возраст); совокупность этих свойств называется состоянием, и коты пока ничего не умеют делать. Класс \code{Cat} будет иметь вид, представленный в листинге \hrf{lst:class-simple}. Свойства класса, записанные таким образом, в виде переменных, называются \textbf{полями}.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Структура кота в программе},label={lst:class-simple}]
|
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class Cat {
|
|
||||||
String name;
|
|
||||||
String color;
|
|
||||||
int age;
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\begin{frm} \excl
|
|
||||||
Для новичка важно не запутаться, класс кота мы описали в отдельном файле, а создавать объекты и совершать манипуляции следует в основном классе программы, не может же кот назначить имя сам себе.
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Мы рассказали программе, что такое коты, теперь если мы хотим создать в нашем приложении конкретного кота, следует воспользоваться оператором \code{new Cat();} в основном классе программы. Более подробно разберём, что происходит в этой строке, чуть позже, пока же нам достаточно знать, что мы создали объект типа \code{Cat} (экземпляр класса \code{Cat}), и запомнить эту конструкцию. Для того чтобы с ним (экземпляром) работать, можем положить его в переменную, которой дать идентификатор \code{cat1}. При создании объекта полям присваиваются значения по умолчанию (нули для числовых переменных и \code{false} для булевых).
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
Cat cat0; // cat0 = null;
|
|
||||||
cat0 = new Cat();
|
|
||||||
Cat cat1 = new Cat();
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
В листинге выше можно увидеть все три операции (объявление, присваивание и инициализацию) и становится понятно, как можно создавать объекты. Также известно, что в переменной не лежит сам объект, а только ссылка на него. Объект \code{cat1} создан по чертежу \code{Cat}, это значит, что у него есть поля \code{name}, \code{color}, \code{age}, с которыми можно работать: получать или изменять их значения.
|
|
||||||
|
|
||||||
\begin{frm} \info
|
|
||||||
Для доступа к полям объекта используется оператор точка, который связывает имя объекта с именем поля. Например, чтобы присвоить полю \code{color} объекта \code{cat1} значение «Белый», нужно выполнить код \code{cat1.color = "Белый"};
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Операция «точка» служит для доступа к полям и методам объекта по его имени. Мы уже использовали оператор «точка» для доступа к полю с длиной массива, например. Рассмотрим пример консольного приложения, работающего с объектами класса \code{Cat}. Создадим двух котов, один будет белым Барсиком 4х лет, второй чёрным Мурзиком шести лет, и просто выведем информацию о них в терминал.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
Cat cat1 = new Cat();
|
|
||||||
Cat cat2 = new Cat();
|
|
||||||
|
|
||||||
cat1.name = "Barsik";
|
|
||||||
cat1.color = "White";
|
|
||||||
cat1.age = 4;
|
|
||||||
|
|
||||||
cat2.name = "Murzik";
|
|
||||||
cat2.color = "Black";
|
|
||||||
cat2.age = 6;
|
|
||||||
|
|
||||||
System.out.println("Cat1 named: " + cat1.name +
|
|
||||||
" is " + cat1.color +
|
|
||||||
" has age: " + cat1.age);
|
|
||||||
System.out.println("Cat2 named: " + cat2.name +
|
|
||||||
" is " + cat2.color +
|
|
||||||
" has age: " + cat2.age);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
в результате работы программы в консоли появятся следующие строки:
|
|
||||||
\begin{verbatim}
|
|
||||||
Cat1 named: Barsik is White has age: 4
|
|
||||||
Cat2 named: Murzik is Black has age: 6
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
Вначале мы создали два объекта типа \code{Cat}: \code{cat1} и \code{cat2}, соответственно, они имеют одинаковый набор полей \code{name}, \code{color}, \code{age}. Почему? Потому что они принадлежат одному классу, созданы по одному шаблону. Объекты всегда «знают», какого они класса. Однако каждому из них в эти поля записаны разные значения. Как видно из результата печати в консоли, изменение значения полей одного объекта, никак не влияет на значения полей другого объекта. Данные объектов \code{cat1} и \code{cat2} изолированы друг от друга. А значит мы делаем вывод о том, поля хранятся в классе, а значения полей хранятся в объектах. Логическая структура, демонстрирующая отношения объектов и классов, в том числе в части хранения полей и их значений показана на рис. \hrf{pic:class-obj-fields}.
|
|
||||||
|
|
||||||
\begin{figure}[H]
|
|
||||||
\centering
|
|
||||||
\def\svgscale{1.01}
|
|
||||||
\fontsize{12}{1}\selectfont
|
|
||||||
\includesvg{pics/jc-03-class-obj-fields.svg}
|
|
||||||
\caption{Логическая структура отношения класс-объект}
|
|
||||||
\label{pic:class-obj-fields}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\subsubsection{Объекты}
|
|
||||||
Разобравшись с тем, как создавать новые типы данных (классы) и мельком посмотрев, как создаются объекты, нужно подробнее разобрать, как создавать объекты, и что при этом происходит. Создание объекта как любого ссылочного типа данных проходит в два этапа. Как и в случае с уже известными нам массивами.
|
|
||||||
\begin{itemize}
|
|
||||||
\item Сначала создается переменная, имеющая интересующий нас тип, в неё возможно записать ссылку на объект;
|
|
||||||
\item затем необходимо выделить память под объект;
|
|
||||||
\item создать и положить объект в выделенную часть памяти;
|
|
||||||
\item и сохранить ссылку на этот объект в памяти - в нашу переменную.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
Для непосредственного создания объекта применяется оператор \code{new}, который динамически резервирует память под объект и возвращает ссылку на него, в общих чертах эта ссылка представляет собой адрес объекта в памяти, зарезервированной оператором \code{new}.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
Cat cat1; // cat1 = null;
|
|
||||||
cat1 = new Cat();
|
|
||||||
Cat cat2 = new Cat();
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
В первой строке кода переменная \code{cat1} объявляется как ссылка на объект типа \code{Cat} и пока ещё не ссылается на конкретный объект (первоначально значение переменной \code{cat1} равно \code{null}). В следующей строке выделяется память для объекта типа \code{Cat}, и в переменную \code{cat1} сохраняется ссылка на него. После выполнения второй строки кода переменную \code{cat1} можно использовать так, как если бы она была объектом типа \code{Cat}. Обычно новый объект создается в одну строку, то есть инициализируется.
|
|
||||||
|
|
||||||
\subsubsection{Оператор \code{new}}
|
|
||||||
|
|
||||||
\begin{frm}\info
|
|
||||||
[квалификаторы] ИмяКласса имяПеременной = \textbf{\code{new}} ИмяКласса();
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Оператор \code{new} динамически выделяет память для нового объекта, общая форма применения этого оператора имеет вид как на врезке выше, но на самом деле справа - не имя класса, конструкция ИмяКласса() в правой части выполняет вызов конструктора данного класса, который подготавливает вновь создаваемый объект к работе.
|
|
||||||
|
|
||||||
Именно от количества применений оператора \code{new} будет зависеть, сколько именно объектов будет создано в программе.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
Cat cat1 = new Cat();
|
|
||||||
Cat cat2 = cat1;
|
|
||||||
|
|
||||||
cat1.name = "Barsik";
|
|
||||||
cat1.color = "White";
|
|
||||||
cat1.age = 4;
|
|
||||||
|
|
||||||
cat2.name = "Murzik";
|
|
||||||
cat2.color = "Black";
|
|
||||||
cat2.age = 6;
|
|
||||||
|
|
||||||
System.out.println("Cat1 named: " + cat1.name +
|
|
||||||
" is " + cat1.color +
|
|
||||||
" has age: " + cat1.age);
|
|
||||||
System.out.println("Cat2 named: " + cat2.name +
|
|
||||||
" is " + cat2.color +
|
|
||||||
" has age: " + cat2.age);
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
На первый взгляд может показаться, что переменной \code{cat2} присваивается ссылка на копию объекта \code{cat1}, т.е. переменные \code{cat1} и \code{cat2} будут ссылаться на разные объекты в памяти. Но это не так. На самом деле \code{cat1} и \code{cat2} будут ссылаться на один и тот же объект. Присваивание переменной \code{cat1} значения переменной \code{cat2} не привело к выделению области памяти или копированию объекта, лишь к тому, что переменная \code{cat2} содержит ссылку на тот же объект, что и переменная \code{cat1}. Это явление дополнительно подчёркивает ссылочную природу данных в языке Java.
|
|
||||||
|
|
||||||
Таким образом, любые изменения, внесённые в объект по ссылке \code{cat2}, окажут влияние на объект, на который ссылается переменная \code{cat1}, поскольку \textit{это один и тот же объект в памяти}. Поэтому результатом выполнения кода, где мы как будто бы указали возраст второго кота, равный шести годам, станут строки, показывающие, что по обеим ссылкам оказался кот возраста шесть лет с именем Мурзика.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
|
||||||
Cat1 named: Murzik is Black has age: 6
|
|
||||||
Cat2 named: Murzik is Black has age: 6
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
\begin{frm}\info
|
|
||||||
Множественные ссылки на один и тот же объект в памяти довольно легко себе представить как ярлыки для запуска одной и той же программы на рабочем столе и в меню быстрого запуска. Или если на один и тот же шкафчик в раздевалке наклеить два номера - сам шкафчик можно будет найти по двум ссылкам на него.
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Важно всегда перепроверять, какие объекты созданы, а какие имеют множественные ссылки.
|
|
||||||
|
|
||||||
\subsubsection{Методы}
|
|
||||||
Ранее было сказано о том, что в языке Java любая программа состоит из классов и функций, которые могут описываться только внутри них. Именно поэтому все функции в языке Java являются методами. А метод - это функция, являющаяся частью некоторого класса, которая может выполнять операции над данными этого класса.
|
|
||||||
|
|
||||||
\begin{frm} \info
|
|
||||||
Метод - это функция, принадлежащая классу
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Метод для своей работы может использовать поля объекта и/или класса, в котором определен, напрямую, без необходимости передавать их во входных параметрах. Это похоже на использование глобальных переменных в функциях, но в отличие от глобальных переменных, метод может получать прямой доступ только к членам класса. Самые простые методы работают с данными объектов. Методы чаще всего формируют API классов, то есть способ взаимодействия с классами, интерфейс. Место методов во взаимодействии классов и объектов показано на рис. \hrf{pic:class-obj-nostatic}.
|
|
||||||
|
|
||||||
\begin{figure}[H]
|
|
||||||
\centering
|
|
||||||
\def\svgscale{1.01}
|
|
||||||
\fontsize{12}{1}\selectfont
|
|
||||||
\includesvg{pics/jc-03-class-obj-nostatic.svg}
|
|
||||||
\caption{Логическая структура отношения класс-объект}
|
|
||||||
\label{pic:class-obj-nostatic}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
Вернёмся к примеру с котиками. Широко известно, что котики умеют урчать, мяукать и смешно прыгать. В целях демонстрации в описании этих действий просто будем делать разные выводы в консоль, хотя возможно и научить котика в программе выбирать минимальное значение из массива, но это было бы, как минимум, неожиданно. Итак опишем метод например подать голос и прыгать.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
public class Cat {
|
|
||||||
String name;
|
|
||||||
String color;
|
|
||||||
int age;
|
|
||||||
|
|
||||||
void voice() {
|
|
||||||
System.out.println(name + " meows");
|
|
||||||
}
|
|
||||||
|
|
||||||
void jump() {
|
|
||||||
if (this.age < 5) System.out.println(name + " jumps");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
Обращение к методам выглядит очень похожим на стандартный способом, через точку, как к полям. Теперь когда появляется необходимость позвать котика, он скажет: «мяу, я имя котика», а если в программе пришло время котику прыгнуть, он решит, прилично ли это -- прыгать в его возрасте.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
package ru.gb.jcore;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
public static void main(String[] args) {
|
|
||||||
Cat cat1 = new Cat();
|
|
||||||
Cat cat2 = new Cat();
|
|
||||||
|
|
||||||
cat1.name = "Barsik";
|
|
||||||
cat1.color = "White";
|
|
||||||
cat1.age = 4;
|
|
||||||
|
|
||||||
cat2.name = "Murzik";
|
|
||||||
cat2.color = "Black";
|
|
||||||
cat2.age = 6;
|
|
||||||
|
|
||||||
cat1.voice();
|
|
||||||
cat2.voice();
|
|
||||||
cat1.jump();
|
|
||||||
cat2.jump();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\begin{verbatim}
|
|
||||||
Barsik meows
|
|
||||||
Murzik meows
|
|
||||||
Barsik jumps
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
Как видно, Барсик замечательно прыгает, а Мурзик от прыжков воздержался, хотя попрыгать программа попросила их обоих.
|
|
||||||
|
|
||||||
\subsubsection{Ключевое слово \code{static}}
|
|
||||||
В завершение базовой информации о классах и объектах, остановимся на специальном модификаторе \code{static}, делающем переменную или метод «независимыми» от объекта.
|
|
||||||
|
|
||||||
\begin{frm}\info
|
|
||||||
\textbf{\code{static}} — модификатор, применяемый к полю, блоку, методу или внутреннему классу, он указывает на привязку субъекта к текущему классу.
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Для использования таких полей и методов, соответственно, объект создавать не нужно. В Java большинство членов служебных классов являются статическими. Возможно использовать это ключевое слово в четырех контекстах:
|
|
||||||
\begin{itemize}
|
|
||||||
\item статические методы;
|
|
||||||
\item статические переменные;
|
|
||||||
\item статические вложенные классы;
|
|
||||||
\item статические блоки.
|
|
||||||
\end{itemize}
|
|
||||||
В этом разделе рассмотрим подробнее только первые два пункта, третий опишем чуть позже, а четвёртый потребует от нас знаний, выходящих не только за этот урок, но и за десяток следующих.
|
|
||||||
|
|
||||||
\textbf{Статические методы} также называются методами класса, потому что статический метод принадлежит классу, а не его объекту. Нестатические называются методами объекта. Статические методы можно вызывать напрямую через имя класса, не обращаясь к объекту и вообще объект не создавая. Что это и зачем нужно? Например, умение кота мяукать можно вывести в статическое поле, потому что, например, весной можно открыть окно, не увидеть ни одного экземпляра котов, но зато услышать их, и точно знать, что мяукают не дома и не машины, а именно коты.
|
|
||||||
|
|
||||||
\begin{figure}[H]
|
|
||||||
\centering
|
|
||||||
\def\svgscale{1.01}
|
|
||||||
\fontsize{12}{1}\selectfont
|
|
||||||
\includesvg{pics/jc-03-class-obj-full.svg}
|
|
||||||
\caption{Логическая структура отношения класс-объект}
|
|
||||||
\label{pic:class-obj-full}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
Аналогично статическим методам, \textbf{статические поля} принадлежат классу и совершенно ничего «не знают» об объектах.
|
|
||||||
|
|
||||||
\begin{frm}\excl
|
|
||||||
Важной отличительной чертой статических полей является то, что их значения также хранятся в классе, в отличие от обычных полей, чьи значения хранятся в объектах.
|
|
||||||
\end{frm}
|
|
||||||
|
|
||||||
Рисунок \hrf{pic:class-obj-full} именно в этом виде автор настоятельно рекомендует если не заучить, то хотя бы хорошо запомнить, он ещё пригодится в дальнейшем обучении и работе. Из этого же изображения можно сделать несколько выводов.
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
public class Cat {
|
|
||||||
static int pawsCount = 4;
|
|
||||||
|
|
||||||
String name;
|
|
||||||
String color;
|
|
||||||
int age;
|
|
||||||
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
Помимо того, что статические поля - это полезный инструмент создания общих свойств это ещ§ и опасный инструмент создания общих свойств. Так, например, мы знаем, что у котов четыре лапы, а не 6 и не 8. Не создавая никакого барсика будет понятно, что у кота - 4 лапы. Это полезное поведение.
|
|
||||||
|
|
||||||
лайвкод 03-статическое-поле-ошибка Посмотрим на опасность. Мы видим, что у каждого кота есть имя, и помним, что коты хранят значение своего имени каждый сам у себя. А знают экземпляры о названии поля потому что знают, какого класса они экземпляры. Но что если мы по невнимательности добавим свойство статичности к имени кота?
|
|
||||||
|
|
||||||
03-статическое-поле-признак Создав тех же самых котов, которых мы создавали весь урок, мы получим двух мурзиков и ни одного барсика. Почему это произошло? По факту переменная у нас одна на всех, и значение тоже одно, а значит каждый раз мы меняем именно его, а все остальные коты ничего не подозревая смотрят на значение общей переменной и бодро его возвращают. Поэтому, чтобы не запутаться, к статическим переменным, как правило, обращаются не по ссылке на объект — cat1.name, а по имени класса — Cat.name.
|
|
||||||
|
|
||||||
03-статические-поля К слову, статические переменные — редкость в Java. Вместо них применяют статические константы. Они определяются ключевыми словами static final и по соглашению о внешнем виде кода пишутся в верхнем регистре.
|
|
||||||
|
|
||||||
\subsubsection{Задание для самопроверки}
|
|
||||||
\begin{enumerate}
|
|
||||||
\item Что такое класс?
|
|
||||||
\item Что такое поле класса?
|
|
||||||
\item На какие три этапа делится создание объекта?
|
|
||||||
\item Какое свойство добавляет ключевое слово static полю или методу?
|
|
||||||
\begin{enumerate}
|
|
||||||
\item неизменяемость;
|
|
||||||
\item принадлежность классу;
|
|
||||||
\item принадлежность приложению.
|
|
||||||
\end{enumerate}
|
|
||||||
\item Может ли статический метод получить доступ к полям объекта?
|
|
||||||
\begin{enumerate}
|
|
||||||
\item не может;
|
|
||||||
\item может только к константным;
|
|
||||||
\item может только к неинициализированным.
|
|
||||||
\end{enumerate}
|
|
||||||
\end{enumerate}
|
|
||||||
|
|
||||||
\subsection{Стек и куча}
|
|
||||||
\subsection{Сборка мусора}
|
|
||||||
\subsection{Конструкторы}
|
|
||||||
\subsection{Инкапсуляция}
|
|
||||||
\subsection{Наследование}
|
|
||||||
\subsection{Полиморфизм}
|
|
||||||
|
|
||||||
- Также, хотелось бы отметить, что мы можем использовать -Xms и -Xmx опции JVM, чтобы определить начальный и максимальный размер памяти в куче. Для стека определить размер памяти можно с помощью опции -Xss;
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
public class Cat {
|
|
||||||
private String name;
|
|
||||||
private String color;
|
|
||||||
private int age;
|
|
||||||
|
|
||||||
public Cat() {
|
|
||||||
System.out.println("constructor is constructing...");
|
|
||||||
name = "Barsik";
|
|
||||||
color = "White";
|
|
||||||
age = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
public class Cat {
|
|
||||||
private String name;
|
|
||||||
private String color;
|
|
||||||
private int age;
|
|
||||||
|
|
||||||
Cat(String n, String c, int a) {
|
|
||||||
System.out.println("constructor is constructing...");
|
|
||||||
name = n;
|
|
||||||
color = c;
|
|
||||||
age = a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=Java,style=JCodeStyle]
|
|
||||||
Cat cat1 = new Cat("Barsik", "White", 4);
|
|
||||||
Cat cat2 = new Cat("Murzik", "Black", 6);
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
\begin{lstlisting}[language=C,style=CCodeStyle]
|
|
||||||
public class Cat {
|
|
||||||
private String name;
|
|
||||||
private String color;
|
|
||||||
private int age;
|
|
||||||
|
|
||||||
public Cat(String name, String color, int age) {
|
|
||||||
this.name = name;
|
|
||||||
this.color = color;
|
|
||||||
this.age = age;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
ключевое слово this в Java используется только в составе экземпляра класса. Но неявно ключевое слово this передается во все методы, кроме статических (поэтому this часто называют неявным параметром) и может быть использовано для обращения к объекту, вызвавшему метод.
|
|
||||||
|
|
||||||
|
|
||||||
\newpage
|
|
||||||
\printnomenclature[40mm]
|
|
||||||
|
|
||||||
\end{document}
|
|
After Width: | Height: | Size: 192 KiB |
|
@ -0,0 +1,290 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="210mm"
|
||||||
|
height="297mm"
|
||||||
|
viewBox="0 0 210 297"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||||
|
sodipodi:docname="jc-03-memory.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="1.1893044"
|
||||||
|
inkscape:cx="472.54513"
|
||||||
|
inkscape:cy="422.51588"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1057"
|
||||||
|
inkscape:window-x="2552"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid132" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Слой 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="63.526459"
|
||||||
|
y="121.73479"
|
||||||
|
id="text318"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan316"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="63.526459"
|
||||||
|
y="121.73479">Java Memory Model</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="47.651459"
|
||||||
|
y="129.67229"
|
||||||
|
id="text322"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan320"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="47.651459"
|
||||||
|
y="129.67229">Heap</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="81.839859"
|
||||||
|
y="129.61302"
|
||||||
|
id="text326"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan324"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="81.839859"
|
||||||
|
y="129.61302">Stack</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="113.79729"
|
||||||
|
y="129.67229"
|
||||||
|
id="text330"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan328"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="113.79729"
|
||||||
|
y="129.67229">Non-heap</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="29.130625"
|
||||||
|
y="137.60979"
|
||||||
|
id="text442"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan440"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="29.130625"
|
||||||
|
y="137.60979">Old Generation</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="71.463959"
|
||||||
|
y="137.60979"
|
||||||
|
id="text446"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan444"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="71.463959"
|
||||||
|
y="137.60979">New Generation</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="59.557709"
|
||||||
|
y="145.54729"
|
||||||
|
id="text450"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan448"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="59.557709"
|
||||||
|
y="145.54729">Eden</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="76.755623"
|
||||||
|
y="145.54729"
|
||||||
|
id="text454"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan452"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="76.755623"
|
||||||
|
y="145.54729">Survivor1</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="103.21395"
|
||||||
|
y="145.54729"
|
||||||
|
id="text458"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan456"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="103.21395"
|
||||||
|
y="145.54729">Survivor2</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="134.96396"
|
||||||
|
y="137.60979"
|
||||||
|
id="text462"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan460"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="134.96396"
|
||||||
|
y="137.60979">Permanent Generation</tspan><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="134.96396"
|
||||||
|
y="143.78342"
|
||||||
|
id="tspan464">(Metaspace)</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:4.9389px;line-height:1.25;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';stroke-width:0.264583"
|
||||||
|
x="145.54729"
|
||||||
|
y="127.02646"
|
||||||
|
id="text468"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan466"
|
||||||
|
style="stroke-width:0.264583"
|
||||||
|
x="145.54729"
|
||||||
|
y="127.02646">Code Cache</tspan></text>
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect522"
|
||||||
|
width="48.947918"
|
||||||
|
height="6.6145854"
|
||||||
|
x="62.203541"
|
||||||
|
y="116.44312" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect524"
|
||||||
|
width="15.875001"
|
||||||
|
height="6.6145854"
|
||||||
|
x="46.328541"
|
||||||
|
y="124.38062" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect526"
|
||||||
|
width="15.875"
|
||||||
|
height="6.614583"
|
||||||
|
x="80.724373"
|
||||||
|
y="124.38062" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect528"
|
||||||
|
width="25.135416"
|
||||||
|
height="6.614583"
|
||||||
|
x="112.47437"
|
||||||
|
y="124.38062" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect530"
|
||||||
|
width="37.041668"
|
||||||
|
height="6.614583"
|
||||||
|
x="27.807707"
|
||||||
|
y="132.31813" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect532"
|
||||||
|
width="39.6875"
|
||||||
|
height="6.614583"
|
||||||
|
x="70.141045"
|
||||||
|
y="132.31813" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect534"
|
||||||
|
width="30.427082"
|
||||||
|
height="6.614583"
|
||||||
|
x="144.22437"
|
||||||
|
y="121.73479" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect536"
|
||||||
|
width="54.23959"
|
||||||
|
height="13.229161"
|
||||||
|
x="133.64104"
|
||||||
|
y="132.31813" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect538"
|
||||||
|
width="25.135416"
|
||||||
|
height="6.614583"
|
||||||
|
x="101.89104"
|
||||||
|
y="140.25562" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect540"
|
||||||
|
width="25.135416"
|
||||||
|
height="6.614583"
|
||||||
|
x="75.432709"
|
||||||
|
y="140.25562" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
|
||||||
|
id="rect542"
|
||||||
|
width="15.875"
|
||||||
|
height="6.614583"
|
||||||
|
x="58.234791"
|
||||||
|
y="140.25562" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 62.203541,119.08896 -9.260417,5.29166"
|
||||||
|
id="path607" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 111.15146,119.08896 13.22916,5.29166"
|
||||||
|
id="path609" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 88.661874,123.05771 v 1.32291"
|
||||||
|
id="path611" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 137.60979,127.02646 6.61458,-2.64584"
|
||||||
|
id="path613" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 137.60979,129.67229 15.875,2.64583"
|
||||||
|
id="path615" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 70.141041,136.28687 -3.96875,3.96875"
|
||||||
|
id="path617" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 88.661874,138.93271 v 1.32291"
|
||||||
|
id="path619" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 109.82854,136.28687 3.96875,3.96875"
|
||||||
|
id="path621" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 62.203541,128.34937 14.552083,3.96875"
|
||||||
|
id="path623" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 46.328541,128.34937 -7.9375,3.96875"
|
||||||
|
id="path625" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 10 KiB |
|
@ -0,0 +1,103 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="210mm"
|
||||||
|
height="297mm"
|
||||||
|
viewBox="0 0 210 297"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)"
|
||||||
|
sodipodi:docname="jc-03-modifiers.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showgrid="true"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:zoom="15.985772"
|
||||||
|
inkscape:cx="308.14903"
|
||||||
|
inkscape:cy="419.154"
|
||||||
|
inkscape:window-width="1534"
|
||||||
|
inkscape:window-height="929"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="25"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="layer1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid132" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="80.697915,197.78126"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide1128"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Слой 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="74.083336"
|
||||||
|
y="117.73959"
|
||||||
|
id="text250"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan248"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="74.083336"
|
||||||
|
y="117.73959">public</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="104.51041"
|
||||||
|
id="text416"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan414"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="104.51041">default</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="97.895836"
|
||||||
|
id="text420"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan418"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="97.895836">private</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 80.697917,83.34375 55.5625,119.0625 h 50.27083 L 80.697917,83.34375"
|
||||||
|
id="path476"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
|
||||||
|
d="m 68.791666,100.54167 h 23.8125"
|
||||||
|
id="path1130" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 64.822916,105.83333 H 96.572915"
|
||||||
|
id="path1132" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
|
||||||
|
d="M 59.531249,113.77083 H 101.86458"
|
||||||
|
id="path1134" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
|
@ -0,0 +1,114 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="210mm"
|
||||||
|
height="297mm"
|
||||||
|
viewBox="0 0 210 297"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
sodipodi:docname="jc-04-modifiers-full.svg"
|
||||||
|
inkscape:version="1.2.1 (9c6d41e4, 2022-07-14)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showgrid="true"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:zoom="15.985772"
|
||||||
|
inkscape:cx="308.14903"
|
||||||
|
inkscape:cy="419.154"
|
||||||
|
inkscape:window-width="1534"
|
||||||
|
inkscape:window-height="929"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="25"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="layer1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid132" />
|
||||||
|
<sodipodi:guide
|
||||||
|
position="80.697915,197.78126"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide1128"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Слой 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="74.083336"
|
||||||
|
y="117.73959"
|
||||||
|
id="text250"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan248"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="74.083336"
|
||||||
|
y="117.73959">public</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="70.114586"
|
||||||
|
y="111.125"
|
||||||
|
id="text304"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan302"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="70.114586"
|
||||||
|
y="111.125">protected</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="104.51041"
|
||||||
|
id="text416"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan414"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="104.51041">default</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';fill:#000000;stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="97.895836"
|
||||||
|
id="text420"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan418"
|
||||||
|
style="stroke-width:0.765"
|
||||||
|
x="72.760414"
|
||||||
|
y="97.895836">private</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 80.697917,83.34375 55.5625,119.0625 h 50.27083 L 80.697917,83.34375"
|
||||||
|
id="path476"
|
||||||
|
sodipodi:nodetypes="cccc" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
|
||||||
|
d="m 68.791666,100.54167 h 23.8125"
|
||||||
|
id="path1130" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 64.822916,105.83333 H 96.572915"
|
||||||
|
id="path1132" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:square"
|
||||||
|
d="M 59.531249,113.77083 H 101.86458"
|
||||||
|
id="path1134" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
|
@ -0,0 +1,324 @@
|
||||||
|
\documentclass[../j-spec.tex]{subfiles}
|
||||||
|
\usepackage{spreadtab}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\section{Семинар: компиляция и интерпретация кода}
|
||||||
|
\subsection{Инструментарий}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Презентация для преподавателя, ведущего семинар;
|
||||||
|
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
|
||||||
|
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
|
||||||
|
\item JDK любая 11 версии и выше;
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsection{Цели семинара}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Закрепить полученные на лекции знания, касающиеся компиляции, интерпретации кода и создания программной документации;
|
||||||
|
\item Получить практический навык настройки терминала ОС для компиляции и исполнения кода, установки сторонних библиотек для интерпретации;
|
||||||
|
\item Попрактиковаться в написании терминальных команд и простых проектов. Лучше понять принцип импортирования кода и сборки проекта.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsection{План-содержание}
|
||||||
|
\noindent
|
||||||
|
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
|
||||||
|
\hline
|
||||||
|
@ Что происходит & @ Время & @ Слайды & @ Описание \\
|
||||||
|
\hline
|
||||||
|
\endhead
|
||||||
|
@ Организационный момент & 5 tag(beg) & @ 1-4 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
|
||||||
|
\hline
|
||||||
|
@ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
|
||||||
|
\hline
|
||||||
|
@ Рассмотрение ДЗ & 15 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
|
||||||
|
\hline
|
||||||
|
@ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
|
||||||
|
\hline
|
||||||
|
@ Задание 1 & 10 & @ 20-22 & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
|
||||||
|
\hline
|
||||||
|
@ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
|
||||||
|
\hline
|
||||||
|
@ Задание 2 & 10 & @ 23-25 & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
|
||||||
|
\hline
|
||||||
|
@ Задание 3 & 15 & @ 27-29 & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
|
||||||
|
\hline
|
||||||
|
@ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\
|
||||||
|
\hline
|
||||||
|
@ Рефлексия & 10 tag(end) & @ 40-42 & @ Преподаватель запрашивает обратную связь \\
|
||||||
|
\hline
|
||||||
|
@ Длительность & sum(cell(beg):cell(end)) & & \\
|
||||||
|
\hline
|
||||||
|
\end{spreadtab}
|
||||||
|
|
||||||
|
\subsection{Подробности}
|
||||||
|
\subsubsection{Организационный момент}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
|
||||||
|
\item \textbf{Тайминг:} 3-5 минут.
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Презентует название курса (первый раз) и семинара;
|
||||||
|
\item Рассказывает немного о себе;
|
||||||
|
\item Запрашивает активность от аудитории в чате;
|
||||||
|
\item Презентует цели курса и семинара;
|
||||||
|
\item Презентует краткий план семинара и что студент научится делать.
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Quiz}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
|
||||||
|
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
|
||||||
|
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Вопросы и ответы:}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item
|
||||||
|
\end{enumerate}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Рассмотрение ДЗ}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Пояснить неочевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
|
||||||
|
\item \textbf{Тайминг:} 15-20 минут.
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
|
||||||
|
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Домашнее задание из лекции:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=100mm]{sem-01-struct.png}
|
||||||
|
\caption{Структура проекта}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
|
||||||
|
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
|
||||||
|
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
|
||||||
|
java -classpath ./out ru.gb.jcore.sample.Main
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=60mm]{sem-01-hw2-compile.png}
|
||||||
|
\caption{Результат компиляции}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
|
||||||
|
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=120mm]{sem-01-hw2-doc.png}
|
||||||
|
\caption{Результат создания документации}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}
|
||||||
|
|
||||||
|
\lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=80mm]{sem-01-hw03.png}
|
||||||
|
\caption{Результат выполнения тасков}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Вопросы и ответы}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
|
||||||
|
\item \textbf{Тайминг} 5-15 минут
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
|
||||||
|
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
|
||||||
|
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
|
||||||
|
\item Посоветовать литературу на тему заданного вопроса;
|
||||||
|
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 1}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Создание, компиляция и запуск проектов без использования среды разработки.
|
||||||
|
\item \textbf{Тайминг} 10-20 минут.
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
|
||||||
|
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello, world!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
|
||||||
|
javac Main.java
|
||||||
|
java Main
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] отделить исходный код от скомпилированных файлов
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[style=ASMStyle]
|
||||||
|
javac -d out Main.java
|
||||||
|
java -classpath ./out Main
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
|
||||||
|
\begin{lstlisting}[style=ASMStyle]
|
||||||
|
javac -d out ru/gb/jcore/Main.java
|
||||||
|
java -classpath ./out ru.gb.jcore.Main
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 2}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
|
||||||
|
\item \textbf{Тайминг} 10-15 минут.
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
|
||||||
|
\item Пояснить студентам в каком виде выполнять и сдавать задания;
|
||||||
|
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=120mm]{sem-01-t2-1.png}
|
||||||
|
\caption{Вариант решения}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\item [$*_1$] осуществить форматированный вывод
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
|
||||||
|
System.out.print("Your number is " + a);
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] сохранить форматирующую строку в ячейке с переменной
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=120mm]{sem-01-t2-2.png}
|
||||||
|
\caption{Вариант решения}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 3}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации.
|
||||||
|
\item \textbf{Тайминг} 15-20 минут
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
|
||||||
|
\item Выдать задание группам студентов
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}
|
||||||
|
\begin{itemize}
|
||||||
|
\item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=80mm]{sem-01-t3-1.png}
|
||||||
|
\caption{Иерархия получившегося проекта}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
|
||||||
|
javac -sourcepath . -d out ru/gb/Simple.java
|
||||||
|
java -classpath ./out ru.gb.Simple
|
||||||
|
javadoc -d doc -sourcepath . -cp ./out -subpackages ru
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] создать документацию на каждый пакет по отдельности
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
|
||||||
|
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
|
||||||
|
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Домашнее задание}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
|
||||||
|
\item \textbf{Тайминг} 5-10 минут.
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам в каком виде выполнять и сдавать задания
|
||||||
|
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
|
||||||
|
\item Объяснить к кому обращаться за помощью и где искать подсказки
|
||||||
|
\item Объяснить где взять проект заготовки для дз
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
|
||||||
|
\item
|
||||||
|
\end{enumerate}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Рефлексия и завершение семинара}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
|
||||||
|
\item \textbf{Тайминг:} 5-10 минут
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Запросить обратную связь от студентов.
|
||||||
|
\item Подчеркните то, чему студенты научились на занятии.
|
||||||
|
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
|
||||||
|
\item Дайте краткую обратную связь студентам.
|
||||||
|
\item Поделитесь ощущением от семинара.
|
||||||
|
\item Поблагодарите за проделанную работу.
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
|
|
|
@ -0,0 +1,348 @@
|
||||||
|
\documentclass[../j-spec.tex]{subfiles}
|
||||||
|
\usepackage{spreadtab}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\section{Семинар: данные и функции}
|
||||||
|
\subsection{Инструментарий}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Презентация для преподавателя, ведущего семинар;
|
||||||
|
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
|
||||||
|
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
|
||||||
|
\item JDK любая 11 версии и выше;
|
||||||
|
\item \href{https://www.jetbrains.com/idea/download}{IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsection{Цели семинара}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Закрепить полученные на лекции знания, хранения примитивных и ссылочных типов данных;
|
||||||
|
\item Получить практический навык создания функций по описанию;
|
||||||
|
\item Попрактиковаться в написании простых функций, манипулирующих ссылочными данными.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsection{План-содержание}
|
||||||
|
\noindent
|
||||||
|
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
|
||||||
|
\hline
|
||||||
|
@ Что происходит & @ Время & @ Слайды & @ Описание \\
|
||||||
|
\hline
|
||||||
|
\endhead
|
||||||
|
@ Организационный момент & 5 tag(beg) & @ 1-4 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
|
||||||
|
\hline
|
||||||
|
@ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
|
||||||
|
\hline
|
||||||
|
@ Рассмотрение ДЗ лекции & 15 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
|
||||||
|
\hline
|
||||||
|
@ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
|
||||||
|
\hline
|
||||||
|
@ Задание 1 & 10 & @ 20-22 & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
|
||||||
|
\hline
|
||||||
|
@ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
|
||||||
|
\hline
|
||||||
|
@ Задание 2 & 10 & @ 23-25 & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
|
||||||
|
\hline
|
||||||
|
@ Задание 3 & 15 & @ 27-29 & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
|
||||||
|
\hline
|
||||||
|
@ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\
|
||||||
|
\hline
|
||||||
|
@ Рефлексия & 10 tag(end) & @ 40-42 & @ Преподаватель запрашивает обратную связь \\
|
||||||
|
\hline
|
||||||
|
@ Длительность & sum(cell(beg):cell(end)) & & \\
|
||||||
|
\hline
|
||||||
|
\end{spreadtab}
|
||||||
|
|
||||||
|
\subsection{Подробности}
|
||||||
|
\subsubsection{Организационный момент}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
|
||||||
|
\item \textbf{Тайминг:} 3-5 минут.
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Презентует название курса (первый раз) и семинара;
|
||||||
|
\item Рассказывает немного о себе;
|
||||||
|
\item Запрашивает активность от аудитории в чате;
|
||||||
|
\item Презентует цели курса и семинара;
|
||||||
|
\item Презентует краткий план семинара и что студент научится делать.
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Quiz}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
|
||||||
|
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
|
||||||
|
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Вопросы и ответы:}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Какой механизм используется для непосредственного исполнения скомпилированного кода? (3)
|
||||||
|
\begin{enumerate}
|
||||||
|
\item JDK;
|
||||||
|
\item JRE;
|
||||||
|
\item JVM.
|
||||||
|
\end{enumerate}
|
||||||
|
\item Сущность, объединяющая классы по смыслу (1)
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Пакет;
|
||||||
|
\item Фреймворк;
|
||||||
|
\item Библиотека.
|
||||||
|
\end{enumerate}
|
||||||
|
\item Основная единица исходного кода программы. (1)
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Класс;
|
||||||
|
\item Пакет;
|
||||||
|
\item Функция.
|
||||||
|
\end{enumerate}
|
||||||
|
\item Какой ключ используется для указания директории назначения в командах компилятора? (2)
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \code{-out};
|
||||||
|
\item \code{-d};
|
||||||
|
\item \code{-classpath}
|
||||||
|
\end{enumerate}
|
||||||
|
\end{enumerate}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Рассмотрение ДЗ}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Пояснить неочевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
|
||||||
|
\item \textbf{Тайминг:} 15-20 минут.
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
|
||||||
|
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Домашнее задание из лекции:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=100mm]{sem-01-struct.png}
|
||||||
|
\caption{Структура проекта}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
|
||||||
|
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
|
||||||
|
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
|
||||||
|
java -classpath ./out ru.gb.jcore.sample.Main
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=60mm]{sem-01-hw2-compile.png}
|
||||||
|
\caption{Результат компиляции}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
|
||||||
|
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=120mm]{sem-01-hw2-doc.png}
|
||||||
|
\caption{Результат создания документации}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}
|
||||||
|
|
||||||
|
\lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=80mm]{sem-01-hw03.png}
|
||||||
|
\caption{Результат выполнения тасков}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Вопросы и ответы}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
|
||||||
|
\item \textbf{Тайминг} 5-15 минут
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
|
||||||
|
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
|
||||||
|
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
|
||||||
|
\item Посоветовать литературу на тему заданного вопроса;
|
||||||
|
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 1}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Создание, компиляция и запуск проектов без использования среды разработки.
|
||||||
|
\item \textbf{Тайминг} 10-20 минут.
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
|
||||||
|
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello, world!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
|
||||||
|
javac Main.java
|
||||||
|
java Main
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] отделить исходный код от скомпилированных файлов
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{lstlisting}[style=ASMStyle]
|
||||||
|
javac -d out Main.java
|
||||||
|
java -classpath ./out Main
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
|
||||||
|
Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
|
||||||
|
\begin{lstlisting}[style=ASMStyle]
|
||||||
|
javac -d out ru/gb/jcore/Main.java
|
||||||
|
java -classpath ./out ru.gb.jcore.Main
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 2}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
|
||||||
|
\item \textbf{Тайминг} 10-15 минут.
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
|
||||||
|
\item Пояснить студентам в каком виде выполнять и сдавать задания;
|
||||||
|
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=120mm]{sem-01-t2-1.png}
|
||||||
|
\caption{Вариант решения}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\item [$*_1$] осуществить форматированный вывод
|
||||||
|
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
|
||||||
|
System.out.print("Your number is " + a);
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] сохранить форматирующую строку в ячейке с переменной
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=120mm]{sem-01-t2-2.png}
|
||||||
|
\caption{Вариант решения}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Задание 3}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации.
|
||||||
|
\item \textbf{Тайминг} 15-20 минут
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
|
||||||
|
\item Выдать задание группам студентов
|
||||||
|
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}
|
||||||
|
\begin{itemize}
|
||||||
|
\item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.
|
||||||
|
|
||||||
|
\textbf{Вариант решения}
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=80mm]{sem-01-t3-1.png}
|
||||||
|
\caption{Иерархия получившегося проекта}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}
|
||||||
|
|
||||||
|
\lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
|
||||||
|
javac -sourcepath . -d out ru/gb/Simple.java
|
||||||
|
java -classpath ./out ru.gb.Simple
|
||||||
|
javadoc -d doc -sourcepath . -cp ./out -subpackages ru
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\item [$*_1$] создать документацию на каждый пакет по отдельности
|
||||||
|
|
||||||
|
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
|
||||||
|
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
|
||||||
|
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
|
||||||
|
\end{lstlisting}
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Домашнее задание}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
|
||||||
|
\item \textbf{Тайминг} 5-10 минут.
|
||||||
|
\item \textbf{Действия преподавателя}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Пояснить студентам в каком виде выполнять и сдавать задания
|
||||||
|
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
|
||||||
|
\item Объяснить к кому обращаться за помощью и где искать подсказки
|
||||||
|
\item Объяснить где взять проект заготовки для дз
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Задания}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
|
||||||
|
\item
|
||||||
|
\end{enumerate}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\subsubsection{Рефлексия и завершение семинара}
|
||||||
|
\begin{itemize}
|
||||||
|
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
|
||||||
|
\item \textbf{Тайминг:} 5-10 минут
|
||||||
|
\item \textbf{Действия преподавателя:}
|
||||||
|
\begin{itemize}
|
||||||
|
\item Запросить обратную связь от студентов.
|
||||||
|
\item Подчеркните то, чему студенты научились на занятии.
|
||||||
|
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
|
||||||
|
\item Дайте краткую обратную связь студентам.
|
||||||
|
\item Поделитесь ощущением от семинара.
|
||||||
|
\item Поблагодарите за проделанную работу.
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
|
|
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 374 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 234 KiB |
After Width: | Height: | Size: 255 KiB |
After Width: | Height: | Size: 21 KiB |
|
@ -0,0 +1,22 @@
|
||||||
|
package ru.gb.jcore.regular;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Декоратор. Он декорирует, то есть, накладывает на результат декорации.}@>
|
||||||
|
* <@\lh{dkgreen}{Внешний вид важен, поэтому этот класс существует.}@>
|
||||||
|
* */
|
||||||
|
public class Decorator {
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция декорирования числа для вывода в консоль}@>
|
||||||
|
* <@\lh{dkgreen}{в виде строки с преамбулой 'Вот Ваше число'}@>
|
||||||
|
*
|
||||||
|
* @param a <@\lh{dkgreen}{число, требующее декорации}@>
|
||||||
|
* @return <@\lh{dkgreen}{Отформатированная строка.}@>
|
||||||
|
* */
|
||||||
|
public static String decorate(int a) {
|
||||||
|
/*
|
||||||
|
* <@\lh{dkgreen}{Метод декорирует число, добавляя к нему строку}@>
|
||||||
|
* <@\lh{dkgreen}{при помощи функции форматирования строк}@>
|
||||||
|
* */
|
||||||
|
return String.format("Here is your number: %d.", a);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package ru.gb.jcore.sample;
|
||||||
|
|
||||||
|
import ru.gb.jcore.regular.Decorator;
|
||||||
|
import ru.gb.jcore.regular.OtherClass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Основной класс приложения. Здесь мы можем описать}@>
|
||||||
|
* <@\lh{dkgreen}{его основное назначение и способы взаимодействия с ним.}@>
|
||||||
|
* */
|
||||||
|
public class Main {
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Точка входа в программу. С неё всегда всё начинается.}@>
|
||||||
|
*
|
||||||
|
* @param args <@\lh{dkgreen}{стандартные аргументы командной строки}@>
|
||||||
|
* */
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int result = OtherClass.add(2, 2);
|
||||||
|
System.out.println(Decorator.decorate(result));
|
||||||
|
result = OtherClass.sub(2, 2);
|
||||||
|
System.out.println(Decorator.decorate(result));
|
||||||
|
result = OtherClass.mul(2, 2);
|
||||||
|
System.out.println(Decorator.decorate(result));
|
||||||
|
result = OtherClass.div(2, 2);
|
||||||
|
System.out.println(Decorator.decorate(result));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package ru.gb.jcore.regular;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Другой, очень полезный класс приложения. Здесь мы можем описать}@>
|
||||||
|
* <@\lh{dkgreen}{его основное назначение и способы взаимодействия с ним.}@>
|
||||||
|
* */
|
||||||
|
public class OtherClass {
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция суммирования двух целых чисел}@>
|
||||||
|
*
|
||||||
|
* @param a <@\lh{dkgreen}{первое слагаемое}@>
|
||||||
|
* @param b <@\lh{dkgreen}{второе слагаемое}@>
|
||||||
|
* @return <@\lh{dkgreen}{сумма a и b, без проверки на переполнение переменной.}@>
|
||||||
|
* */
|
||||||
|
public static int add(int a, int b) {
|
||||||
|
return a + b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция деления двух целых чисел}@>
|
||||||
|
*
|
||||||
|
* @param a <@\lh{dkgreen}{делимое}@>
|
||||||
|
* @param b <@\lh{dkgreen}{делитель}@>
|
||||||
|
* @return <@\lh{dkgreen}{частное a и b, без проверки на переполнение переменной.}@>
|
||||||
|
* */
|
||||||
|
public static int div(int a, int b) {
|
||||||
|
return a / b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция умножения двух целых чисел}@>
|
||||||
|
*
|
||||||
|
* @param a <@\lh{dkgreen}{первый множитель}@>
|
||||||
|
* @param b <@\lh{dkgreen}{второй множитель}@>
|
||||||
|
* @return <@\lh{dkgreen}{произведение a и b, без проверки на переполнение переменной.}@>
|
||||||
|
* */
|
||||||
|
public static int mul(int a, int b) {
|
||||||
|
return a * b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция вычитания двух целых чисел}@>
|
||||||
|
*
|
||||||
|
* @param a <@\lh{dkgreen}{уменьшаемое}@>
|
||||||
|
* @param b <@\lh{dkgreen}{вычитаемое}@>
|
||||||
|
* @return <@\lh{dkgreen}{разность a и b, без проверки на переполнение переменной.}@>
|
||||||
|
* */
|
||||||
|
public static int sub(int a, int b) {
|
||||||
|
return a - b; // <@\lh{dkgreen}{возврат без проверки переполнения}@>
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
SRC_DIR := src
|
||||||
|
OUT_DIR := out
|
||||||
|
DOC_DIR := doc
|
||||||
|
|
||||||
|
JC := javac
|
||||||
|
JDOC := javadoc
|
||||||
|
JSRC := -sourcepath ./$(SRC_DIR)
|
||||||
|
JCLASS := -cp ./$(OUT_DIR)
|
||||||
|
JCDEST := -d $(OUT_DIR)
|
||||||
|
JDOCDEST := -d $(DOC_DIR)
|
||||||
|
MAIN_SOURCE := ru/gb/jcore/sample/Main
|
||||||
|
MAIN_CLASS := ru.gb.jcore.sample.Main
|
||||||
|
|
||||||
|
all:
|
||||||
|
${JC} ${JSRC} ${JCDEST} ${SRC_DIR}/${MAIN_SOURCE}.java
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -R ${OUT_DIR}
|
||||||
|
|
||||||
|
run:
|
||||||
|
cd out && java ${MAIN_CLASS}
|
||||||
|
|
||||||
|
docs:
|
||||||
|
${JDOC}) ${JDOCDEST} ${JSRC} ${JCLASS} -subpackages ru
|
|
@ -0,0 +1,15 @@
|
||||||
|
package ru.bg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Это уже весьма усложнённый класс, мы будем его вызывать из простого}@>
|
||||||
|
*/
|
||||||
|
public class Complex {
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция, возвращающая какую-то строку. Возможно, даже приветствующую мир.}@>
|
||||||
|
*
|
||||||
|
* @return <@\lh{dkgreen}{строка с приветствием.}@>
|
||||||
|
* */
|
||||||
|
public static String hello() {
|
||||||
|
return "Hello, world!";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package ru.gb;
|
||||||
|
|
||||||
|
import ru.bg.Complex;
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Это простой класс. Он простой настолько, что ничего не делает}@>
|
||||||
|
*/
|
||||||
|
public class Simple {
|
||||||
|
/**
|
||||||
|
* <@\lh{dkgreen}{Функция запускающая программу и приветствующая мир.}@>
|
||||||
|
* <@\lh{dkgreen}{Наверное, самая популярная функция в мире.}@>
|
||||||
|
*
|
||||||
|
* @param args <@\lh{dkgreen}{стандартные аргументы командной строки}@>
|
||||||
|
* */
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println(Complex.hello());
|
||||||
|
}
|
||||||
|
}
|