1 © Luxoft Training 2012 Понятие Java приложения Модуль #4
2 © Luxoft Training 2012 Модуль 4 Описание класса Понятие Java-приложения Работа с экземпляром класса Понятие classpath Пакеты Java-архивы Отладка приложений
3 © Luxoft Training 2012 Идентификатор – слово используемое для наименования переменной, метода, класса или метки. Ключевые слова и зарезервированные слова не могут быть использованы в качестве идентификаторов. Идентификатор должен начинаться с буквы, символа доллара ($) или символа подчеркивания (_). Последующими символами могут быть: буквы, $, _, цифры. Описание класса
4 © Luxoft Training 2012 Ключевые слова Java
5 © Luxoft Training 2012 Класс – набор данных и методов работы с этими данными. Класс необходимо представлять как штамп, производящий экземпляры этого класса. Экземпляр – создается в runtime (в процессе выполнения программы). Представляет из себя память, выделенную под данные и инструкции JVM, как вызывать методы класса. Описание класса
6 © Luxoft Training 2012 Декларация класса: Описание класса определяет видимость класса, т.е. какие классы могут получить доступ к данному классу. Модификатор public говорит, что к такому классу могут обращаться откуда угодно. Может быть определен только один public класс в файле. class { }
7 © Luxoft Training 2012 Тело класса – это кодовый блок, содержащий данные. Его тело должно заключаться в { }. Данные – декларация переменных и методы. Стоит различать переменные класса и переменные экземпляра (об этом в следующих модулях). Описание класса
8 © Luxoft Training 2012 Метод – набор инструкций работы с данными класса, а так же с параметрами метода. Метод также представляет кодовый блок и заключается в { }. Описание класса ( ) {... }
9 © Luxoft Training 2012 Модуль 4 Описание класса Понятие Java-приложения Работа с экземпляром класса Понятие classpath Пакеты Java-архивы Отладка приложений
10 © Luxoft Training 2012 Работа любой java программы (java приложения) начинается с выполнения метода main. Простейшее приложение состоит из одного метода main. Для запуска программы в JVM, необходимо задать в командной строке java: Описание класса Внимание! Eсли указанный класс не содержит main, или не верна его сигнатуры, Возбуждается java.lang.NoSuchMethodError
11 © Luxoft Training 2012 Сигнатура метода main. Сигнатура метода public static void main(String[] args) void – возвращаемый тип. args – список аргументов командной строки. Метод main должен быть объявлен как статический. Статический метод может и должен быть вызван так: TheClass.staticMethod(...) Внимание! Время жизни программы равно времени выполнения метода main.
12 © Luxoft Training 2012 Метод создает экземпляры классов, вызывает методы этих объектов, которые могут вызывать другие методы, запрашивать ввод с консоли и т.д. Данная цепочка вызовов методов называется поток выполнения(execution thread). JVM ведет выполнение метода строго последовательно, от выражения к выражению. Описание класса
13 © Luxoft Training 2012 Модуль 4 Описание класса Понятие Java-приложения Работа с экземпляром класса Понятие classpath Пакеты Java-архивы Отладка приложений
14 © Luxoft Training 2012 Класс – это файл, содержащий байт-код, определяющий данные и методы. Экземпляр – память, выделенная под структуры данных, декларированные в классе. Для того, чтобы JVM могла работать в классом (создавать экземпляры), она должна загрузить код класса. Описание класса
15 © Luxoft Training 2012 Для того, чтобы создать экземпляр класса, используется оператор new. При этом в динамической области памяти, называемой кучей (heap), выделяется память под данные экземпляра (объекта). Размер кучи можно задать при запуске JVM. Описание класса Оператор new возвращает ссылку на созданный экземпляр класса.
16 © Luxoft Training 2012 JVM имеет специальный загрузчик (bootstrap classloader), который умеет загружать байт-код класса из файловой системы, учитывая полное имя класса. Байт-код класса можно загрузить также из другого источника. В этом случае необходимо создать специфический загрузчик. JVM сама управляет загрузкой классов. Загрузка класса
17 © Luxoft Training 2012 Работа с объектами в Java всегда ведется через ссылку. Тип ссылки определяется типом созданного объекта. Тип ссылки может совпадать с классом создаваемого объекта, либо отличаться, что является полиморфизмом. Работа с объектами
18 © Luxoft Training 2012 Описание класса
19 © Luxoft Training 2012 Конструирование и инициализация Вызов Xyz x = new Xyz() выполняет: Связывание ссылки с ее типом. Выделение памяти под объект. Выполняется явная инициализация атрибутов. Вызывается конструктор. Объектная ссылка возвращается оператором new. Объектная ссылка присваивается переменной х. Внимание! Декларация только выделит память для хранения ссылки.
20 © Luxoft Training 2012 Конструирование и инициализация Выделение памяти под ссылку Выделение памяти под объект. MyDate my_birth; new MyDate(31,3,1988)
21 © Luxoft Training 2012 Конструирование и инициализация Инициализация атрибутов Вызов конструктора.
22 © Luxoft Training 2012 Конструирование и инициализация Присвоение объектной ссылки MyDate my_birth = new MyDate(22, 7, 1964)
23 © Luxoft Training 2012 Конструирование и инициализация Две переменные ссылаются на один объект int x = 7; int y = x; MyDate s = new MyDate(22, 7, 1964); MyDate t = s; При переприсваивании t она ссылается на новый объект: t = new MyDate(22, 7, 1964);
24 © Luxoft Training 2012 Конструирование и инициализация Java поддерживает следующие виды переменных, отличающихся в области памяти и временем жизни: Свойство объекта (member) Создается когда создается объект. Размещается в куче. Cтековая переменная (local variable) Определяется в методе. Переменная класса (class member) Создается когда класс загружается загрузчиком классов. Может существовать только одна копия.
25 © Luxoft Training 2012 Размер объектов (основы) Бит. 0 или 1 Байт. 8 бит Мегабайт (MB). ~1 миллион или 2^20 байт Гигабайт (GB). ~1 миллиард или 2^30 байт
26 © Luxoft Training 2012 Размер объектов (основы) Бит. 0 или 1 Байт. 8 бит Мегабайт (MB). ~1 миллион или 2^20 байт Гигабайт (GB). ~1 миллиард или 2^30 байт Старые компьютеры: Имеется ввиду 32-разрадный компьютер с указателем в 4 байта. Новые компьютеры: Имеется ввиду 64-разрадный компьютер с указателем в 8 байт. Можно использовать больше памяти Указатели используют больше места Некоторые JVM сжимают указатели до 4 х байт.
27 © Luxoft Training 2012 Размер объекта byte 1 int 4 float 4 char 2 short 2 long 8 double 8 int[] 4N + 24 char[][] ~2MN double[][] ~8MN char[] 2N + 24 double[] 8N + 24 int[][] ~4MN bytes type Примитивные типы Одномерные массивы Двумерные массивы Внимание! Примитивные типы более подробно рассмотрены в модуле 5.
28 © Luxoft Training 2012 Размер класса Заголовок класса. 16 байт. Ссылка. 8 байт. Выравнивание снизу. Каждый объект выравнивается до кратности 8 байт.
29 © Luxoft Training 2012 Размер класса Заголовок класса. 16 байт. Ссылка. 8 байт. Выравнивание снизу. Каждый объект выравнивается до кратности 8 байт. Пример 1. Объект Data использует 32 байта памяти. class Date { int day; int month; int year;... } Заголовок класса day month year Выравнивание 16 байт 4 байт 32 байт
30 © Luxoft Training 2012 Размер класса Заголовок класса. 16 байт. Ссылка. 8 байт. Выравнивание снизу. Каждый объект выравнивается до кратности 8 байт. Пример 2. Пустая строка длинны N использует ~2N байт памяти. class String { char[] vale; int offset; int count; int hash;... } Заголовок класса value offset count Выравнивание 16 байт 8 байт(ccылка на массив) 4 байт 2N + 64 байта hash 2N + 24 байта (массив) 4 байт
31 © Luxoft Training 2012 Размер класса Сколько памяти использует объект QuickUnion как функция от N? class QuickUnion { int[] id; int[] size; int count; … }
32 © Luxoft Training 2012 Размер класса (итог) Использование памяти для различных типов. Примитивные типы: 4 байта для int, 8 байт для double.... Объектная ссылка: 8 байт Массивы: 24 байта + память для каждого элемента. Объект: 16 байт + память для каждого члена класса Вложенный класс: 8 байт Выравнивание: кратно 8 байт.
33 © Luxoft Training 2012 Работа с экземпляром класса К свойству объекта можно обратиться с помощью оператора «. » Аналогично можно вызвать метод объекта. Если метод не принимает аргументы, нужно указать (), чтоб отличить метод от свойства. Аргументы заключаются в скобки ().
34 © Luxoft Training 2012 Работа с экземпляром класса
35 © Luxoft Training 2012 Упражнение 5 Разработка приложения из 2-х классов.
36 © Luxoft Training 2012 Модуль 4 Описание класса Понятие Java-приложения Работа с экземпляром класса Понятие classpath Пакеты Java-архивы Отладка приложений
37 © Luxoft Training 2012 Понятие classpath Программа Java – это цепочка вызовов методов объектов некоторых классов, т.о. В процессе компиляции и работы программы требуется информация, где расположен байт-код необходимых классов. При запуске программы javac можно указать список путей файловой системы, где необходимо искать зависимые классы. Это спецификация путей поиска и называется classpath.
38 © Luxoft Training 2012 Понятие classpath В Windows список путей разделяется ;, в Unix : Если компилируемый java файл Person.java использует некоторые скомпилированные классы, находящиеся в c:\lib\classes, то необходимо указать компилятору данный путь через флаг -classpath javac -d bin -sourcepath src -classpath C:\lib\classes Person.java
39 © Luxoft Training 2012 Понятие classpath Аналогично можно задать classpath при запуске java приложения. Необходимые классы JVM будет искать в указанных путях. java -classpath C:\lib\classes Test Внимание! Для избегания компиляции каждого класса в отдельности, можно указать класс содержащий метод main.
40 © Luxoft Training 2012 Компиляция и выполнение
41 © Luxoft Training 2012 Модуль 4 Описание класса Понятие Java-приложения Работа с экземпляром класса Понятие classpath Пакеты Java-архивы Отладка приложений
42 © Luxoft Training 2012 Пакеты Пакет – способ организации классов. Подобно тому, как два различных файла readme.txt могут располагаться в разных директориях, java-классы тоже могут размещаться в разных директориях. Пакеты позволяют избежать коллизий классов с одинаковым именем.
43 © Luxoft Training 2012 Пакеты Для того, чтобы разместить файл HelloWorld.java в пакет world, необходимо указать имя пакета в файле с помощью ключевого слова package. Декларация пакета должна идти в самом начале файла.
44 © Luxoft Training 2012 Пакеты Для того чтобы использовать класс, необходимо указать его полное имя:
45 © Luxoft Training 2012 Пакеты Существует способ упростить способ спецификации полного имени класса, импортировав пространство имен.
46 © Luxoft Training 2012 Импорт Импорт класса не имеет ничего общего с загрузкой класса и не влияет на скорость компиляции и выполнения Можно внести все классы данного пакета в пространство имен. import package.subpackage.*;
47 © Luxoft Training 2012 Модуль 4 Описание класса Понятие Java-приложения Работа с экземпляром класса Понятие classpath Пакеты Java-архивы Отладка приложений
48 © Luxoft Training 2012 Jar-архивы Cуществует способ организации классов в zip-aрхивы для более удобного распространения группы.class файлов. Архив имеет расширения.jar. Если классы в jar-файле, то необходимо указывать имя этого файла в classpath. java –classpath c:\libs\myjar.jar thepackage.MainClass
49 © Luxoft Training 2012 Jar-архивы Для того чтобы создать Jar-файл. jar.exe cf myjar.jar MainClass.class c – создать Jar-файл f – задает имя файла
50 © Luxoft Training 2012 Jar-архивы В Jar файле можно также вручную определить специальный файл манифеста, описывающий данный JAR файл. Манифест располагается в каталогк META-INF архива. Он создается по умолчанию инструментом jar.
51 © Luxoft Training 2012 Jar-архивы Например, манифест может указывать имя класса, содержащего main (): В таком случае JVM можно запустить так: Manifest-Version: 1.0 java -jar MyJar.jar Class-Path: ojdbc14. jar Created-By: Eclipse Main-Class: MyPackage.MyClass
52 © Luxoft Training 2012 Упражнение Работа с пакетами и jar-файлами