- •1. Java. Основные синтаксические структуры языка Java. Типы данных Java. Массивы.
- •2. Концепции ооп. Классы и объекты. Ключевые свойства объектов. Инкапсуляция. Время жизни объектов. Конструкторы.
- •3. Наследование и полиморфизм. Спецификаторы доступа (private, protected, public). Иерархия классов. Перечисления. Интерфейсы и абстрактные классы.
- •4. Статические поля и методы. Порождающие методы. Блоки инициализации. Статические внутренние классы.
- •5. Внутренние, локальные и анонимные классы. Пакеты. Компиляция классов. Jar-файлы.
- •События. Виды событий. Иерархия классов событий. Команда и источник. Адаптеры. (читаем картинки слева направо, потом на новую строку)
- •Принципы создания пользовательского интерфейса. Контейнеры, панели. Основные компоненты библиотеки Swing.
- •26. Потоки выполнения. Синхронизация и сигнализирование с помощью Lock.
- •27. Дополнительные возможности синхронизации. Справедливая блокировка. Барьер, затвор, семафор.
- •Барьеры
- •28. Расширенные методы синхронизации. Блокировка чтения и записи, Exchanger. Многопоточные приложения и Swing.
- •29. Настраиваемые типы данных. Универсальные классы. Ограничения на тип.
- •30. Настраиваемые типы данных. Универсальные методы. Ограничения в использовании настраиваемых типов.
30. Настраиваемые типы данных. Универсальные методы. Ограничения в использовании настраиваемых типов.
Настраиваемые типы – билет 29.
Универсальные методы.
Параметры типа, могут также объявляться, в пределах метода и сигнатур конструктора создают универсальные методы иуниверсальные конструкторы. Это подобно объявлению универсального типа, но область видимости параметра типа ограничена методом или конструктором, в котором это объявлено.
/**
* This version introduces a generic method.
*/
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public <U> void inspect(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.add(new Integer(10));
integerBox.inspect("some text");
}
}
Здесь мы добавили один универсальный метод, названный inspect, который определяет один параметр типа, названный U. Этот метод принимает объект и печатает его тип в стандартный вывод. Для сравнения он также распечатывает тип T. Для удобства у этого класса теперь также есть основной метод так, чтобы он мог быть выполнен как приложение.
Вывод от этой программы:
T: java.lang.Integer
U: java.lang.String
Проходя в различные типы, вывод изменится соответственно.
Более реалистичное использование универсальных методов могло бы быть кое-чем как следующий, который определяет статический метод, который наполняет справочную информацию в единственный элемент во множественные боксы:
public static <U> void fillBoxes(U u, List<Box<U>> boxes) {
for (Box<U> box : boxes) {
box.add(u);
}
}
Чтобы использовать этот метод, Ваш код выглядел бы, примерно так:
Crayon red = ...;
List<Box<Crayon>> crayonBoxes = ...;
Законченный синтаксис для того, чтобы вызвать этот метод:
Box.<Crayon>fillBoxes(red, crayonBoxes);
Здесь мы явно обеспечили тип, который будет использоваться как U, но чаще это может не учтывается, и компилятор выведет тип, он необходим:
Box.fillBoxes(red, crayonBoxes); // compiler infers that U is Crayon
Эта возможность, известная как вывод типа, позволяет Вам вызывать универсальный метод, по другому Вы получили бы обычный метод, не определяя тип между уголовыми скобками.
Ограничения
> Нельзя создавать объекты, используя тип параметра
> Нельзя создать массив объектов, тип которых задан с помощью параметра типа
> Статические члены класса не могут использовать параметр
> Настраиваемый тип не может расширять класс Throwable
>> Классы исключений не могут быть настраиваемыми
Сетевые подключения TCP/IP. Сокеты. Сетевой адрес и сетевое имя. Создание клиентского подключения. Прием и отправка данных по сети
Сокет — абстрактное понятие, позволяющее организовать обмен информацией по сети
TCP - Transmission Control Protocol (TCP)
UDP - User Datagram Protocol
IP адрес — 32 битный адрес (напр. 192.168.0.1)
InetAddress — абстрактный класс
•InetAddress getByAddress(byte[] addr) — возвращает объект адреса
•InetAddress getLocalHost() - возвращает локальный адрес
Сетевое имя — строковое представление
Для определения адреса через сетевое имя используется DNS (Domain Name Server)
InetAddress getByName(String host) — производит поиск по имени
InetAddress[] getAllByName(String host) - производит поиск всех адресов по имени
UnknownHostException — если сетевое имя не найдено
Порт - системный ресурс для связи (0-65535).
Различают:
•Порт получателя
•Порт отправителя
Стандартные порты (0-1024):
•FTP — 21
•HTTP — 80
•SMTP — 25
•DNS — 53
•POP3 — 110
•HTTPS — 443
•IMAP — 145
•И т.д.
Для открытия соединения необходимо открыть сокет:
Socket s = new Socket(InetAddress.getName("www.ya.ru"), 80);
В случае ошибки генерируется IOException.
•Socket(InetAddress address, int port)
•Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
•Socket(String host, int port)
•Socket(String host, int port, InetAddress localAddr, int localPort)
Для отправки данных
OutputStream out = s.getOutputStream();
…
Для приёма данных:
InputStream in = s.getInputStream();
…
Операции чтения из потока и записи - блокирующие!
s.close() - корректно закрывает сокет.
«Корректно» - удаленная сторона получает признак конца потока.
Генерирует IOException в случае ошибки.
Закрытый сокет больше нельзя использовать.
Сетевые подключение TCP/IP. Сокеты. Создание серверного подключения. Прием и отправка данных по сети. Сетевые подключения высокого уровня (UrlConnection).
Класс URL (Uniform Resource Locator) описывает адрес к ресурсу в WWW (напр. http://www.yandex.ru)
•URL(String spec)
•URL(String protocol, String host, int port, String file)
Генерирует MalformedURLException в случае ошибки
Example:
// Demonstrate URLConnection. import java.net.*; import java.io.*; import java.util.Date; class UCDemo { public static void main(String args[]) throws Exception { int c; URL hp = new URL("http://www.java-samples.com/j2me/"); URLConnection hpCon = hp.openConnection(); System.out.println("Date: " + new Date(hpCon.getDate())); System.out.println("Content-Type: " + hpCon.getContentType()); System.out.println("Expires: " + hpCon.getExpiration()); System.out.println("Last-Modified: " + new Date(hpCon.getLastModified())); int len = hpCon.getContentLength(); System.out.println("Content-Length: " + len); if (len > 0) { System.out.println("=== Content ==="); InputStream input = hpCon.getInputStream(); int i = len; while (((c = input.read()) != -1) && (—i > 0)) { System.out.print((char) c); } input.close(); } else { System.out.println("No Content Available"); } } }
Серверный сокет ожидает подключения.
Операция bind связывает сокет с портом и интерфейсом:
•ServerSocket(int port)
•ServerSocket(int port, int backlog)
•ServerSocket(int port, int backlog, InetAddress bindAddr)
•bind(SocketAddress endpoint)
•bind(SocketAddress endpoint, int backlog)
SocketAddress (InetSocketAddress) — класс, инкапсулирующий интерфейс и порт.
Операция ожидания входящего подключения:
Socket accept()
Операция блокирующая.
bind() и accept() генерируют IOException в случае ошибки
Обслуживание нескольких соединений
Подключение устанавливается только когда вызван метод accept()
Для обслуживания нескольких соединений необходимо использовать несколько потоков.
Прерывание блокирующей операции
Прерывание блокирующей IO операции:
socket.close()
Любая блокирующая операция генерирует SocketException.
