1.15M
Категория: ПрограммированиеПрограммирование

Лекция 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
English     Русский Правила