3-й семестр / Лекции / 4 - Полиморфизм
.pdf
Java cтрока представляет из себя строку литералов (текст), помещенных в двойные кавычки, например: "Hello , World! ”
Вы можете присвоить последовательность строковых литералов непосредственно переменной типа String, вместо того чтобы вызывать конструктор для создания экземпляра класса String
Оператор '+' является перегруженным, для объектов типа String, и всегда используется, чтобы объединить две строки операндов. В данном контексте мы говорим об операции конкатенации или сложения строк (хотя '+' не работает как оператор сложения для любых других объектов, кроме строк, например, таких как Point и Circle).
Особенности использования строк в Java
Есть два способа создания строк:
•неявное создание путем присвоения строкового литерала переменной
•явное создание объекта String, через вызов оператора new и вызов конструктора.
String s1строка=литералов"Hello"; |
|
// |
String s3 = |
||
String s2строка=литералов"Hello"; |
// |
// |
|||
s1; одинаковыессылки |
// String |
|
|||
String |
s4 |
=объектnew String("Hello"); |
|
||
String |
s5 |
=объектnew String("Hello"); |
// String |
|
|
Строковые литералы хранятся в общем пуле. Это облегчает совместное использование памяти для строк с тем же содержанием в целях сохранения
памяти. Объекты строк, выделенные с помощью оператора new хранятся в куче (heap), а там нет разделяемого хранилища для одинакового контента (содержания).
Кратко о классе String
Строки String являются неизменяемыми, поэтому строковые литералы с таким контентом хранятся в пуле строк. Изменение содержимого одной строки непосредственно может вызвать нежелательные побочные эффекты и может повлиять на другие строки, использующие ту же память.
Обратитесь к API JDK для того чтобы ознакомиться с полным списком возможностей класса String в java.lang.String.
Методы класса String
//длина |
String |
int length() возвращаетдлину// |
boolean isEmpty() // то же самое thisString.length == 0 //сравнение
boolean equals(String another)НЕЛЬЗЯ//использовать'=='или'!='
длясравненияобъектов |
String в |
Java |
boolean equalsIgnoreCase(String |
another) |
|
int compareTo(Stringвозвращаетеслиэта0 строка another) |
// |
|
совпадаетanother; |
|
another; or >0 |
//еслилексикографически<0 меньше |
|
|
int compareToIgnoreCase(String another) boolean startsWith(String another)
boolean startsWith(String another, int fromIndex) //поискначинается fromIndex
Классы StringBuffer и StringBuilder
JDK предоставляет два класса для поддержки возможностей по изменению строк: это классы StringBuffer и StringBuilder (входят в основной пакет java.lang ).
StringBuffer используется для многопоточных программ StringBuilder для для однопоточных
Методы StringBuffer.
java.lang.StringBuffer. //Методы класса:
// конструкторы
StringBuffer() // инициализация пустой строкой StringBuffer(int size)// определяет размер при инициализации StringBuffer(Stringинициализируетясодержимымs s) //
int length()длинастроки// //Методыдляконструисодержимогоования
StringBuffer append(type arg) /*типможетбытьпримитивным, char[], String, StringBuffer, т.д.*/ //Методыдляманипуляцсодержимыми
StringBuffer delete(int start, int end) StringBuffer deleteCharAt(int index) void setLength(int newSize)
void setCharAt(int index, char newChar) StringBuffer replace(int start, int end, String s) StringBuffer reverse()
//Методыдлявыделенияцелого/частисодержимого char charAt(int index)
String substring(int start)
String substring(int start, int end) String toString()
//тодыдляMeпоиска
int indexOf(String searchKey)
int indexOf(String searchKey, int fromIndex) int lastIndexOf(String searchKey)
int lastIndexOf(String searchKey, int fromIndex)
Обратите внимание, что объект класса StringBuffer является обычным объектом в прямом понимании этого слова. Вам нужно будет использовать конструктор для создания объектов типа класс StringBuffer (вместо инициализации строки). Кроме того, оператор '+' не применяется к объектам, в том числе и к объектам StringBuffer . Вы должны будете использовать такой метод, как append() или insert() чтобы манипулировать StringBuffer .
Пример создания строки из частей
//СоздадимстрокутипаYYYY |
-MM-DD |
HH:MM:SS |
int year = 2010, month = 10, day = |
10; |
|
int hour = 10, minute = 10, second |
= 10; |
|
String dateStr = new StringBuilder().append(year).append("- ").append(month).append("").append(day).append("").append(hour)
.apend(":").append(minute).append(":").append(second).toString(); System.out.println(dateStr);
// StringBuilder более эффективный конкатенация String
String anotherDataStr = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second; System.out.println(anotherDataStr);
Почему стоит использовать StringBuffer и StringBuilder
Объекты StringBuffer или StringBuilder так же, как и любые другие обычные объект хранятся в куче, а не совместно в общем пуле строк.
Следовательно, могут быть изменены, не вызывая нехороших побочных эффектов на другие объекты.
Продолжение GUI
•Графический интерфейс пользователя (GUI) в Java создается с помощью по меньшей мере трех типов объектов:
•компоненты
•события
•слушатели событий
•Мы ранее обсуждали компоненты, которые являются объектами, которые представляют элементы экрана
•Надписи (labels), кнопки (buttons), текстовые поля (text fields), меню и т.д.
•Некоторые компоненты контейнеров, которые содержат и позволяют организовывать другие компоненты
•Фреймы (frames), панели (panels), диалоги и т.д.
•Событие представляет собой объект, который представляет собой некоторую активность, на которою мы можем ответить некоторым образом
•Например, мы можем захотеть нашу программу, чтобы выполнить какое-либо действие, когда происходит следующее:
•Движение мыши
•Перетаскивание мышью
•Нажатие кнопки мыши (лев или прав)
•Нажатие кнопки GUI
•Нажатие клавиши клавиатуры
•Истечение времени по таймеру
•События часто соответствуют действия пользователя, но не всегда
Обработка событий в Java
События и слушатели
Стандартная библиотека классов Java содержит несколько классов, которые представляют собой типичные события. Компоненты, такие как кнопки, генерируют событие, когда оно происходит. Объект слушателя "ждет” события, которое должно произойти и реагирует соответствующим образом. Мы можем конструировать объекты слушателя и принимать любые действия, которые уместны при возникновении события.
GUI Разработка
Как правило, мы используем компоненты и события, которые представляют предопределенные классы в библиотеке классов Java. Поэтому, чтобы создать программу Java, которая использует графический интерфейс мы должны:
•создать экземпляры объектов и настроить необходимые компоненты
•реализовать классы слушателя для любых событий, мы заботимся
•установить связь между слушателей и компонентами, которые генерируют соответствующие события
Давайте теперь рассмотрим некоторые новые компоненты и посмотреть, как все это происходит вместе.
Структура GUI java
Концепция MVC
Приложение должно состоять из 3-х фундаментальных логических частей:
•controller (контроллер),
•model (модель),
•view (представление/отображение).
Блок controller – преобразует действия пользователя (в данном контексте, пользователь – не обязательно человек) во входящие параметры для
Model и передает управление в Model. Блок model – реализует всю логику работы программы и подготавливает данные для отображения. Блок view – визуализирует результаты работы программы.
Каждое действие пользователя всегда запускает цепочку controller- >model->view.
Структура GUI java
Окно JFrame
Каждая GUI-программа запускается в окне и по ходу работы может открывать несколько дополнительных окон.
Вбиблиотеке Swing описан класс JFrame, представляющий собой окно
срамкой и строкой заголовка (с кнопками «Свернуть», «Во весь экран» и «Закрыть»). Оно может изменять размеры и перемещаться по экрану.
Панель содержимого
Напрямую в окне элементы управления не размещаются. Для этого служит панель содержимого, занимающая все пространство окна*.
Обратиться к этой панели можно методом getContentPane() класса JFrame. С помощью метода add(Component component) можно добавить на нее любой элемент управления.
Класс Container (контейнер)
Элементы, которые содержат другие элементы, называются контейнерами. Все они являются потомками класса Container и наследуют от него ряд полезных методов:
• add(Component component) — добавляет в контейнер элемент component;
•remove(Component component) — удаляет из контейнера элемент component;
•removeAll() — удаляет все элементы контейнера;
•getComponentCount() — возвращает число элементов контейнера.
Класс JPanel (панель)
Панель JPanel — это элемент управления, представляющий собой прямоугольное пространство, на котором можно размещать другие элементы. Элементы добавляются и удаляются методами, унаследованными от класса Container.
На самом деле у каждой панели есть так называемый менеджер размещения, который определяет стратегию взаимного расположения элементов, добавляемых на панель. Его можно изменить методом setLayout(LayoutManager manager). Но чтобы передать в этот метод нужный параметр, необходимо знать, какими бывают менеджеры.
GUI проектирование
Мы должны помнить, что цель программного обеспечения, чтобы помочь пользователю решить проблему
•С этой целью проектировщик GUI должен:
•Узнать нужды пользователя
•Предотвратить ошибки пользователей
•Оптимизацию возможностей пользователя
•Быть последовательным
Будьте последовательными
Последовательность –это важно, так-как пользователи привыкают к некоторым вещам, появляющихся и работающих в определенном порядке и связанными определенными отношениями. Цвета должны быть использованы последовательно, чтобы указывать на схожие типы информации или ее обработку. Структура экрана должна соответствовать принятому шаблону при переходе из одной части системы в другую ( например при переходе через меню). Например, сообщения об ошибках должны появляться в местах, соответствующих разработанной структуре меню.
Менеджеры Layout
Менеджер layout manager является объектом, который определяет способ, которым компоненты расположены в контейнере.
Есть несколько предопределенных менеджеров компоновки, определенных в стандартной библиотеке классов Java:
Каждый контейнер имеет менеджер компоновки по умолчанию, но мы можем явным образом установить менеджер компоновки, а также. Каждый менеджер компоновки имеет свои особые правила, регулирующие, как будут организованы компоненты. Некоторые менеджеры компоновки обратить внимание на нужный размер или Расстановка компонента, в то время как другие этого не делают. Менеджер компоновки пытается настроить расположение по мере добавления компонентов и, как контейнеры изменены.
Мы можем использовать метод setLayout , что бы изменить Layout менеджер
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
В следующем примере используется контейнер с закладками, который позволяет работать с одной из нескольких панелей, которые могут быть выбраны
Flow Layout
Flow layout располагает столько компонентов, сколько можно расположить в ряд, затем переходит к следующей строке. Ряды создаются по мере необходимости, чтобы вместить все компоненты. Компоненты отображаются в порядке их добавления в контейнер. Каждая строка компонентов центрируется по горизонтали в окне по умолчанию, но могут быть также выровнены влево или вправо. Кроме того, горизонтальные и вертикальные зазоры между компонентами может быть явно установлены.
Border Layout
Компонент border layout определяет пять областей, в которых компоненты могут быть добавлены с ориентацией по сторонам света и в центре.
BorderLayout – это один из layout Java Swing, который используется для расположения компонентов на контейнере. Принцип, который использует
