Similar presentations:
Лекция 3 (1)
1.
Программирование на языке JavaЛекция 3
Классы и интерфейсы
Программная
Инженерия
2.
Классы и интерфейсыОбщая форма описания класса
<modifier> class <ClassName> {
[modifier] <type> <instance variable1>;
…
[modifier] <type> <instance variable>;
[modifier] <type> <method1>(<arguments>)
{ method body; }
…
[modifier] <type> <method2>(<arguments>)
{ method body; }
}
Программирование на языке Java • Java Programming
2 из 54
3.
Классы и интерфейсыОбщая форма описания класса
class Point
{int x, y;
Point () {
Экземплярные переменные
(instance variables)
x=0; y=0;
}
Конструкторы
Point (int x1,int y1) {
x=x1; y=y1;
}
int getX() {
return x;
Методы класса
}
int getY() {
return y;
}
}
Программирование на языке Java • Java Programming
3 из 54
4.
Классы и интерфейсыСоздание ссылочных переменных и
объектов класса
Point p1;
Создана ссылочная переменная
p1 = new Point();
Создан объект
Point p2 = new Point();
«короткая форма» создания
объекта
Point p3 = p1;
создана ссылочная переменная
указывающая на p1
p3
ссылка
p1
объект
p1
ссылка
Программирование на языке Java • Java Programming
4 из 54
5.
Классы и интерфейсыСоздание ссылочных переменных и
объектов класса
{Point p1 = new Point(5,10);
}
System.out.println(p1.x + "" + p1.y);
Point p1;
{p1 = new Point(5,10);
p1 = null;
}
System.out.println(p1.x + "" + p1.y);
Point p2;
{Point p1 = new Point(5,10);
p2 = p1;
p1 = null;
}
System.out.println(p2.x + “, “ + p2.y);
Программирование на языке Java • Java Programming
Cannot find variable p1
NullPointerException
5, 10
5 из 54
6.
Классы и интерфейсыПерегрузка (overloading) методов
[модификатор] <тип> <имя_метода> (<список форм. парам.)
сигнатура метода
Перегрузка – создание 2 и более методов с одинаковыми
именами но разными сигнатурами
class OverloadDemo {
void test() {
System.out.println(“Параметры отсутствуют”); }
void test(int a, int b) {
System.out.println(“a и b:” + a + ” “ + b); }
void test(double a) {
System.out.println(“Вещественное a:” + a); }
}
Программирование на языке Java • Java Programming
6 из 54
7.
Классы и интерфейсыМодификатор static. Статические члены класса
Объявление: static <type> <name>
Обращение: <classname>.<varname>
Статические переменные:
создаются в единственном экземпляре
существуют вне зависимости от объектов класса
создаются JVM в момент первого обращения к классу
допускают обращение до создания объектов класса
Программирование на языке Java • Java Programming
7 из 54
8.
Классы и интерфейсыМодификатор static. Статические методы
Объявление: static <type> <name> (<parameters>)
Обращение: <classname>.<metodname>()
Статические методы:
• могут вызывать только другие статические методы данного класса
• должны обращаться только к статическим переменным
• внутри статических методов нельзя использовать ссылки this и super
Программирование на языке Java • Java Programming
8 из 54
9.
Классы и интерфейсыМодификатор static. Статические блоки кода
Объявление:
static
{
…
}
Статический блок кода выполняется один раз при
первоначальной загрузке класса
Программирование на языке Java • Java Programming
9 из 54
10.
Классы и интерфейсыМодификатор static. Использование
ключевого слова this
1. Чтобы обойти скрытие переменной экземпляра формальными
параметрами
сlass Point {
int x, y;
Point (int x1, int y1) {
x=x1;
y=y1;
}
}
Программирование на языке Java • Java Programming
сlass Point {
int x, y;
Point (int x, int y) {
this.x=x;
this.y=y;
}
}
10 из 54
11.
Классы и интерфейсыМодификатор static. Использование
ключевого слова this
2. Чтобы вызвать один конструктор из другого конструктора (explicit
constructor invocation)
public class Rectangle {
private int x, y, w, h;
public Rectangle() {
this.x = 0; this.y = 0; this.w = 0; this.h = 0;
}
public Rectangle(int w, int h) {
this.x = 0; this.y = 0; this.w = w; this.h = h;
}
public Rectangle(int x, int y, int w, int h) {
this.x = x; this.y = y; this.w = w; this.h = h;
}
}
Программирование на языке Java • Java Programming
11 из 54
12.
Классы и интерфейсыМодификатор static. Использование
ключевого слова this
2. Чтобы вызвать один конструктор из другого конструктора (explicit
constructor invocation)
public class Rectangle {
private int x, y, w, h;
public Rectangle() {
this(0, 0, 0, 0);
}
public Rectangle(int w, int h) {
this(0, 0, w, h);
}
public Rectangle(int x, int y, int w, int h) {
this.x = x; this.y = y; this.w = w; this.h = h;
}
}
Программирование на языке Java • Java Programming
12 из 54
13.
Классы и интерфейсыВложенные классы
Причины создания вложенных классов:
• Логическая группировка классов
• Расширяет возможности инкапсуляции
• В некоторых случаях повышается читабельность
кода
Статические
nested
classes
Статический вложенный класс
является статическим членом класса, в
который он вложен. Т.е. он не может
напрямую работать с нестатическими
переменными и методами внешнего
класса.
Программирование на языке Java • Java Programming
Нестатические
Inner classes
Внутренний класс является обычным
членом внешнего класса, т.е. существует
только в составе объекта внешнего класса и
имеет прямой доступ к переменным и
методам внешнего класса. Объект
внутреннего класса может существовать
только внутри объекта внешнего класса
13 из 54
14.
Классы и интерфейсыСтатические вложенные классы
class A {
static int x;
int y;
A() {
System.out.println("constructor A");
}
static class B {
B() {
System.out.println("constrcutor B");
x = 5;
y = 15;
}
}
public class Test {
}
public static void main(String[ ] args) {
A.B b = new A.B();
}
}
Программирование на языке Java • Java Programming
14 из 54
15.
Классы и интерфейсыНестатические (внутренние) вложенные классы
class A {
static int x;
int y;
A() {
System.out.println("constructor A");
}
class B {
B() {
System.out.println("constrcutor B");
x = 5;
y = 15;
}
}
public class Test {
}
public static void main(String[ ] args) {
A a = new A();
A.B b = new a.new B();
}
}
Программирование на языке Java • Java Programming
15 из 54
16.
Классы и интерфейсыНаследование
Общая форма объявления класса, наследующего
суперкласс:
class <subclass_name> extends <superclass_name>
{
//тело класса
}
Язык Java не поддерживает множественного
наследования классов!!!
Программирование на языке Java • Java Programming
16 из 54
17.
Классы и интерфейсыНаследование – порядок вызова конструкторов
При создании объекта подкласса всегда вызывается конструктор
базового класса. Если не указано явно, то всегда вызывается
конструктор без параметров (созданный явно или по умолчанию).
Если подходящего конструктора нет – выдается ошибка
компиляции.
В любом классе должен быть созданный явно
конструктор без параметров
class Point3D extends Point {
int z;
Point3D () {
z=0;
}
Point3D (int x1, int y1, int z1) {
z=z1;
}
}
Программирование на языке Java • Java Programming
Создание объекта:
Point3D p3d = new Point3D(10,20,30);
Цепочка вызовов:
Point() -> Point3D(10,20,30)
Вопрос 1: А если в классе Point нет
конструктора Point() ?
Вопрос 2: куда пропали x1, y1?
17 из 54
18.
Классы и интерфейсыНаследование – ключевое слово super
Вызов конструктора непосредственного суперкласса с параметрами
super (parameters) – вызов должен быть первым в конструкторе
подкласса
Внимание! Это применяется только если надо
вызвать конструктор суперкласса с параметрами!
class Point3D extends Point {
int z;
Point3D () {
z=0;
}
Point3D (int x1, int y1, int z1) {
super( x1, y1);
z=z1;
}
}
Программирование на языке Java • Java Programming
Создание объекта:
Point3D p3d = new Point3D(10,20,30);
Цепочка вызовов:
Point(10,20) -> Point3D(10,20,30)
18 из 54
19.
Классы и интерфейсыМодификаторы доступа
o public - доступ в пределах всей программы
o private - доступ только внутри класса, в котором объявлена
o protected – ??? будем разбирать позже
o <default> – ??? будем разбирать позже
Программирование на языке Java • Java Programming
19 из 54
20.
Классы и интерфейсыНемного о проектировании классов
В правильно спроектированном Java-классе, все экземплярные
переменные класса должны иметь модификатор private, доступ
должен осуществляться через set/get методы («сеттеры/геттеры»)
Автоматическая генерация get/set методов:
IntelijIDEA: Code -> Generate -> Getter and Setter
Eclipse: Source -> Generate Getters and Setters
Программирование на языке Java • Java Programming
20 из 54
21.
Классы и интерфейсыНемного о проектировании классов
class Point {
int x, y;
Point () {
x=0;
y=0;
}
Point (int x1,int y1) {
x=x1;
y=y1;
}
}
Программирование на языке Java • Java Programming
class Point {
private int x, y;
Point () {
x=0;
y=0;
}
Point (int x1,int y1) {
x=x1;
y=y1;
}
public int getX() {return x;}
public int getY() {return y;}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
21 из 54
22.
Классы и интерфейсыДинамическая диспетчеризация ссылок
Ссылочной переменной суперкласса может быть назначена ссылка на
любой подкласс, производный от этого суперкласса. Если ссылочная
переменная суперкласса указывает на объект подкласса, через эту
переменную можно получить доступ только к тем членам подкласса,
которые определяются в суперклассе.
class Point {
int x, int y;
}
class Point3D extends Point {
int z;
…
}
Point Pobj;
Point3D Cobj = new Point3D(); Pobj = Cobj;
Pobj.x = 1; //
x определена в Point
Pobj.z = 10; //
…
z не определена в Point
Программирование на языке Java • Java Programming
22 из 54
23.
Классы и интерфейсыДинамическая диспетчеризация методов
Переопределение метода (overriding) – создание в подклассе
метода, совпадающего по сигнатуре с методом суперкласса.
Динамическая диспетчеризация методов – это механизм,
позволяющий определить какой из переопределенных методов нужно
вызвать, во время выполнения, а не во время компиляции.
Динамическая диспетчеризация не работает для статических методов.
Программирование на языке Java • Java Programming
23 из 54
24.
Классы и интерфейсыДинамическая диспетчеризация методов
class Figure {
double dim1, dim2;
Figure(double a, double b){
dim1 = a;
dim2 = b;
}
void square() {
System.out.println (“Square is not defined”);
}
}
Программирование на языке Java • Java Programming
24 из 54
25.
Классы и интерфейсыДинамическая диспетчеризация методов
class Rectangle extends Figure {
Rectangle(double a, double b) {
super(a,b);
}
void square() {
System.out.println(“Rectangle square = ” + (dim1*dim2));
}
}
class Triangle extends Figure {
Triangle(double a, double b) {
super(a,b);
}
void square() {
System.out.println(“Triangle square = ” + (dim1*dim2/2));
}
}
Программирование на языке Java • Java Programming
25 из 54
26.
Классы и интерфейсыДинамическая диспетчеризация методов
class FindSquare {
public static void main(String args[ ]) {
Figure f;
Random r = new Random();
for (int k=0; k<10; k++) {
int i = r.nextInt(100);
if (i<50) {
f = new Rectangle(9,5);
} else {
f = new Triangle(10,8);
Rectangle square = 45.0
} f.square();
Triangle square= 40.0
}
Rectangle square = 45.0
}
Rectangle square = 45.0
}
Triangle square= 40.0
Triangle square= 40.0
Rectangle square = 45.0
Rectangle square = 45.0
Triangle square= 40.0
Rectangle square = 45.0
Программирование на языке Java • Java Programming
26 из 54
27.
Классы и интерфейсыАбстрактные методы и классы
Объявление абстрактного метода:
abstract <type> <method_name> (<parameters>);
Если в классе есть хотя бы один абстрактный метод, то класс
должен быть объявлен абстрактным.
abstract class <class_name>
{
…
}
Любой подкласс абстрактного класса должен или
реализовать
все его абстрактные методы или сам должен быть объявлен
абстрактным !
Программирование на языке Java • Java Programming
27 из 54
28.
Классы и интерфейсыАбстрактные методы и классы
abstract class Figure {
double dim1, dim2;
Figure(double a, double b) {
dim1 = a;
dim2 = b;
}
abstract void square();
}
Программирование на языке Java • Java Programming
28 из 54
29.
Классы и интерфейсыИнтерфейсы
interface Figure {
void square();
}
Интерфейсы допускают множественное наследование
Методы:
o non-implemented (subclasser responsibility)
o static
o default
Все переменные – static и final (без соотв. модификаторов), необходима
инициализация
Программирование на языке Java • Java Programming
29 из 54
30.
Классы и интерфейсыРеализация интерфейсов
class <ClassName> [extends <SuperclassName>] [implements <Interfaces>]
{
…
}
interface Callback {
void callback(int param);
}
class Client implements Callback {
public void callback(int p) {
System.out.println("callback called with " + p);
}
}
Программирование на языке Java • Java Programming
30 из 54
31.
Классы и интерфейсыРеализация интерфейсов
o Методы, которые реализуют интерфейс, должны быть объявлены как
public. Сигнатура типа реализующего метода должна точно
соответствовать сигнатуре типа, указанной в определении интерфейса
o Если класс включает интерфейс, но реализует не все его методы
(кроме абстрактных и статических), то такой класс должен быть
объявлен как абстрактный
o Если класс реализует интерфейс, унаследованный от другого
интерфейса, класс должен реализовать все методы (кроме
абстрактных и статических), определенные в цепочке наследования
интерфейсов
Программирование на языке Java • Java Programming
31 из 54
32.
Классы и интерфейсыСсылочные переменные интерфейсного типа
interface Callback {
void callback(int param);
}
class Client implements Callback {
//реализация метода интерфейса
public void callback(int p) {
System.out.println("callback called with " + p);
}
//собственный метод класса
int getSquare(int p) {
System.out.println("square = " + (p*p));
}
class TestIface {
}
public static void main(String args[ ]) {
Callback с = new Client();
c.callback(42);
c.getSquare(42);
}
}
Программирование на языке Java • Java Programming
32 из 54
33.
Классы и интерфейсыCтатические и дефолтные методы в интерфейсах
interface Vehicle {
static String getType() {
return “Sedan”;
}
default int getWheelsNumber {
return 4;
}
}
class BMW implements Vehicle {
public BMW() {
}
}
String type = Vehicle.getType();
Vehicle bmw = new BMW();
int wheels = bmw.getWheelsNumber();
Программирование на языке Java • Java Programming
33 из 54
34.
Классы и интерфейсыПеременные в интерфейсах
Интерфейсы можно использовать для импорта в различные классы
совместно используемых констант. В том случае, когда вы реализуете в
классе какой-либо интерфейс, все имена переменных этого интерфейса
будут видимы в классе как константы. Если интерфейс не включает в
себя методы, то любой класс, объявляемый реализацией этого
интерфейса, может вообще ничего не реализовывать.
Программирование на языке Java • Java Programming
34 из 54
35.
Классы и интерфейсыПеременные в интерфейсах
interface Constants
{int NO = 0;
int YES = 1;
int MAYBE = 2;
int LATER = 3;
int SOON = 4;
int NEVER = 5;
}
class Question implements Constants {
Random rand = new Random();
int ask() {
int prob = rand.nextInt(100);
if (prob < 30)
return NO;
else if (prob < 60)
return YES;
else if (prob < 75)
return LATER;
else if (prob < 98)
return SOON;
else return NEVER;
}
}
Программирование на языке Java • Java Programming
35 из 54
36.
Классы и интерфейсыВзаимоотношения классов и интерфейсов
implements
C1
I1
extends
C2
C3
extends
implements
extends
C4
C5 C6 C7
I2
I3
extends
I4
I5 I6
I7
extends
I8
Программирование на языке Java • Java Programming
36 из 54
37.
Классы и интерфейсыМодификатор final
final double pi = 3.14;
переменная
//неизменяемая локальная
//метод, для которого запрещено переопределение (overriding)
final int getX() {
…
}
//класс, для которого запрещено наследование
final class A {
…
}
Программирование на языке Java • Java Programming
37 из 54
38.
Классы и интерфейсыFinal члены классов, неизменяемые объекты
class A {
final String mName;
public A(String name) {
mName = name;
}
public getName() {
return mName;
}
public setName(String name) {
mName = name;
}
}
Программирование на языке Java • Java Programming
Преимущества
неизменяемых
объектов:
o Потокобезопасность !
o Производительность
!
38 из 54
39.
Классы и интерфейсыПакеты
Programmer
Raj
Программист
Иван
class List -> List.class
class List -> List.class
Integration
Engineer
Peter
Программирование на языке Java • Java Programming
39 из 54
40.
Классы и интерфейсыПакеты
Java обеспечивает специальный механизм для разделения
пространства имен классов на именованные области. Этот механизм
называется «пакеты» (packages).
Пакет – это контейнер, в пределах которого должна сохраняться
уникальность имен классов.
Общая форма определения пакета:
package <pkg_name>;
Программирование на языке Java • Java Programming
40 из 54
41.
Классы и интерфейсыИерархия пакетов
Пакеты могут образовывать иерархию, т.е. быть вложенными друг в
друга. Чтобы хранить пакеты, Java использует каталоги файловой
системы. Иерархия пакетов = иерархия каталогов. сlass-файлы для всех
классов, принадлежащих к одному пакету, автоматически сохраняются в
каталоге, полный путь к которому совпадает с именем пакета (регистр
важен).
Иерархия пакетов: package pkg1[.pkg2[.pkg3]];
Полное имя класса: [pkg1][.pkg2][.pkg3].className;
Иерархия каталогов:pkg1.pkg2.pkg3 -> pkg1/pkg2/pkg3
Размещением корня любой иерархии пакетов в файловой системе
управляет специальная переменная окружения CLASSPATH.
Программирование на языке Java • Java Programming
41 из 54
42.
Классы и интерфейсыИмпорт имен классов и пакетов
Импорт имени класса или пакета:
import pkg1[.pkg2].(classname|*);
o Импортирование имени класса никак не влияет на уровень доступа к
его элементам
o Импортируется только имя, но не содержимое
o Импортирование пакетов не рекурсивно
o В любую Java-программу автоматически импортируется пакет
java.lang
Программирование на языке Java • Java Programming
42 из 54
43.
Классы и интерфейсыУровни доступа с учетом пакетов
package p1;
public class A {
public int pub;
protected prot;
int def;
private int priv;
}
package p2;
import p1.A;
public class D extends A {
}
public class E {
}
public class B extends A {
}
public class C {
}
Программирование на языке Java • Java Programming
43 из 54
44.
Классы и интерфейсыУровни доступа с учетом пакетов
A
B
C
D
E
public
+
+
+
+
+
protected
+
+
+
+
<default>
+
+
+
private
+
Доступ на уровне класса:
o public - класс виден везде
o <default> - класс виден в пределах своего пакета
Программирование на языке Java • Java Programming
44 из 54
45.
Классы и интерфейсыОбщая структура Java-кода
o В первой строке файла может быть 1 необязательный оператор package
o В следующих строках может быть 1 или несколько необязательных
операторов import
o Далее идут описания классов и интерфейсов
o Среди классов, описанных в одном файле, только один может быть
объявлен с модификатором public.
Программирование на языке Java • Java Programming
45 из 54
46.
Классы и интерфейсыПеречисления в Java
enum Season
{ WINTER, SPRING, SUMMER, AUTUMN }
Season season = Season.SPRING;
if (season == Season.SPRING) {
season = Season.SUMMER;
}
System.out.println(season);
Объявляя enum мы неявно создаем класс производный от java.lang.Enum.
Конструкция enum Season { ... } эквивалентна class Season extends
java.lang.Enum { ... }
Класс, созданный компилятором для реализации перечисления – enum-класс, а
возможные значения перечисляемого типа – элементы enum.
Программирование на языке Java • Java Programming
46 из 54
47.
Классы и интерфейсыПеречисления в Java
Элементы перечисления - экземпляры enum-класса, доступные
статически. Их статическая доступность позволяет нам выполнять
сравнение с помощью оператора сравнения ссылок.
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;
Класс java.lang.Enum содержит ряд полезных методов
Season season = Season.WINTER; System.out.println("season.name()=" +
season.name() + " season.toString()=" + season.toString() + "
season.ordinal()=" + season.ordinal());
Вывод:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Программирование на языке Java • Java Programming
47 из 54
48.
Классы и интерфейсыПеречисления в Java
Задача: получить элемент enum по его строковому представлению.
Решение: В каждом enum-классе компилятор автоматически создает
специальный статический метод: public static EnumClass valueOf(String
name), который возвращает элемент перечисления EnumClass с
названием, равным name.
Пример использования:
String name = "WINTER"; Season season = Season.valueOf(name);
Результат: переменная season будет равна Season.WINTER. Если
элемент не будет найден, то будет выброшен IllegalArgumentException, а
если name равен null - NullPointerException.
Программирование на языке Java • Java Programming
48 из 54
49.
Классы и интерфейсыПеречисления в Java
Задача: получить список всех элементов enum-класса во время
выполнения.
Решение: в каждом enum-классе компилятор создает метод:
public static EnumClass[ ] values()
Пример использования:
System.out.println(Arrays.toString(Season.values()));
Результат:
[WINTER, SPRING, SUMMER, AUTUMN]
Программирование на языке Java • Java Programming
49 из 54
50.
Классы и интерфейсыМетоды с переменным числом аргументов
Для указания аргумента переменной длины используют три точки (...).
Например:
static void vaTest(int ... v) { … }
Эта синтаксическая конструкция указывает компилятору, что метод vaTest
() может вызываться с нулем или более аргументов. В результате v
неявно объявляется как массив типа int [ ]. Таким образом, внутри метода
vaTest () доступ к v осуществляется с использованием синтаксиса
обычного массива.
Программирование на языке Java • Java Programming
50 из 54
51.
Классы и интерфейсыМетоды с переменным числом аргументов
class VarArgs {
static void vaTest(int ... v) {
System.out.println("Кол-во аргументов: " + v.length);
for (int i=0;i<v.length;i++) {
System.out.print (v[i] + " ");
}
public static void main(String args[]) {
vaTest (10); //1 аргумент
vaTest (1, 2, 3); //3 аргумента
vaTest (); // без аргументов \
}
}
Вывод:
Количество аргументов: 1
10
Количество аргументов: 3
123
Количество аргументов: 0
Программирование на языке Java • Java Programming
51 из 54
52.
Классы и интерфейсыМетоды с переменным числом аргументов
class VarArgs {
static void vaTest(int ... v) {
System.out.println("Кол-во аргументов: " + v.length);
for (int i=0;i<v.length;i++) {
System.out.print (v[i] + " ");
}
public static void main(String args[]) {
vaTest (10); //1 аргумент
vaTest (1, 2, 3); //3 аргумента
vaTest (); // без аргументов \
}
}
Вывод:
Количество аргументов: 1
10
Количество аргументов: 3
123
Количество аргументов: 0
Программирование на языке Java • Java Programming
52 из 54
53.
Классы и интерфейсыМетоды с переменным числом аргументов
Параметр переменной длины должен быть последним параметром,
объявленным методом.
int dolt(int a, int b, double с, int ... vals) //верно!
int dolt (int a, int b, double с, int ... vals, boolean stopFlag)
Метод должен содержать только одни параметр типа varargs.
int dolt (int a, int b, double с, int ... vals, double ... morevals)
Программирование на языке Java • Java Programming
53 из 54