Разделы презентаций


JavaBeans

Содержание

План лекцииКомпонентный подход в программированииТехнология JavaBeansСвойства компонентов JavaBeansГрафические компоненты JavaBeansСобытия компонентов JavaBeans

Слайды и текст этой презентации

Слайд 1Java Beans
© Составление, Будаев Д.С., Гаврилов А.В., Попов С.Б., 2013
Лекция

9.1
УНЦ «Инфоком»
Самара
2013

Java Beans© Составление, Будаев Д.С., Гаврилов А.В., Попов С.Б., 2013Лекция 9.1УНЦ «Инфоком»Самара2013

Слайд 2План лекции
Компонентный подход в программировании

Технология JavaBeans

Свойства компонентов JavaBeans

Графические компоненты JavaBeans

События

компонентов JavaBeans

План лекцииКомпонентный подход в программированииТехнология JavaBeansСвойства компонентов JavaBeansГрафические компоненты JavaBeansСобытия компонентов JavaBeans

Слайд 3Объектный подход vs Компонентный подход
Объектный подход Программа пишется как

объектная модель реальной или воображаемой системы, объекты и их отношения

легко понятны

Компонентный подход Программа собирается из заранее созданных компонентов, каковые могут быть достаточно сложны для понимания
Объектный подход    vs Компонентный подходОбъектный подход Программа пишется как объектная модель реальной или воображаемой

Слайд 4Понятие компонента
Компонент – это элемент системы, представляющий определенную службу или

сущность, допускающий взаимодействие с другими компонентами

Особенности компонентов:
Многоразовое использование
Независимость от контекста
Кооперация

с другими компонентами
Инкапсуляция
Самостоятельность как единицы программы

Компонент – объект, написанный в соответствии со спецификацией
Понятие компонентаКомпонент – это элемент системы, представляющий определенную службу или сущность, допускающий взаимодействие с другими компонентамиОсобенности компонентов:Многоразовое

Слайд 5Требования к разработке компонентов
Полная документация
Более строгое тестирование
Надежная проверка достоверности входных

данных
Возврат полезных сообщений об ошибках
Разработка с учетом непредусмотренного использования

Требования к разработке компонентовПолная документацияБолее строгое тестированиеНадежная проверка достоверности входных данныхВозврат полезных сообщений об ошибкахРазработка с учетом

Слайд 6Контейнеры и компоненты
Контейнер предоставляет контекст, в котором компоненты могут существовать

и действовать совместно

Контейнер тоже может быть компонентом

Это полностью рекурсивно!

Контейнеры и компонентыКонтейнер предоставляет контекст, в котором компоненты могут существовать и действовать совместноКонтейнер тоже может быть компонентомЭто

Слайд 7Существующие компонентные модели
JavaBeans
Enterprise JavaBeans
.Net Framework Components
ActiveX
COM
DCOM
CORBA
VLC & CLX

Существующие компонентные моделиJavaBeansEnterprise JavaBeans.Net Framework ComponentsActiveXCOMDCOMCORBAVLC & CLX…

Слайд 8JavaBeans
Компонентная модель для языка Java
Компоненты называются Beans (бины)
Компонент описывается как

класс, удовлетворяющий определенным правилам
Следует различать компонент как класс компонента и

компоненты как его экземпляры, использующиеся в программе
Для работы с компонентами используются специальные программные средства, позволяющие «визуально» настраивать компонент и его взаимодействие с другими компонентами (RAD-tools)
JavaBeansКомпонентная модель для языка JavaКомпоненты называются Beans (бины)Компонент описывается как класс, удовлетворяющий определенным правиламСледует различать компонент как

Слайд 9Интроспекция
Средства работы с бинами подвергают бины интроспекции

Интроспекция – механизм, основанный

на рефлексии, позволяющий определить характеристики компонента, основываясь на информации, заключенной

в именах элементов класса компонента и вспомогательных классах
ИнтроспекцияСредства работы с бинами подвергают бины интроспекцииИнтроспекция – механизм, основанный на рефлексии, позволяющий определить характеристики компонента, основываясь

Слайд 10Компоненты JavaBeans
Компонент имеет свойства, которые представляют собой характеристики компонента и

могут быть изменены в процессе сборки
Компонент использует события для взаимодействия

с другими компонентами
Компоненты обладают свойством персистентности: могут сохранять свое состояние в долговременное хранилище и затем восстанавливать его
Методы компонентов являются обычными методами Java и могут использоваться другими компонентами
Компоненты JavaBeansКомпонент имеет свойства, которые представляют собой характеристики компонента и могут быть изменены в процессе сборкиКомпонент использует

Слайд 11Достоинства JavaBeans
Компактность

Переносимость

Поддержка механизмов интроспекции

Способность к работе в графической среде быстрой

разработки приложений (RAD)

Достоинства JavaBeansКомпактностьПереносимостьПоддержка механизмов интроспекцииСпособность к работе в графической среде быстрой разработки приложений (RAD)

Слайд 12Требования к компоненту JavaBeans
Способность к инстанцированию нового экземпляра (бин –

не интерфейс, не абстрактный класс)
Наличие конструктора по умолчанию (конструктора без

параметров)
Возможность сериализации
Следование соглашениям об именах и способах проектирования
Использование модели делегирования обработки событий
Требования к компоненту JavaBeansСпособность к инстанцированию нового экземпляра (бин – не интерфейс, не абстрактный класс)Наличие конструктора по

Слайд 13Удивительное рядом
Нет общего супер-класса для бинов

API пакета java.beans предоставляет только

классы поддержки функционирования компонентов JavaBeans

Нет никакого специализированного языка описания интерфейсов

Удивительное рядомНет общего супер-класса для биновAPI пакета java.beans предоставляет только классы поддержки функционирования компонентов JavaBeansНет никакого специализированного

Слайд 14Свойства
Виды свойств по способу доступа
Допускающие запись
Допускающие чтение

Виды свойств по сложности
Простые
Индексированные
Связанные
Контролируемые

СвойстваВиды свойств по способу доступаДопускающие записьДопускающие чтениеВиды свойств по сложностиПростыеИндексированныеСвязанныеКонтролируемые

Слайд 15Простые свойства
Доступны пользователю как пара методов доступа (setter/getter)

Любой из этих

методов может отсутствовать, определяя таким образом доступность свойства для чтения/записи

(read-only/write-only)

Соглашения именования:
Общий вид
public ТипСвойства getИмяСвойства()
public void setИмяСвойства(ТипСвойства значение)
Логические свойства
public boolean isИмяСвойства()
public void setИмяСвойства(boolean значение)
Простые свойстваДоступны пользователю как пара методов доступа (setter/getter)Любой из этих методов может отсутствовать, определяя таким образом доступность

Слайд 16Бин с простым свойством
package beans;

public class MyBean implements java.io.Serializable {


private String message;

public MyBean() {
}

public

String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}
Бин с простым свойствомpackage beans;public class MyBean implements java.io.Serializable {  private String message; public MyBean() {

Слайд 17Работа с простыми свойствами

Работа с простыми свойствами

Слайд 18Индексированные свойства
Определяют доступ к массиву свойств с возможностью доступа по

номеру
Соглашения именования:
public ТипСвойства[] getИмяСвойства()
public void setИмяСвойства (ТипСвойства[] значения)
public ТипСвойства getИмяСвойства (int индекс)
public

void setИмяСвойства (int индекс, ТипСвойства значение)
Индексированные свойстваОпределяют доступ к массиву свойств с возможностью доступа по номеруСоглашения именования:public ТипСвойства[] getИмяСвойства()public void setИмяСвойства (ТипСвойства[]

Слайд 19Бин с индексированным свойством
public class MyBean implements java.io.Serializable {
private

String[] lines = new String[5];

public String[] getLines() {

return lines;
}
public void setLines(String[] lines) {
this.lines = lines;
}
public String getLines(int index) {
return lines[index];
}
public void setLines(int index, String line) {
this.lines[index] = line;
}
}
Бин с индексированным свойствомpublic class MyBean implements java.io.Serializable { private String[] lines = new String[5]; public String[]

Слайд 20Работа с индексированными свойствами

Работа с индексированными свойствами

Слайд 21Связанные свойства
Поддерживают механизм оповещения об изменениях значений свойств
Обработчики реализуют интерфейс

PropertyChangeListener и принимают объекты PropertyChangeEvent, содержащие имя свойства и его

старое и новое значения
Используется вспомогательный класс PropertyChangeSupport
Связанные свойстваПоддерживают механизм оповещения об изменениях значений свойствОбработчики реализуют интерфейс PropertyChangeListener и принимают объекты PropertyChangeEvent, содержащие имя

Слайд 22Бин со связанным свойством
public class MyBean implements PropertyChangeListener, Serializable {

private String message;
private String[] lines = new String[5];

private final PropertyChangeSupport pcs =
new PropertyChangeSupport(this);
public MyBean() {
pcs.addPropertyChangeListener(this);
}

public void addPropertyChangeListener(
PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}

public void removePropertyChangeListener(
PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
...
Бин со связанным свойствомpublic class MyBean implements PropertyChangeListener, 							Serializable { private String message;  private String[] lines

Слайд 23Бин со связанным свойством
...
public void setMessage(String message) {

String old = this.message;
this.message = message;

pcs.firePropertyChange("message", old, message);
}
...
public void setLines(int index, String line) {
String old = this.lines[index];
this.lines[index] = line;
pcs.fireIndexedPropertyChange("lines", index, old, lines);
}
...
public void propertyChange(PropertyChangeEvent evt) {
//some property change logic
}
...
Бин со связанным свойством ... public void setMessage(String message) {  String old = this.message;  this.message

Слайд 24Работа со связанными свойствами

Работа со связанными свойствами

Слайд 25Контролируемые свойства
Похожи на связанные свойства, но перед присвоением нового значения

свойства оно должно быть проверено обработчиками
Любой обработчик в праве запретить

изменение, в этом случае значение свойства останется прежним
Обработчики реализуют интерфейс VetoableChangeListener и принимают объекты PropertyChangeEvent, содержащие имя свойства и его старое и новое значения
Используется вспомогательный класс VetoableChangeSupport
Контролируемые свойстваПохожи на связанные свойства, но перед присвоением нового значения свойства оно должно быть проверено обработчикамиЛюбой обработчик

Слайд 26Бин с контролируемым свойством
public class MyBean implements java.io.Serializable {
private

String message;
private final VetoableChangeSupport vcs =

new VetoableChangeSupport(this);
public MyBean() {
vcs.addVetoableChangeListener(new VetoChangeListener());
}
public void addVetoableChangeListener(
VetoableChangeListener lnr) {
vcs.addVetoableChangeListener(lnr);
}
public void removeVetoableChangeListener(
VetoableChangeListener lnr){
vcs.removeVetoableChangeListener(lnr);
}
...
Бин с контролируемым свойствомpublic class MyBean implements java.io.Serializable { private String message; private final VetoableChangeSupport vcs =

Слайд 27Бин с контролируемым свойством
...
public void setMessage(String message) {

String old = this.message;
try {

vcs.fireVetoableChange("message", old, message);
this.message = message;
...
} catch (PropertyVetoException e) {
this.message = old;
}
}
...
}
Бин с контролируемым свойством ... public void setMessage(String message) {  String old = this.message;  try

Слайд 28VetoChangeListener
public class VetoChangeListener implements VetoableChangeListener {

public void vetoableChange(PropertyChangeEvent

evt)
throws PropertyVetoException {

String eventName =

evt.getPropertyName();
if (eventName.equalsIgnoreCase("message")) {
String message = (String) evt.getNewValue();
if (message.toLowerCase().contains("hello")) {
throw new PropertyVetoException("Veto!!", evt);
}
System.out.println("Message applied = " + message);
}
}
}
VetoChangeListenerpublic class VetoChangeListener implements 								VetoableChangeListener {  public void vetoableChange(PropertyChangeEvent evt) 				throws PropertyVetoException {

Слайд 29Графические компоненты
Если компоненты содержит средства визуализации, то его суперкласом должен

быть:
java.awt.Component если создается компонент на базе AWT
javax.swing.JComponent если создается компонент на базе

Swing
Хотя и компоненты AWT, и компоненты Swing являются компонентами JavaBeans, не рекомендуется смешивать их в одном контейнере
Графические компонентыЕсли компоненты содержит средства визуализации, то его суперкласом должен быть:java.awt.Component если создается компонент на базе AWTjavax.swing.JComponent

Слайд 30Графический бин
public class MyBean extends JComponent
implements

java.io.Serializable {

private String message = "!!!";
...
protected

void paintComponent(Graphics g) {

g.setColor(getForeground());
int height = g.getFontMetrics().getHeight();

if (message != null) {
g.drawString(message, 0, height);
}
}
...
Графический бинpublic class MyBean extends JComponent	 		   implements java.io.Serializable {  private String message =

Слайд 31Графический бин
...
public void setMessage(String message) {
String

old = this.message;
try {
vcs.fireVetoableChange("message", old,

message);
this.message = message;
pcs.firePropertyChange("message", old, message);
repaint();
} catch (PropertyVetoException e) {
this.message = old;
}
}
...
}
Графический бин ... public void setMessage(String message) {  String old = this.message;  try {

Слайд 32Работа с графическим бином

Работа с графическим бином

Слайд 33Модель делегирования обработки событий
Событие – объект, описывающий изменение состояния источника
Источник

– объект, генерирующий события
Слушатель – объект, получающий уведомление о событии

Источник

генерирует событие и посылает его одному или нескольким слушателям
Слушатель просто ждет поступления события
Получив событие, слушатель обрабатывает его и затем возвращает управление
Модель делегирования обработки событийСобытие – объект, описывающий изменение состояния источникаИсточник – объект, генерирующий событияСлушатель – объект, получающий

Слайд 34Модель делегирования обработки событий
Слушатели должны зарегистрироваться у источника – события

посылаются только зарегистрировавшимся слушателям

Логика кода, обрабатывающего события, отделена от логики

интерфейса, генерирующего события

Это реализация паттерна проектирования Observer
Модель делегирования обработки событийСлушатели должны зарегистрироваться у источника – события посылаются только зарегистрировавшимся слушателямЛогика кода, обрабатывающего события,

Слайд 35Слушатели и источники
Один источник может генерировать несколько типов событий
Один слушатель

может быть слушателем нескольких видов событий
Один слушатель может получать события

одного вида от нескольких источников
Слушатель может быть источником для других слушателей и для самого себя
Источник может быть слушателем других источников и самого себя
Слушатели и источникиОдин источник может генерировать несколько типов событийОдин слушатель может быть слушателем нескольких видов событийОдин слушатель

Слайд 36События JavaBeans
Класс слушателя должен наследовать от базового типа слушателя для

вида событий EventListenerType
Чтобы слушатель события мог быть зарегистрирован, компонент должен

предоставлять метод public void addEventListenerType(EventListenerType a)
Чтобы слушатель события мог отказаться от регистрации, компонент должен предоставлять метод public void removeEventListenerType(EventListenerType a)
Если компонент позволяет регистрировать одновременно ограниченное количество обработчиков события, то метод добавления слушателя должен объявлять исключение java.util.TooManyListenersException
Работа с событиями также может вестись на уровне средства разработки
События JavaBeansКласс слушателя должен наследовать от базового типа слушателя для вида событий EventListenerTypeЧтобы слушатель события мог быть

Слайд 37Работа с событиями

Работа с событиями

Слайд 38Работа с событиями

Работа с событиями

Слайд 39Работа с событиями

Работа с событиями

Слайд 40Работа с событиями

Работа с событиями

Слайд 41Результат работы приложения

Результат работы приложения

Слайд 42Персистентнось
Способность объекта существовать во времени, переживая породивший его процесс
Для JavaBeans

реализуется за счет сериализации
Все классы компонентов должны быть подготовлены к

сериализации
Существуют механизмы сохранения состояния бинов в xml-формат
ПерсистентносьСпособность объекта существовать во времени, переживая породивший его процессДля JavaBeans реализуется за счет сериализацииВсе классы компонентов должны

Слайд 43Упаковка в Jar
Класс компонента, вспомогательные классы, файлы помещаются в jar-архив

В

файле манифеста при этом указывается дополнительная информация:


Name: beans/MyBean.class
Java-Bean: True

Упаковка в JarКласс компонента, вспомогательные классы, файлы помещаются в jar-архивВ файле манифеста при этом указывается дополнительная информация:Name:

Слайд 44Добавление библиотек в палитру

Добавление библиотек в палитру

Слайд 45Вложенные типы
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция 9.2
УНЦ «Инфоком»
Самара
2013

Вложенные типы© Составление, Будаев Д.С., Гаврилов А.В., 2013Лекция 9.2УНЦ «Инфоком»Самара2013

Слайд 46План лекции

Понятие вложенного типа

Вложенные классы и интерфейсы

Внутренние классы

План лекцииПонятие вложенного типаВложенные классы и интерфейсыВнутренние классы

Слайд 47Синтаксически корректный код
class MyFirstClass {
public static void main(String[] args)

{
// ...
}

class MySecondClass {
private

int a, b;

public MySecondClass(int a, int b) {
this.a = a;
this.b = b;
}
//...
}
}
Синтаксически корректный кодclass MyFirstClass { public static void main(String[] args) {  // ... } class MySecondClass

Слайд 48Вложенные типы
Считаются частью внешнего типа, со всеми вытекающими правами
Позволяют представить

тип в виде логически связанных структурных групп и контекстов
Простой и

эффективный инструмент объединения семантики соотносимых объектов
Вложенные типыСчитаются частью внешнего типа, со всеми вытекающими правамиПозволяют представить тип в виде логически связанных структурных групп

Слайд 49Статические вложенные классы
Простейшая форма вложенного класса
Может использоваться любыми классами, обладающими

соответствующими правами доступа
Классы, вложенные в интерфейсы, статичны по определению
class ClassA

{
int a = 10;
protected static class ClassB {
int b = 15;
}
}
public class Test {
public static void main(String[] args) {
ClassA.ClassB t = new ClassA.ClassB();
System.out.println(t.b);
}
}
Статические вложенные классыПростейшая форма вложенного классаМожет использоваться любыми классами, обладающими соответствующими правами доступаКлассы, вложенные в интерфейсы, статичны

Слайд 50Вложенные интерфейсы
Всегда статичны (модификатор static по умолчанию)
Доступ определяется доступом внешнего

класса или интерфейса и модификаторами доступа
class ClassA {
public interface

InterfaceB {
//...
}
//...
public InterfaceB get() {
//...
}
}
public class Test {
public static void main(String[] args) {
ClassA.InterfaceB t = (new ClassA()).get();
}
}
Вложенные интерфейсыВсегда статичны (модификатор static по умолчанию)Доступ определяется доступом внешнего класса или интерфейса и модификаторами доступаclass ClassA

Слайд 51Нестатические вложенные классы
Называются внутренними классами
Тип находится в контексте объекта
Объект внутреннего

класса всегда ассоциируется с т.н. внешним объектом
Элементы внутреннего класса имеют

доступ к полям и методам внешнего объекта
Это позволяет создавать семейства сильно связанных объектов
Нестатические вложенные классыНазываются внутренними классамиТип находится в контексте объектаОбъект внутреннего класса всегда ассоциируется с т.н. внешним объектомЭлементы

Слайд 52Пример внутреннего класса
class ClassA {
private int a = 10;

protected class ClassB {
private int b = 15;

public int getA() { return a; }
public int getB() { return b; }
}
public ClassB getB() { return new ClassB(); }
public void setB(int b, ClassB obj) { obj.b = b; }
}
public class Test {
public static void main(String[] args) {
ClassA objA = new ClassA();
ClassA.ClassB objB = objA.getB();
objA.setB(20, objB);
System.out.println(objB.getA() + " " + objB.getB());
}
}
Пример внутреннего классаclass ClassA { private int a = 10; protected class ClassB {  private int

Слайд 53И ещё один пример
class ClassA implements Serializable {

private

ClassB[] arr = new ClassB[10];

{
for(int i

= 0; i < 10; i++) {
arr[i] = new ClassB();
arr[i].a = i + 65;
}
}

public Interface getB(int index) { return arr[index]; }

private class ClassB implements Interface {
private int a;
public int getA() { return a; }
}
}

interface Interface extends Serializable { int getA(); }
И ещё один примерclass ClassA implements Serializable {  private ClassB[] arr = new ClassB[10]; {

Слайд 54И его результат…
public class Test {
public static void main(String[]

args) throws Exception {
ClassA objA = new ClassA();

Interface objB = objA.getB(5);
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("test.bin"));
out.writeObject(objB);
out.close();
}
}

¬н ♣sr ♪ClassA$ClassBиeТнwјЛ☻ ☻I ☺aL ♠this$0t ◘LClassA;xp Fsr ♠ClassAhќЯѓэЄрЈ ☻ ☺[♥arrt ►[LClassA$ClassB;xpur ►[LClassA$ClassB;єВ2 ♂т|­Ў ☻ xp sq ~ Aq ~ ♣sq ~ Bq ~ ♣sq ~ Cq ~ ♣sq ~ Dq ~ ♣sq ~ Eq ~ ♣q ~ ☻sq ~ Gq ~ ♣sq ~ Hq ~ ♣sq ~ Iq ~ ♣sq ~ Jq ~ ♣

И его результат…public class Test { public static void main(String[] args) throws Exception {  ClassA objA

Слайд 55Локальные классы
Описываются в теле блока
Экземпляры имеют доступ к полям и

методам внешнего объекта
Экземпляры имеют доступ к локальным переменным, снабженным модификатором

final

public class ClassA {
public Iterator iterator() {
class Iter implements Iterator {
...
}
...
return new Iter();
}
...
}

Локальные классыОписываются в теле блокаЭкземпляры имеют доступ к полям и методам внешнего объектаЭкземпляры имеют доступ к локальным

Слайд 56Локальные классы
class A { protected char a = 'a'; }
class

B { protected char b = 'b'; }

public class C

extends A {
private char c = 'c';
public static char d = 'd';
public void createLocalObject(final char e)
{
final char f = 'f';
class Local extends B
{
char g = 'g';
public void printVars()
{
System.out.println(g + "," + f + "," + e); // local
System.out.println(d + "," + c); // outer
System.out.println(b + "," + a); // inherited
}
}
new Local().printVars();
}
}
Локальные классыclass A { protected char a = 'a'; }class B { protected char b = 'b';

Слайд 57Анонимные классы
Описываются непосредственно в выражении new и служат его частью
Тип,

указанный после new является базовым для объявляемого анонимного класса
Могут расширять

один класс или реализовывать один интерфейс
Явно писать implements или extends нельзя
Не могут иметь конструкторов
Анонимные классыОписываются непосредственно в выражении new и служат его частьюТип, указанный после new является базовым для объявляемого

Слайд 58Пример анонимного класса
import java.awt.*;
import javax.swing.*;

public class MyApplet extends JApplet {

...
public void init() {
JButton btn = new

JButton("?");
getContentPane().add(btn);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
((JButton)e.getSource()).setText("!");
}
});
}
}
Пример анонимного классаimport java.awt.*;import javax.swing.*;public class MyApplet extends JApplet { ... public void init() {  JButton

Слайд 59
Спасибо за внимание!

Спасибо за внимание!

Слайд 60Дополнительные источники
Хорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости

программирования [Текст] / Кей Хорстманн, Гари Корнелл. – М. :

Издательский дом «Вильямс», 2010 г. – 992 с.
Дейтел, Х.М. Технологии программирования на Java 2. Книга 1. Графика, JavaBeans, интерфейс пользователя [Текст] / Х.М. Дейтел, П.Дж. Дейтел, С.И. Сантари. – М. : Бином-пресс, 2003. – 560 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011.
JavaSE Desktop technologies [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138795.html, дата доступа: 21.10.2011.
Trial: JavaBeans [Электронный ресурс]. – Режим доступа: http://download.oracle.com/javase/tutorial/javabeans/, дата доступа: 21.10.2011.
Дополнительные источникиХорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости программирования [Текст] / Кей Хорстманн, Гари Корнелл.

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика