Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
56
Добавлен:
25.12.2020
Размер:
836.76 Кб
Скачать

}

public void setName(String name) { this.name = name; } public String getName() { return name; }

public String getType() { return "Домашнее животное"; }

}

public class Cat extends Pet { private Date lastMeowDate; public Cat() { this("Unnamed"); }

public Cat(String name) { super(name); }

public Cat(String name, int age) { super(name, age); } @Override

public String getType() { return "Кот"; } public void meow() {

System.out.println("Meow!"); lastMeowDate = new Date();

}

}

Наследование

super() означает Ссылка на базовый класс, которую можно использовать в дочерних классах.

Переопределение (Overriding)

Означает переписывание (переделывание, переопределение) в классепотомке УЖЕ существующего метода класса-родителя.

Аннотирование в Java

Специальная форма синтаксических метаданных, которая может быть добавлена в исходный код. Аннотации используются для анализа кода, компиляции или выполнения. Аннотируемы пакеты, классы, методы, переменные и параметры. Например: @Override - проверяет, переопределён ли метод. Вызывает ошибку компиляции, если метод не найден в родительском классе;

UML диаграмма отношения классов - наследование

Полиморфизм в Java

Определение полиморфизма.

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

Пример:

Pet pet1 = new Pet(); Pet pet2 = new Cat(); Pet pet3 = new Dog(); pet1.getType(); pet2.getType(); pet3.getType();

Тип ссылка или Тип объект

Pet pet1 = new Pet(); Pet pet2 = new Cat(); Pet pet3 = new Dog(); pet1.getType(); pet2.getType(); pet2.meow(); pet3.getType(); pet3.woof();

Проверьте, есть ли ошибки?

Ошибки

Типы ошибок в Java

Домашнее задание

Необходимо модифицировать программу с домашними животными, таким образом, чтобы можно было делать выборку кошек по возрасту, также добавив начальный список животных собак. К выводу клички добавить тип животного («кот Барсик», «собака Улыбака»).

Класс Object

Методы Object

boolean equals(Object obj);

String toString(); // необходимо переопределять

int hashCode();

Object clone();

Домашнее задание

Создкласскомплексноетьчисло

public class Complex { private int re; private int im;

Complex(int re, int im) { … } @Override

public boolean equals(Object obj) { … } @Override

public String toString() { … } //Метод,реализующоперацсложенияюй

public Complex plus(Complex z) { … }

// Метод, реализующий операцию вычитания public Complex minus(Complex z) { … }

}

Создать класс для демонстрации работы класса комплексных чисел:

public class ComplexTest {

public static void main(String[] args) { Complex z1 = new Complex(1, 0); Complex z2 = new Complex(2, 3); Complex z3 = new Complex(5, 10); System.out.println("z1 = " + z1); System.out.println("z2 = " + z2); System.out.println("z3 = " + z3);

System.out.println("z1 + z2 = " + z1.plus(z2)); System.out.println("z1 - z3 = " + z1.minus(z3)); System.out.println(z1.equals(z3) ? “z1 == z3” : “z1 !=

z3”);

}

}

Абстрактные классы в Java

Когда мы создаем абстрактный класс, то предполагаем наследоваться от него. Так-как абстрактный класс не предполагает создания экземпляров.

В абстрактном классе мы будем определять абстрактные методы, реализовывать которые будем в классах наследниках

public abstract class Pet {

private String name; private int age;

public Pet() { this("Unnamed");}

public Pet(String name) {name = "Unnamed";} public Pet(String name, int age) {

this.name = name; this.age = age;

}

public void setName(String name) { this.name = name; } public String getName() { return name; }

public String getType() { return "Домашнее животное"; } public abstract void say(); // абстрактный метод

}

Класс Cat расширяет Pet

public class Cat extends Pet { private Date lastMeowDate; public Cat() { this("Unnamed"); }

public Cat(String name) { super(name); }

public Cat(String name, int age) { super(name, age); }

@Override

public String getType() { return "Кот"; }

@Override

public void say() { System.out.println("Meow!"); lastMeowDate = new Date();

}

}

Правило наследования Java

Если вы не реализовали в классе наследнике все абстрактные методы абстрактного класса от которого наследовались, то вы получите опять абстрактный класс.

Правило: Класс-наследник может наследовать только один базовый класс, но множество интерфейсов.

В Java множественное наследование реализовано через механизм интерфейсов.

Интерфейсы в Java

Интерфейс Java представляет собой набор абстрактных методов и констант (необязательно). Абстрактный метод представляет собой заголовок метода без тела. Абстрактный метод объявляется с помощью модификатора abstract, потому, что все методы в интерфейсе являются как правило, абстрактными, то у них нет реализации.

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

Интерфейсы

public interface Doable

{

public void doThis(); public int doThat();

public void doThis2 (float value, char ch); public boolean doTheOther (int num);

}

Interface - служебное слово. Ни один из методов. Интерфейс не имеет определения (тела). Точку с запятой следует за каждым каждым заголовком метода. Интерфейс не может быть инстанцирован (создан его экземпляр, хотя он класс). Методы в интерфейсе имеют модификатор public по умолчанию.

Класс формально реализует интерфейс:

Заявив заявив об этом, поэтому в заголовке класса написано

implements.

И обеспечивая реализацию каждого абстрактного метода в интерфейсе.

Если класс утверждает, что он реализует интерфейс, то он должен определить все методы в интерфейсе (создать их реализацию – тело).

Класс, который реализует интерфейс может реализовать другие методы, а также несколько интерфейсов. В дополнение к (или вместо) абстрактных методов, интерфейс может содержать константы. Когда класс реализует интерфейс, он получает доступ ко всем его константам.

Класс может реализовать несколько интерфейсов. Интерфейсы перечисляются в списке, который следует за implements через запятую. Класс должен реализовывать все методы всех интерфейсов, перечисленных в заголовке.

class ManyThings implements interface1, interface2

{

// all methods of both interfaces

}

Библиотека стандартных классов Java содержит много полезных интерфейсов. Интерфейс Comparable одержит один абстрактный метод, называемый compareTo, которая используется для сравнивать два объекта. Мы обсудим этот метод compareTo() при обсуждении класса String. Класс String реализует интерфейс Comparable, это дает нам возможность поставить строки в лексикографическом порядке.

Интерфейсные ссылки и наследование

Предположим, что два класса, Philosopher и Student, оба реализуют интерфейс Speaker у которого есть метод speak() , таким образом обеспечивая предоставление различных версий метода speak().

В следующем коде, первый вызов speak вызывает одну версию, а второй вызывает другую версию:

Speaker guest = new Philospher(); guest.speak();

guest = new Student(); guest.speak();

Имя интерфейса Speaker может быть использовано как тип ссылочной переменной объекта current. Ссылка current ссылка может быть использована, чтобы ссылаться на объект любого класса, который реализует интерфейс

Speaker. Версия метода speak() что следующая строка вызывает зависимость от типа объекта, который является ссылкой на current.

current.speak();

Графические приложения

Все примеры программ, которые мы рассмотрели с вами до этого момента были на основе текстового вывода. Они называются приложениями командной строки, которые взаимодействуют с пользователем с помощью простых текстовых подсказок. Давайте рассмотрим некоторые Javaприложения, в которых используются графические компоненты. Эти компоненты будут служить основой для программ, которые представляют настоящие графические интерфейсы пользователя (GUIs).

Иерархия наследования

Наследование – это цепочка классов, несколько уровней иерархии.

Компоненты GUI

Компонент GUI это объект, который представляет собой элементы представленные на экране, такие как кнопки или текстовые поля и т.п. Связанные с GUI классы определяются в первую очередь в пакете java.awt и в javax.swing packages. Классы относящиеся к пакету Abstract Windowing Toolkit

(AWT) были первоначальным пакетом для GUI в Java. Пакет Java, который называется Swing появился позже и обеспечивает дополнительные и более универсальные компоненты. Оба пакета необходимы для создания GUI программ Java.

Контейнеры GUI

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

frame (фрейм) является контейнером, который используется для отображения, основанного на GUI Java приложения.

Элемент фрейм отображается как отдельное окно с заголовком - он может быть перемещен и изменен на экране по мере необходимости.

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

Панель должна быть добавлена к другому контейнеру, который будет отображаться.

Элемент Label

Элемент label это GUI компонент, который отображает строку текста (обычно название), называют еще этикеткой. Этикетки обычно используются для отображения информации или чтобы идентифицировать другие компоненты в интерфейсе. Давайте посмотрим на программу, которая организует две этикетки на одной панели и отображает эту панель во фрейме. Вообще-то эта программа не является интерактивной, но зато фрейм можно перемещать и изменять его размер.

Пример MeetUp.java

import java.awt.*; import javax.swing.*;

public class MeetUp {

public static void main (String[] args)

{

JFrame frame = new JFrame ("MeetUp"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

JPanel primary = new JPanel(); primary.setBackground (Color.lightGray);

primary.setPreferredSize (new Dimension(250, 75)); JLabel label1 = new JLabel ("You have a Question?"); JLabel label2 = new JLabel ("raise your hand first.");

primary.add (label1); primary.add (label2);

frame.getContentPane().add(primary); frame.pack(); frame.setVisible(true);

}

Вложенные панели

Контейнеры, которые содержат другие компоненты образуют иерархию некую защитную оболочку интерфейса. Эта иерархия может быть довольнотаки сложной, для создания желаемого визуального эффекта. В следующем примере две панели вложены внутрь третьей панели - обратите внимание, какое влияние это имеет и как изменился размер рамки.

ThreePanels.java

import java.awt.*; import javax.swing.*;

public class ThreePanels {

public static void main (String[] args) { JFrame frame = new JFrame (

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

// Создаем первую подпанель

JPanel subPanel1 = new JPanel(); subPanel1.setPreferredSize (new Dimension(150, 100)); subPanel1.setBackground (Color.green);

JLabel label1 = new JLabel ("One"); subPanel1.add (label1);

Соседние файлы в папке Лекции