Академический Документы
Профессиональный Документы
Культура Документы
Java
План
1. Введение в Java-технологии
2. Синтаксис языка Java
3. Массивы и строки
4. Объектно-ориентированное программирование
5. Исключения
6. Потоковый ввод-вывод
7. Коллекции
8. Графический пользовательский интерфейс
9. События
10.Java2D
11.Потоки исполнения
Введение в Java-технологии
1. Переносимость
Программы, написанные на языке Java, после однократной трансляции в
байт-код могут быть исполнены на любой платформе, для которой
реализована виртуальная Java-машина.
Особенности Java-технологии
2. Безопасность
Функционирование программы полностью определяется (и ограничивается)
виртуальной Java-машиной.
3. Надежность
В языке Java отсутствуют механизмы, потенциально приводящие к ошибкам:
арифметика указателей, неявное преобразование типов с потерей точности и
т.п.
4. Сборщик мусора
Освобождение памяти при работе программы осуществляется автоматически
с помощью «сборщика мусора».
5. Самодокументируемый код
Имеется механизм автоматического генерирования документации на основе
комментариев, размещенных в тексте программ.
Особенности Java-технологии
1. Приложения (application)
обычные прикладные программы, которые запускаются пользователем и
имеют доступ ко всем ресурсам компьютера наравне с любыми другими
программами.
Типы Java-приложений
2. Мидлеты (midlet)
специализированные программы, предназначенные для использования на
мобильных устройствах. Структура и возможности мидлетов обусловлены
техническими особенностями мобильных устройств.
Типы Java-приложений
3. Апплеты (applet)
специализированные программы, обычно небольшого размера, запускаемые
браузером внутри web-документа для вывода динамического содержимого
и/или интерактивного взаимодействия с пользователем.
Типы Java-приложений
5. Сервлеты (servlet)
специализированные программы, функционирующие в рамках web-сервера и
имеющие доступ к его ресурсам: файлам, базам данных и т.п.
byte -27 27 – 1
short -215 215 – 1
int -231 231 – 1
long -263 263 – 1
Все целочисленные типы знаковые.
Вещественные типы данных отличаются точностью представления
значений:
Константы
true – «истина»
false – «ложь»
Целочисленные константы могут быть записаны в трех системах
счисления:
Например:
2147483648L
0xABCDEFL
Вещественные константы могут быть записаны в десятичной или
шестнадцатеричной системах счисления.
Признаком десятичной вещественной константы служит:
–десятичный разделитель ‘.’;
–экспоненциальная часть, начинающаяся с ‘E’;
–суффикс типа данных – ‘F’ (float) или ‘D’ (double).
Например:
0x3P-5 → 3 ∙ 2-5
0xB.8P10 → 11.5 ∙ 210.
Символьные константы представляют собой отдельные символы,
записанные в одиночных кавычках (апострофах).
/,%
действие зависит от типа операндов
>>
знаковый сдвиг
>>>
беззнаковый сдвиг
Операторы отношения <, >, = =, <=, >=, != позволяют сравнивать
значения двух совместимых между собой примитивных типов данных.
–оператор отрицания !;
–операторы полных логических операций
& («и»), | («или»), ^ («исключающее или»);
–операторы сокращенных логических операций
&& («и»), || («или»).
Например:
(x==y) || (x==–y)
(n!=0) && (m/n>0)
Условный оператор ? : позволяет вычислить значение одного из двух
выражений в зависимости от истинности некоторого условия.
Например: a>b ? a : b
Операторы присваивания позволяют менять значение переменных.
{
// . . .
int x;
// . . . область
// . . . видимости
// . . . переменной
}
В языке Java не разрешается повторно использовать имена переменных
внутри вложенных блоков:
{
// . . .
int x;
// . . .
{
// . . .
double x; // ошибка!
// . . .
}
// . . .
}
Если при объявлении переменной был использован модификатор final,
то значение такой переменной изменить нельзя.
final int x;
// . . .
x=18; // ошибка!
До первого использования переменным должно быть присвоено
значение.
int x;
x=5;
byte a=10;
byte b=20;
int c=a+b;
2. Если в одной операции смешиваются операнды разных типов, то
тип операнда с меньшей точностью приводится к типу операнда с большей
точностью:
int ® long
int, long ® float
int, long, float ® double
double c = 16 / 5;
но
int a = 15.0 / 3.0; // ошибка
В выражениях можно использовать явное преобразование типа
операндов:
byte a=10;
byte b=20;
byte c=(byte)(a+b);
int c=(int)(15.0/3.0);
Математические функции и константы
}
Структурные операторы
if (условие) {
операторы1;
} else {
операторы2;
}
Оператор цикла с предусловием
или
while (условие) {
операторы;
}
Оператор цикла с постусловием
или
do {
операторы;
} while (условие);
Оператор цикла с параметром
for(список1;условие;список2) оператор;
или
for(список1;условие;список2) {
операторы;
}
Операторы управления итерациями
switch (выражение) {
case константа1: оператор1;
case константа2: оператор2;
case константа3: оператор3;
...
default: оператор;
}
switch (выражение) {
case константа1:
case константа2:
case константа3: оператор;
После входа выполняются операторы до конца всей конструкции.
switch (выражение) {
case константа1: оператор1; break;
case константа2: оператор2; break;
case константа3: оператор3; break;
Массивы и строки
В языке Java массивы и строки являются специальными видами
объектов.
При работе с массивами обязательно должны выполняться следующие
виды операций:
–объявление массивов;
–создание массивов;
тип имя[];
или
тип[] имя;
Создание массивов
S=0;
for(int i=0;i<A.length;i++) {
S+=A[i];
}
Для обработки всех элементов массива может использоваться
специальная форма записи цикла for, не содержащая в явном виде параметра
цикла:
for(тип имя : массив) {
операторы;
}
Например:
S=0;
for(double element : A) {
S+=element;
}
Операции над массивами
–присваивание: a=b;
при присваивании копируется ссылка, т.е. обе переменных будут ссылаться
на один и тот же массив;
S=0;
for ( int i=0 ; i<mas2D.length ; i++ )
for ( int j=0 ; j<mas2D[i].length ; j++ )
S+=mas2D[i][j];
int length()
получение длины строки:
int n = str.length();
char charAt(int индекс)
получение одного символа из указанной позиции:
char c = str.charAt(i);
String str="обороноспособность";
char c='о';
int n=0;
for(int i=0;i<str.length();i++)
if ( c==str.charAt(i) ) n++;
boolean equals(String строка)
сравнение строк
if ( str1==str2 )
if ( str1.equals(str2) )
if ("admin".equalsIgnoreCase(user)
&& "q1G#bas.8".equals(password) )
{
System.out.println("Добро пожаловать!");
}
else
{
System.out.println("Посторонним вход запрещен!");
}
boolean contains(String подстрока)
содержит ли строка заданную подстроку?
String sex="неизвестный";
if ( prilag.endsWith("ый") || prilag.endsWith("ий") )
sex="мужской";
if ( prilag.endsWith("ая") || prilag.endsWith("яя") )
sex="женский";
if ( prilag.endsWith("ое") || prilag.endsWith("ее") )
sex="средний";
nachalo=stroka.indexOf( '(' );
konec=stroka.indexOf( ')', nachalo );
String text=stroka.substring(nachalo+1,konec);
String toLowerCase()
возвращает копию строки в нижнем регистре
String toUpperCase()
возвращает копию строки в верхнем регистре
Класс StringBuilder
объект.метод1(…).метод2(…).метод3(…);
вместо
объект.метод1(…);
объект.метод2(…);
объект.метод3(…);
StringBuilder append(что)
используется для добавления к объекту других строк и строковых
представлений значений примитивных типов (13 вариантов)
Объектно-ориентированное программирование
Java относится к группе объектно-ориентированных языков
программирования.
Основная идея ООП заключается в том, что программа представляется
в виде совокупности взаимодействующих между собой объектов.
Каждый объект содержит набор данных, которые определяют текущее
состояние объекта.
private
доступ разрешен только из методов данного класса
protected
доступ разрешен только из методов данного класса и его подклассов
public
доступ разрешен из методов любых классов
нет обозначения
доступ разрешен из методов классов из текущего пакета
Виды модификаторов
static
данное поле является общим для всех экземпляров класса (переменная
класса)
final
значение данного поля не может быть изменено
class Point {
double x;
double y;
}
В языке Java классы относятся к ссылочным типам данным. Это значит,
что все для работы с объектами простого описания полей или переменных
недостаточно.
имяПеременной . имяПоля
или
имяПеременной . имяМетода (параметры)
Например:
A.x = 5;
A.y = 7;
Синтаксис описания методов
[доступ] [модификаторы]
ВозвращаемыйТип имяМетода ( [СписокПараметров] )
[throws СписокИсключений] {
// тело метода
}
Виды модификаторов
static
действие метода не зависит от конкретного объекта (метод класса)
final
данный метод не может быть переопределен в подклассах
Для доступа к статическим полям и методам объекта (переменным
класса и методам класса) используется следующий синтаксис:
ИмяКласса . имяПоля
или
ИмяКласса . имяМетода (параметры)
Например:
Math.PI
String.valueOf(…)
Внутри метода для доступа полям и методам текущего объекта может
быть использован идентификатор this:
this . имяПоля
или
this . имяМетода (параметры)
Для возвращения значения из метода используется оператор return:
return выражение;
Если метод не должен возвращать значение, в заголовке метода вместо
возвращаемого типа должно указываться ключевое слово void.
Пример. Описание класса «Отрезок».
class Segment {
Point p1;
Point p2;
Point getMidpoint() {
Point p = new Point();
p.x = (p1.x+p2.x)/2;
p.y = (p1.y+p2.y)/2;
return p;
}
}
Инкапсуляция
Принцип инкапсуляции означает, что доступ извне к состоянию объекта
ограничивается или запрещается.
public Point() {
x=0;
y=0;
}
public Point() {
x=0;
y=0;
}
ß
public Point() {
this(0,0);
}
Пример. Реализация метода getMidpoint с использованием getter'ов и
конструктора
String toString()
получить текстовое представление объекта
private double z;
User u;
Student s = new Student("n2008999","12345","П22");
Teacher t = new Teacher("kuntsevich","***","ПМиМ");
u=s; // Ok!
u=t; // Ok!
s=u; // Ошибка!
t=u; // Ошибка!
Пример. Использование полиморфизма при вызове метода
Абстрактные классы
}
Пример. Класс "Окружность"
private double r;
}
Различия между классами и интерфейсами
package имя.пакета;
// создание файла
java.io.File file;
file = new java.io.File("s:/myfile.txt");
// создание точки
java.awt.Point point;
point = new java.awt.Point(x,y);
В качестве имени пакета компанией Sun рекомендуется использовать
доменное имя сайта, записанное в обратном порядке. Это гарантирует
уникальность имени пакета во всем мире, например:
com.sun.media.sound
пакет компании Sun для работы со звуком
org.w3c.dom.html
пакет организации World Wide Web Consortium для работы с языком HTML
org.netbeans.modules.image
пакет Netbeans для работы с изображениями
В некоторых случаях разрешается использовать краткие имена классов:
import имя.пакета1.ИмяКласса1;
import имя.пакета2.ИмяКласса2;
import имя.пакета.*;
Пример.
package my.labs.lab5;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.StringReader;
...
Исключения
try {
// ... операторы, при выполнении которых возможна ИС
}
catch (ТипИС переменная) {
// ... обработка ИС
}
// ...
finally {
// ... блок освобождения ресурсов
}
Блок try
содержит команды, при выполнении которых возможно возникновение
исключений
Блок catch
содержит команды, выполняемые при возникновении того или иного типа
исключений
Блок finally
содержит команды, выполняемые независимо от наличия исключения
void printStackTrace()
выводит стек исполнения на экран
String getMessage()
возвращает текст сообщения об ошибке
String toString()
возвращает строку с описанием исключения (тип: сообщение)
Throwable getCause()
возвращает ссылку на связанное исключение
(если оно есть)
Базовая иерархия классов исключений
Throwable
Error Exception
VirtualMachineError RuntimeException
java.lang.Error
описывает серьезную проблему, с которой обычное приложение не может
справиться (например, LinkageError)
java.lang.VirtualMachineError
описывает ошибки, возникающие при работе виртуальной машины
(например, OutOfMemoryError, StackOverflowError)
java.lang.Exception
описывает исключения, возможность возникновения которых может быть
выявлена на этапе компиляции.
В большинстве случаев источник возникновения исключений расположен за
пределами приложения (например, IOException, PrinterException,
SQLException)
java.lang.RuntimeException
описывает исключения, источник возникновения которых расположен
внутри приложения (например, ArithmeticException,
IndexOutOfBoundsException, NullPointerException)
Если классы исключений, которые могут возникнуть при выполнении
фрагмента кода, находятся в родственной связи, то более конкретный класс
должен указываться раньше, более общий – позже, например:
try {
// ...
}
catch (ArithmeticException e) {
// ...
}
catch (RuntimeException e) {
// ...
}
catch (Exception e) {
// ...
}
Методы, которые по каким-то причинам не могут или не должны
обрабатывать генерируемые внутри них исключения, требуется помечать с
помощью ключевого слова throws:
if ("женат".equalsIgnoreCase(state) ||
"замужем".equalsIgnoreCase(state) )
return true;
if ("неженат".equalsIgnoreCase(state) ||
"незамужем".equalsIgnoreCase(state) )
return false;
}
Классы пользовательских исключений описываются путем наследования от
уже существующего наиболее подходящего класса исключений.
Пример.
class IllegalFamilyStatusException
extends IllegalArgumentException {
public IllegalFamilyStatusException() {
super("Неверно указано семейное состояние");
}
}
Потоковый ввод-вывод
В языке Java используется потоковая модель организации ввода-вывода.
fin.close();
fout.close();
Буферизованный ввод-вывод
Object readObject()
для чтения объекта из потока
void writeObject(Object obj)
для записи объекта в поток
Пример. Запись объекта (массива) в поток
System.out.println("Введите строку");
String s=scanner.nextLine();
System.out.println("Результаты расчетов:");
System.out.printf("x=%5.3f, y=%5.3f%n",x,y);
Коллекции
Простейшим средством для хранения и обработки нескольких однотипных
объектов являются массивы.
Iterable
Collecti
on
ArrayLis HashSe
Vector Deque TreeSet
t t
ArrayDe
Stack
que
ИмяКласса<Тип> переменная;
int size()
возвращает количество элементов коллекции;
boolean isEmpty()
проверяет, содержит ли коллекция элементы
(возвращает значение true, если коллекция пуста);
boolean contains(Object o)
проверяет, принадлежит ли объект коллекции
(возвращает значение true, если объект уже содержится в коллекции);
boolean add(E e)
добавляет элемент в коллекцию;
boolean remove(Object o)
удаляет из коллекции заданный объект
(если, конечно, он содержится в коллекции);
void clear()
очищает коллекцию (удаляет из коллекции
все содержащиеся в ней объекты);
Интерфейс List
Описывает списки – коллекции с фиксированным порядком
размещения элементов.
int indexOf(Object o)
возвращает индекс первого вхождения объекта;
int lastIndexOf(Object o)
возвращает индекс последнего вхождения объекта;
@Override
public int hashCode() {
int hash = 5;
hash = 11 * hash + (int) (Double.doubleToLongBits(this.x) ^
(Double.doubleToLongBits(this.x) >>> 32));
hash = 11 * hash + (int) (Double.doubleToLongBits(this.y) ^
(Double.doubleToLongBits(this.y) >>> 32));
return hash;
}
Для выполнения операций над отдельными элементами множеств могут
использоваться методы
add()
для добавления элемента в множество;
contains()
для проверки принадлежности элемента множеству;
remove()
для удаления элемента из множества
и т.д.
Для выполнения операций над двумя множествами могут использоваться
методы
boolean addAll(Collection<E> c)
добавляет в множество все элементы указанной коллекции (объединение
множеств);
boolean removeAll(Collection<E> c)
удаляет из множестве те элементы, которые принадлежат указанной
коллекции (дополнение множеств);
boolean retainAll(Collection<E> c)
оставляет в множестве те элементы, которые принадлежат указанной
коллекции (пересечение множеств);
Container
Panel (JPanel)
реализует простейший контейнер, который должен быть размещен внутри
другого, более «продвинутого» контейнера.
Компонент JLabel
дополнительно позволяет отображать пиктограмму, которая задается при
вызове конструктора или методом setIcon(Icon icon).
Компонент Button
представляет собой кнопку.
Надпись на кнопке задается при вызове конструктора или методом
setLabel(String Label).
Компонент JButton
дополнительно позволяет отображать на кнопке пиктограмму, которая
задается при вызове конструктора или методом setIcon(Icon icon).
Кроме того, методами setPressedIcon(), setRolloverIcon(), setDisabledIcon() и
др. можно задать пиктограммы, соответствующие различным состояниям
кнопки.
Компонент TextField
представляет собой однострочное текстовое поле, используемое для ввода
текстовой информации. Начальное содержимое поля задается при вызове
конструктора или методом setText(String text). Введенный пользователем
текст можно получить методом getText().
Компонент JTextField
дополнительно позволяет организовать взаимодействие с системным
Буфером обмена с помощью методов copy(), cut(), paste(), а также
поддерживает технологию Drag’n’Drop.
Менеджеры размещения
События
Графический пользовательский интерфейс приложения относится к
системам, управляемым по событиям:
– при запуске программы создается пользовательский интерфейс;
– далее приложение ожидает наступления некоторого события,
связанного с пользовательским интерфейсом;
– при наступлении события программа выполняет необходимые
действия, а затем снова переходит в режим ожидания.
Событием в пользовательском интерфейсе считается
– непосредственное действие пользователя (щелчок или движение мыши,
нажатие клавиши),
– изменение состояния какого-либо компонента интерфейса (например,
изменение состояния кнопки-переключателя).
При обработке событий в библиотеке Java взаимодействуют три вида
объектов:
источник события
обычно компонент пользовательского интерфейса
слушатель события
объект, которые получает информацию о произошедшем событии
объект-событие
содержат в себе информацию о произошедшем событии и источнике этого
события
Для обработки событий используется шаблон проектирования "Слушатель"
(Observer).
Слушатель событий 3
Источник событий 3
ent
KeyEve Mouse
nt Event
Некоторые методы класса MouseEvent
int getButton()
возвращает номер нажатой кнопки (0, 1, 2, 3)
int getClickCount()
возвращает количество нажатий кнопки мыши
Point getPoint()
возвращает позицию указателя мыши
Некоторые методы класса KeyEvent
char getKeyChar()
возвращает символ, соответствующий нажатой клавише
int getKeyCode()
возвращает код нажатой клавиши
boolean isShiftDown()
boolean isControlDown()
boolean isAltDown()
возвращают состояние клавиш регистра
Для обработки любого события необходимо:
ActionListener
интерфейс слушателя события-действия
KeyListener
интерфейс слушателя события клавиатуры
MouseListener
MouseMotionListener
MouseWheelListener
интерфейсы слушателей событий мыши
void actionPerformed(ActionEvent e)
метод для обработки события-действия
void keyPressed(KeyEvent e)
void keyReleased(KeyEvent e)
void keyTyped(KeyEvent e)
методы для обработки событий клавиатуры
Пример. Описание обработчика события нажатия на кнопку
KeyAdapter
класс-обработчик событий клавиатуры
MouseAdapter
MouseMotionAdapter
классы-обработчики событий мыши
void addActionListener(ActionListener l)
добавить слушателя события-действия
void addKeyListener(KeyListener l)
добавить слушателя события клавиатуры
void addMouseListener(MouseListener l)
void addMouseMotionListener(MouseMotionListener l)
void addMouseWheelListener(MouseWheelListener l)
добавить слушателя событий мыши
и др.
Пример. Регистрация обработчика нажатия на кнопку
void removeActionListener(ActionListener l)
удалить слушателя события-действия
Graphics gr = component.getGraphics();
Color
обеспечивает одноцветную закраску замкнутой области;
TexturePaint
обеспечивает заполнение замкнутой области узором (текстурой);
GradientPaint
обеспечивает плавное изменение цвета вдоль некоторого направления
Пример. Построение красно-синего прямоугольника.
gr2d.setPaint(paint);
gr2d.fillRectangle(x,y,width,height);
Преобразование координат –
void setTransform(AffineTransform at)
double alpha=Math.PI/3;
double cos=Math.cos(alpha);
double sin=Math.sin(alpha);
AffineTransform rotate =
new AffineTransform(cos,-sin,sin,cos,100,100);
gr2d.setTransform(rotate);
gr2d.drawString("Надпись под углом PI/3", 0, 0);
Потоки исполнения