03 start and svg

This commit is contained in:
Ivan I. Ovchinnikov 2022-12-01 17:12:34 +03:00
parent fbf148ee14
commit 3199161d12
6 changed files with 837 additions and 30 deletions

Binary file not shown.

View File

@ -1,31 +1,85 @@
\documentclass[j-spec.tex]{subfiles} \documentclass[j-spec.tex]{subfiles}
\begin{document} \begin{document}
%\setcounter{tocdepth}{3} \pagestyle{plain}
\sloppy
\tableofcontents \tableofcontents
\section{Специализация: данные и функции} \section{Специализация: ООП}
\subsection{В предыдущем разделе} \subsection{В предыдущем разделе}
Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами). Будет рассмотрен базовый функционал языка, то есть основная встроенная функциональность, такая как математические операторы, условия, циклы, бинарные операторы. Далее способы хранения и представления данных в Java, и в конце способы манипуляции данными, то есть функции (в терминах языка называющиеся методами).
\subsection{В этом разделе} \subsection{В этом разделе}
Разберём такие основополагающих в Java вещи, как классы и объекты, а также с тем, как применять на практике основные принципы ООП: наследование, полиморфизм и инкапсуляцию. Дополнительно рассмотрим устройство памяти в джава. Разберём такие основополагающих в Java вещи, как классы и объекты, а также с тем, как применять на практике основные принципы ООП: наследование, полиморфизм и инкапсуляцию. Дополнительно рассмотрим устройство памяти в джава.
\begin{itemize} \begin{itemize}
\item \nom{класс}{- } \item \nom{Класс}{определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java. Определяет новый тип данных};
\item \nom{объект}{- } \item \nom{Объект}{конкретный экземпляр класса, созданный в программе};
\item \nom{статика}{- } \item \nom{Статика}{(статический контекст) - };
\item \nom{стек}{- } \item \nom{Стек}{- };
\item \nom{куча}{- } \item \nom{Куча}{- };
\item \nom{сборщик мусора}{- } \item \nom{Сборщик мусора}{- };
\item \nom{конструктор}{- } \item \nom{Конструктор}{- };
\item \nom{вложенный класс}{- } \item \nom{Вложенный класс}{- };
\item \nom{внутренний класс}{- } \item \nom{Внутренний класс}{- };
\item \nom{инкапсуляция}{- } \item \nom{Инкапсуляция}{- };
\item \nom{наследование}{- } \item \nom{Наследование}{- };
\item \nom{полиморфизм }{- } \item \nom{Полиморфизм }{- };
\end{itemize} \end{itemize}
\subsection{Классы и объекты, поля и методы, статика}
\subsubsection{Классы}
Что такое класс? С точки зрения ООП, \textbf{класс} определяет форму и сущность объекта и является логической конструкцией, на основе которой построен весь язык Java.
\begin{lstlisting}[language=Java,style=JCodeStyle] \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; package ru.gb.jcore;
public class Cat { public class Cat {
@ -35,12 +89,25 @@ public class Cat {
} }
\end{lstlisting} \end{lstlisting}
\begin{frm} \excl
Для новичка важно не запутаться, класс кота мы описали в отдельном файле, а создавать объекты и совершать манипуляции следует в основном классе программы, не может же кот назначить имя сам себе.
\end{frm}
Мы рассказали программе, что такое коты, теперь если мы хотим создать в нашем приложении конкретного кота, следует воспользоваться оператором \code{new Cat();} в основном классе программы. Более подробно разберём, что происходит в этой строке, чуть позже, пока же нам достаточно знать, что мы создали объект типа \code{Cat} (экземпляр класса \code{Cat}), и запомнить эту конструкцию. Для того чтобы с ним (экземпляром) работать, можем положить его в переменную, которой дать идентификатор \code{cat1}.
\begin{lstlisting}[language=Java,style=JCodeStyle] \begin{lstlisting}[language=Java,style=JCodeStyle]
Сat cat0; Сat cat0;
cat0 = new Cat(); cat0 = new Cat();
Cat cat1 = new Cat(); Cat cat1 = new Cat();
\end{lstlisting} \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] \begin{lstlisting}[language=Java,style=JCodeStyle]
package ru.gb.jcore; package ru.gb.jcore;
@ -58,19 +125,64 @@ public class Main{
cat2.color = "Black"; cat2.color = "Black";
cat2.age = 6; cat2.age = 6;
System.out.println("Cat1 named: " + cat1.name + " is " + cat1.color + " has age: " + cat1.age); System.out.println("Cat1 named: " + cat1.name +
System.out.println("Cat2 named: " + cat2.name + " is " + cat2.color + " has age: " + cat2.age); " is " + cat1.color +
" has age: " + cat1.age);
System.out.println("Cat2 named: " + cat2.name +
" is " + cat2.color +
" has age: " + cat2.age);
} }
} }
\end{lstlisting} \end{lstlisting}
в результате работы программы в консоли появятся следующие строки:
\begin{verbatim} \begin{verbatim}
Cat1 named: Barsik is White has age: 4 Cat1 named: Barsik is White has age: 4
Cat2 named: Murzik is Black has age: 6 Cat2 named: Murzik is Black has age: 6
\end{verbatim} \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{0.42}
\fontsize{6}{1}\selectfont
\input{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] \begin{lstlisting}[language=Java,style=JCodeStyle]
Cat cat1 = new Cat(); Сat 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; Cat cat2 = cat1;
cat1.name = "Barsik"; cat1.name = "Barsik";
@ -81,9 +193,59 @@ Cat cat1 = new Cat();
cat2.color = "Black"; cat2.color = "Black";
cat2.age = 6; cat2.age = 6;
System.out.println("Cat1 named: " + cat1.name + " is " + cat1.color + " has age: " + cat1.age); System.out.println("Cat1 named: " + cat1.name +
System.out.println("Cat2 named: " + cat2.name + " is " + cat2.color + " has age: " + cat2.age); " is " + cat1.color +
" has age: " + cat1.age);
System.out.println("Cat2 named: " + cat2.name +
" is " + cat2.color +
" has age: " + cat2.age);
\end{lstlisting} \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{frm}\info
Множественные ссылки на один и тот же объект в памяти довольно легко себе представить как ярлыки для запуска одной и той же программы на рабочем столе и в меню быстрого запуска. Или если на один и тот же шкафчик в раздевалке наклеить два номера - сам шкафчик можно будет найти по двум ссылкам на него.
\end{frm}
\subsubsection{Методы}
Ранее было сказано о том, что в языке Java любая программа состоит из классов и функций, которые могут описываться только внутри них. Именно поэтому все функции в языке Java являются методами. А метод - это функция, являющаяся частью некоторого класса, которая может выполнять операции над данными этого класса.
\begin{frm} \info
Метод - это функция, принадлежащая классу
\end{frm}
Метод для своей работы может использовать поля объекта и/или класса, в котором определен, напрямую, без необходимости передавать их во входных параметрах. Это похоже на использование глобальных переменных в функциях, но в отличие от глобальных переменных, метод может получать прямой доступ только к членам класса. Самые простые методы работают с данными объектов. Методы чаще всего формируют API классов, то есть способ взаимодействия с классами, интерфейс. Место методов во взаимодействии классов и объектов показано на рис. \hrf{pic:class-obj-nostatic}.
\begin{figure}[H]
\centering
\def\svgscale{0.42}
\fontsize{6}{1}\selectfont
\input{pics/jc-03-class-obj-nostatic.svg}
\caption{Логическая структура отношения класс-объект}
\label{pic:class-obj-nostatic}
\end{figure}
Лайвкод 03-метод & Вернёмся к примеру с котиками. Все мы знаем, что котики умеют урчать, мяукать и смешно прыгать. В целях демонстрации мы в описании этих действий просто будем делать разные выводы в консоль, хотя мы и можем научить нашего котика выбирать минимальное значение из массива, но это было бы неожиданно. Итак опишем метод например подать голос и прыгать. \\ \hline
Лайвкод 03-метод-вызов & Обращение к методам выглядит очень похожим на стандартный способом, через точку, как к полям. Теперь когда мы хотим позвать нашего котика, он нам скажет, мяу, я имя котика, а если мы решили что котику надо прыгать, он решит, прилично-ли это - прыгать в его возрасте. Как видно, барсик замечательно прыгает, а мурзик от прыжков воздержался, хотя попрыгать мы попросили их обоих \\ \hline
\subsubsection{Задание для самопроверки}
\begin{enumerate}
\item Что такое класс?
\item Что такое поле класса?
\item На какие три этапа делится создание объекта?
\end{enumerate}
\subsection{Стек и куча}
\subsection{Сборка мусора}
\subsection{Конструкторы}
\subsection{Инкапсуляция}
\subsection{Наследование}
\subsection{Полиморфизм}
\begin{verbatim} \begin{verbatim}
Cat1 named: Murzik is Black has age: 6 Cat1 named: Murzik is Black has age: 6
Cat2 named: Murzik is Black has age: 6 Cat2 named: Murzik is Black has age: 6
@ -159,6 +321,7 @@ public class Cat {
ключевое слово this в Java используется только в составе экземпляра класса. Но неявно ключевое слово this передается во все методы, кроме статических (поэтому this часто называют неявным параметром) и может быть использовано для обращения к объекту, вызвавшему метод. ключевое слово this в Java используется только в составе экземпляра класса. Но неявно ключевое слово this передается во все методы, кроме статических (поэтому this часто называют неявным параметром) и может быть использовано для обращения к объекту, вызвавшему метод.
\newpage
\printnomenclature[40mm] \printnomenclature[40mm]
\end{document} \end{document}

View File

@ -0,0 +1,196 @@
<?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-class-obj-fields.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="#ffffff"
inkscape:document-units="mm"
showgrid="true"
showborder="false"
inkscape:zoom="4"
inkscape:cx="174.5"
inkscape:cy="366.875"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid1775" />
</sodipodi:namedview>
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker2885"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="RoundedArrow"
markerWidth="6.1347523"
markerHeight="5.9304953"
viewBox="0 0 6.1347524 5.9304951"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path2883" />
</marker>
<marker
style="overflow:visible"
id="RoundedArrow"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="RoundedArrow"
markerWidth="6.1347523"
markerHeight="5.9304953"
viewBox="0 0 6.1347524 5.9304951"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path1367" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="34.229366"
y="78.023079"
id="text2194"><tspan
sodipodi:role="line"
id="tspan2192"
style="stroke-width:0.264583"
x="34.229366"
y="78.023079">class</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="86.016037"
id="text2248"><tspan
sodipodi:role="line"
id="tspan2246"
style="stroke-width:0.264583"
x="21.193127"
y="86.016037">fields</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect2476"
width="37.041668"
height="37.041668"
x="19.870209"
y="72.786873" />
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="80.724373"
y="80.724373"
id="text2480"><tspan
sodipodi:role="line"
id="tspan2478"
style="stroke-width:0.264583"
x="80.724373"
y="80.724373">object1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="75.432709"
y="86.016045"
id="text2484"><tspan
sodipodi:role="line"
id="tspan2482"
style="stroke-width:0.264583"
x="75.432709"
y="86.016045">field values</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="80.724373"
y="99.245209"
id="text2480-1"><tspan
sodipodi:role="line"
id="tspan2478-9"
style="stroke-width:0.264583"
x="80.724373"
y="99.245209">object2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="75.432709"
y="104.53688"
id="text2484-0"><tspan
sodipodi:role="line"
id="tspan2482-7"
style="stroke-width:0.264583"
x="75.432709"
y="104.53688">field values</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="path2575"
sodipodi:type="arc"
sodipodi:cx="87.338959"
sodipodi:cy="82.708748"
sodipodi:rx="15.875"
sodipodi:ry="7.2760415"
sodipodi:start="1.5416778"
sodipodi:end="1.5346556"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="m 87.80115,89.981705 a 15.875,7.2760415 0 0 1 -16.329626,-7.048352 15.875,7.2760415 0 0 1 15.349531,-7.496774 15.875,7.2760415 0 0 1 16.383515,7.02203 15.875,7.2760415 0 0 1 -15.292002,7.521429" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="path2575-1"
sodipodi:type="arc"
sodipodi:cx="87.338959"
sodipodi:cy="101.22958"
sodipodi:rx="15.875"
sodipodi:ry="7.2760415"
sodipodi:start="1.5416778"
sodipodi:end="1.5346556"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="m 87.80115,108.50254 a 15.875,7.2760415 0 0 1 -16.329626,-7.04835 15.875,7.2760415 0 0 1 15.349531,-7.496775 15.875,7.2760415 0 0 1 16.383515,7.022035 15.875,7.2760415 0 0 1 -15.292002,7.52142" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#RoundedArrow)"
d="M 71.463957,83.370207 58.234792,87.338958"
id="path2662"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2885)"
d="M 71.463957,100.56812 58.234792,96.599375"
id="path2664"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@ -0,0 +1,240 @@
<?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-class-obj-full.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="#ffffff"
inkscape:document-units="mm"
showgrid="true"
showborder="false"
inkscape:zoom="4"
inkscape:cx="174.5"
inkscape:cy="366.875"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid1775" />
</sodipodi:namedview>
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker2885"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="RoundedArrow"
markerWidth="6.1347523"
markerHeight="5.9304953"
viewBox="0 0 6.1347524 5.9304951"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path2883" />
</marker>
<marker
style="overflow:visible"
id="RoundedArrow"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="RoundedArrow"
markerWidth="6.1347523"
markerHeight="5.9304953"
viewBox="0 0 6.1347524 5.9304951"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path1367" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="34.229366"
y="78.023079"
id="text2194"><tspan
sodipodi:role="line"
id="tspan2192"
style="stroke-width:0.264583"
x="34.229366"
y="78.023079">class</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="86.016037"
id="text2248"><tspan
sodipodi:role="line"
id="tspan2246"
style="stroke-width:0.264583"
x="21.193127"
y="86.016037">fields</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="91.307701"
id="text2252"><tspan
sodipodi:role="line"
id="tspan2250"
style="stroke-width:0.264583"
x="21.193127"
y="91.307701">methods</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="96.599365"
id="text2256"><tspan
sodipodi:role="line"
id="tspan2254"
style="stroke-width:0.264583"
x="21.193127"
y="96.599365">static fields</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="101.89104"
id="text2260"><tspan
sodipodi:role="line"
id="tspan2258"
style="stroke-width:0.264583"
x="21.193127"
y="101.89104">static methods</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="107.1827"
id="text2264"><tspan
sodipodi:role="line"
id="tspan2262"
style="stroke-width:0.264583"
x="21.193127"
y="107.1827">static field values</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect2476"
width="37.041668"
height="37.041668"
x="19.870209"
y="72.786873" />
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="80.724373"
y="80.724373"
id="text2480"><tspan
sodipodi:role="line"
id="tspan2478"
style="stroke-width:0.264583"
x="80.724373"
y="80.724373">object1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="75.432709"
y="86.016045"
id="text2484"><tspan
sodipodi:role="line"
id="tspan2482"
style="stroke-width:0.264583"
x="75.432709"
y="86.016045">field values</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="80.724373"
y="99.245209"
id="text2480-1"><tspan
sodipodi:role="line"
id="tspan2478-9"
style="stroke-width:0.264583"
x="80.724373"
y="99.245209">object2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="75.432709"
y="104.53688"
id="text2484-0"><tspan
sodipodi:role="line"
id="tspan2482-7"
style="stroke-width:0.264583"
x="75.432709"
y="104.53688">field values</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="path2575"
sodipodi:type="arc"
sodipodi:cx="87.338959"
sodipodi:cy="82.708748"
sodipodi:rx="15.875"
sodipodi:ry="7.2760415"
sodipodi:start="1.5416778"
sodipodi:end="1.5346556"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="m 87.80115,89.981705 a 15.875,7.2760415 0 0 1 -16.329626,-7.048352 15.875,7.2760415 0 0 1 15.349531,-7.496774 15.875,7.2760415 0 0 1 16.383515,7.02203 15.875,7.2760415 0 0 1 -15.292002,7.521429" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="path2575-1"
sodipodi:type="arc"
sodipodi:cx="87.338959"
sodipodi:cy="101.22958"
sodipodi:rx="15.875"
sodipodi:ry="7.2760415"
sodipodi:start="1.5416778"
sodipodi:end="1.5346556"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="m 87.80115,108.50254 a 15.875,7.2760415 0 0 1 -16.329626,-7.04835 15.875,7.2760415 0 0 1 15.349531,-7.496775 15.875,7.2760415 0 0 1 16.383515,7.022035 15.875,7.2760415 0 0 1 -15.292002,7.52142" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#RoundedArrow)"
d="M 71.463957,83.370207 58.234792,87.338958"
id="path2662"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2885)"
d="M 71.463957,100.56812 58.234792,96.599375"
id="path2664"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -0,0 +1,207 @@
<?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-class-obj-nostatic.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="#ffffff"
inkscape:document-units="mm"
showgrid="true"
showborder="false"
inkscape:zoom="4"
inkscape:cx="174.5"
inkscape:cy="366.875"
inkscape:window-width="2560"
inkscape:window-height="1387"
inkscape:window-x="-8"
inkscape:window-y="22"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid1775" />
</sodipodi:namedview>
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker2885"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="RoundedArrow"
markerWidth="6.1347523"
markerHeight="5.9304953"
viewBox="0 0 6.1347524 5.9304951"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path2883" />
</marker>
<marker
style="overflow:visible"
id="RoundedArrow"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="RoundedArrow"
markerWidth="6.1347523"
markerHeight="5.9304953"
viewBox="0 0 6.1347524 5.9304951"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.7)"
d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
id="path1367" />
</marker>
</defs>
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="34.229366"
y="78.023079"
id="text2194"><tspan
sodipodi:role="line"
id="tspan2192"
style="stroke-width:0.264583"
x="34.229366"
y="78.023079">class</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="86.016037"
id="text2248"><tspan
sodipodi:role="line"
id="tspan2246"
style="stroke-width:0.264583"
x="21.193127"
y="86.016037">fields</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="21.193127"
y="91.307701"
id="text2252"><tspan
sodipodi:role="line"
id="tspan2250"
style="stroke-width:0.264583"
x="21.193127"
y="91.307701">methods</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="rect2476"
width="37.041668"
height="37.041668"
x="19.870209"
y="72.786873" />
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="80.724373"
y="80.724373"
id="text2480"><tspan
sodipodi:role="line"
id="tspan2478"
style="stroke-width:0.264583"
x="80.724373"
y="80.724373">object1</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="75.432709"
y="86.016045"
id="text2484"><tspan
sodipodi:role="line"
id="tspan2482"
style="stroke-width:0.264583"
x="75.432709"
y="86.016045">field values</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="80.724373"
y="99.245209"
id="text2480-1"><tspan
sodipodi:role="line"
id="tspan2478-9"
style="stroke-width:0.264583"
x="80.724373"
y="99.245209">object2</tspan></text>
<text
xml:space="preserve"
style="font-size:4.9389px;line-height:1.25;font-family:'PT Astra Serif';-inkscape-font-specification:'PT Astra Serif';stroke-width:0.264583"
x="75.432709"
y="104.53688"
id="text2484-0"><tspan
sodipodi:role="line"
id="tspan2482-7"
style="stroke-width:0.264583"
x="75.432709"
y="104.53688">field values</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="path2575"
sodipodi:type="arc"
sodipodi:cx="87.338959"
sodipodi:cy="82.708748"
sodipodi:rx="15.875"
sodipodi:ry="7.2760415"
sodipodi:start="1.5416778"
sodipodi:end="1.5346556"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="m 87.80115,89.981705 a 15.875,7.2760415 0 0 1 -16.329626,-7.048352 15.875,7.2760415 0 0 1 15.349531,-7.496774 15.875,7.2760415 0 0 1 16.383515,7.02203 15.875,7.2760415 0 0 1 -15.292002,7.521429" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264999;stroke-linecap:square;paint-order:stroke markers fill"
id="path2575-1"
sodipodi:type="arc"
sodipodi:cx="87.338959"
sodipodi:cy="101.22958"
sodipodi:rx="15.875"
sodipodi:ry="7.2760415"
sodipodi:start="1.5416778"
sodipodi:end="1.5346556"
sodipodi:open="true"
sodipodi:arc-type="arc"
d="m 87.80115,108.50254 a 15.875,7.2760415 0 0 1 -16.329626,-7.04835 15.875,7.2760415 0 0 1 15.349531,-7.496775 15.875,7.2760415 0 0 1 16.383515,7.022035 15.875,7.2760415 0 0 1 -15.292002,7.52142" />
<path
style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#RoundedArrow)"
d="M 71.463957,83.370207 58.234792,87.338958"
id="path2662"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2885)"
d="M 71.463957,100.56812 58.234792,96.599375"
id="path2664"
sodipodi:nodetypes="cc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

1
scenarios/.#jtc3-03b.tex Normal file
View File

@ -0,0 +1 @@
Ovchinnikov_II@OVCHINNIKOV_II.21588:1669277770