SlideShare a Scribd company logo
Классы и методы
Описание класса
<модификатор> class <ИмяКласса>
{[модификатор] <тип> <переменная_экземпляра1>;
…
[модификатор] <тип> <переменная_экземпляраN>;
[модификатор] <тип> <метод_класса1>(<список форм. парам.)
{ // тело метода; }
…
[модификатор] <тип> <метод_классаМ>(<список форм.парам.>)
{ // тело метода; }
}
1
Классы и методы
Описание класса
class Point
{int x, y;
Point ()

Экземплярные переменные
(instance variables)

{x=0; y=0;
}
Point (int x1,int y1)

Конструкторы
Члены класса (class
(перегруженные)
members)

{x=x1; y=y1;
}
int getX() {return x;}
int getY() {return y;}
}

Методы класса (methods)

2
Классы и методы
Создание ссылочных переменных
и объектов класса
Point p1;

создана ссылочная переменная

p1 = new Point();
Point p2 = new Point();
Point p3 = p1;
p1

создан объект
«короткая форма»
создания объекта
создана ссылочная переменная
указывающая на p1

объект

p3 cсылка на p1
3
Классы и методы
Создание ссылочных переменных
и объектов класса

Cannot find variable p1
Point p1;
{ p1 = new Point(5,10);
p1 = null;
}
System.out.println(p1.x + "" + p1.y);

5, 10

{Point p1 = new Point(5,10);
}
System.out.println(p1.x + "" + p1.y);

NullPointerException
Point p2;
{Point p1 = new Point(5,10);
p2 = p1;
p1 = null;
}
System.out.println(p2.x + “, “ + p2.y);
4
Классы и методы
Перегрузка (overloading) методов
[модификатор] <тип> <имя_метода> (<список форм. парам.)
сигнатура метода
Перегрузка – создание 2 и более методов с одинаковыми
именами но разными сигнатурами

5
Классы и методы
Перегрузка (overloading) методов
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);
}
}

6
Классы и методы
Модификатор static
Статические переменные
Объявление: static <type> <name>
Обращение: <classname>.<varname>
Статические переменные:
•

создаются в единственном экземпляре

•

существуют вне зависимости от объектов класса

•

создаются JVM в момент первого обращения к
классу

•

допускают обращение до создания объектов
класса
7
Классы и методы
Модификатор static
Статические методы
Объявление: static <type> <name> (<parameters>)
Обращение: <classname>.<metodname>()
Статические методы:
•

могут вызывать только другие статические
методы данного класса

•

должны обращаться только к статическим
переменным

•

внутри статических методов нельзя
использовать ссылки this и super
8
Классы и методы
Модификатор static
Статические блоки кода
Объявление:
static
{
…
}
Статический блок кода выполняется один раз при
первоначальной загрузке класса

9
Классы и методы
Использование ключевого слова this
1. Чтобы обойти скрытие переменной
экземпляра формальными параметрами
Class Point
{

int x, y;
Point (int x, int y)
{this.x=x;
this.y=y;
}

}
10
Классы и методы
Использование ключевого слова 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; }
}

11
Классы и методы
Использование ключевого слова 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; }
}

12
Классы и методы
Вложенные классы
Вложенные
классы

Статические
вложенные классы

Нестатические
вложенные классы

(static nested classes)

(inner classes внутренние классы)
Причины создания вложенных классов:
1.Логическая группировка классов
2.Расширяет возможности инкапсуляции
3.В некоторых случаях повышает читабельность кода
13
Классы и методы
Статические вложенные классы
Статический вложенный класс является
статическим членом класса, в который он
вложен. Т.е. он не может напрямую
работать с нестатическими переменными и
методами внешнего класса.

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;
public class Test {
A a = new A();
public static void main(String[ ] args)
a.y = 15;
{
}
A.B b = new A.B();
}
}
}
}
15
Классы и методы
Нестатические вложенные классы
Нестатический вложенный класс является
обычным членом внешнего класса, т.е.
существует только в составе объекта
внешнего класса и имеет прямой доступ к
переменным и методам внешнего класса.
Объект вложенного класса
может существовать только
внутри объекта внешнего
класса
Существуют (и довольно часто
используются) также анонимные
внутренние классы (рассмотрим в
обработке событий)
16
Классы и методы
Нестатические вложенные классы
class A {
static int x;
int y;
A()
{ System.out.println("constructor A"); }
class B {
B()
{ System.out.println("constrcutor B");
x = 5;
public class Test {
y = 15;
public static void main(String[ ] args)
}
{
A a = new A();
}
A.B b = a.new B();
}
}
}

17
Классы и методы
Наследование
Общая форма объявления класса, наследующего
суперкласс:
class <subclass_name> extends <superclass_name>
{
//тело класса
}
Язык Java не поддерживает множественного
наследования классов!!!
18
Классы и методы
Наследование
class Point3D extends Point
{int z;
Point3D ()
{ z=0; }
Point3D (int x1, int y1, int z1)
{ z=z1; }
}

19
Классы и методы
Порядок вызова конструкторов при
наследовании
При создании объекта подкласса всегда вызывается
конструктор его базового класса, у того конструктор
его базового класса и т.д. вплоть до корня иерархии
(класса Object). Причем если не указано явно (с
помощью super) вызывается конструктор без
параметров (созданный явно или по умолчанию).
Если
подходящего конструктора нет – выдается ошибка
компиляции.

20
Классы и методы
Ключевое слово super
1. Вызов конструктора непосредственного суперкласса
super (parameters) – вызов должен быть первым
в конструкторе подкласса
Внимание! Это применяется только если надо
вызвать конструктор суперкласса с параметрами!
2.

Доступ к элементу суперкласса, скрытому
элементом подкласса
super.var_name или super.metod_name()
(super не влияет на тип доступа)
21
Классы и методы
Порядок вызова конструкторов при
наследовании без использования super
class Point3D extends Point
{int z;
Point3D ()
{ z=0; }
Point3D (int x1,int y1, int z1)
{ z=z1; }

Point3D p3d = new Point3D();
Point() -> Point3D()
Point3D p3d = new Point3D(10, 20, 30);
Point() -> Point3D(10,20,30)

}

22
Классы и методы
Порядок вызова конструкторов при
наследовании с использованием
super
class Point3D extends Point
{int z;
Point3D ()
{ z=0; }
Point3D (int x1,int y1, int z1)
{ super (x1, y1);

Point3D p3d = new Point3D();
Point() -> Point3D()
Point3D p3d = new Point3D(10, 20, 30);
Point(10, 20) -> Point3D(10,20,30)

z=z1; }
}
23
Классы и методы
Модификаторы доступа
class Parent

class Other

{public int v1;

{

private int v2;

// доступны v1, v3, v4

protected int v3; class Child

// недоступна v2

int v4;

extends Parent

}

{

}

// доступны v1, v3, v4
// недоступна v2
}
24
Классы и методы
Модификаторы доступа
В правильно спроектированном Javaклассе, все экземплярные
переменные класса должны иметь
модификатор private, доступ должен
осуществляться через set/get методы
(«сеттеры/геттеры»)
В Eclipse:
Source -> generate Getters and Setters

25
Классы и методы
Модификаторы доступа
class Point
{private int x, y;
class Point
{int x, y;
Point ()
{x=0; y=0; }
Point (int x1,int y1)

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 int setX(int x) {
this.x = x;}

{x=x1; y=y1; }
}

public int setY(int y) {
this.y = y;}
}
26
Классы и методы
Динамическая
диспетчеризация ссылок
Ссылочной переменной суперкласса может быть
назначена ссылка на любой подкласс, производный
от этого суперкласса. Если ссылочная переменная
суперкласса указывает на объект подкласса, через
эту переменную можно получить доступ только к тем
членам подкласса, которые определяются в
суперклассе.

27
Классы и методы
Динамическая
диспетчеризация ссылок
class Point

Point Pobj = new Point();

{
int x, int y;

Point3D Cobj = new Point3D();
Pobj = Cobj;

}
class Point3D extends Point
{
int z;
}

…

Pobj.x = 1; //верно! x определена в
Point
Pobj.z = 10; //ошибка! z не
определена в Point
…
28
Классы и методы
Динамическая
диспетчеризация методов
Переопределение метода (overriding) – создание в подклассе
метода, совпадающего по сигнатуре с методом суперкласса.
Динамическая диспетчеризация методов – это механизм,
позволяющий определить какой из переопределенных
методов нужно вызвать, во время выполнения,
а не во время компиляции.

29
Классы и методы
Динамическая
диспетчеризация методов
class Figure

class Rectangle extends Figure

{double dim1, dim2;

{Rectangle(double a, double b)

Figure(double a, double b)

{super(a,b); }

{dim1 = a; dim2 = b; }

void square()

void square()
{System.out.println (“Square
is not defined”); }

{System.out.println(“Rectangle
square = ” + (dim1*dim2)); }
}

}
30
Классы и методы
Динамическая
диспетчеризация методов
class Triangle extends Figure
{Triangle(double a, double b)
{super(a,b); }
void square()
{System.out.println(“Trian
gle square= ” +
(dim1*dim2/2)); }
}

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); }
f.square(); }
} }
31
Классы и методы
Динамическая
диспетчеризация методов
Вывод этой программы:

Rectangle square = 45.0
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
32
Классы и методы
Абстрактные методы и классы
Объявление абстрактного метода:
abstract <type> <method_name> (<parameters>);
Если в классе есть хотя бы один абстрактный метод ->
класс должен быть объявлен абстрактным.
abstract class <class_name>
{
…
}
Любой подкласс абстрактного класса должен или реализовать
все его абстрактные методы или сам должен быть объявлен
абстрактным !
33
Классы и методы
Абстрактные методы и классы
abstract class Figure
{double dim1, dim2;
Figure(double a, double b)
{dim1 = a;
dim2 = b;
}
abstract void square();
}

34
Интерфейсы
[<модификатор>] interface <имя> [extends
<список интерфейсов>]
{ <тип> <имя_метода>(<список
параметров>);
...
<тип> <имя_константы> = <значение>;
}
1. Интерфейсы допускают множественное наследование
2. Все методы – абстрактные (без модификатора abstract)
3. Все переменные – static и final (без соотв.
модификаторов), необходима инициализация
4. Все переменные и методы – public (без модификатора)
35
Интерфейсы
Реализация интерфейсов
class <имя_класса> [extends <имя_суперкласса>]
[implements <список интерфейсов>]
{ …}
interface Callback
{void callback(int param);
}
class Client implements Callback
{public void callback(int p)
{System.out.println("callback called with " + p); }
}
36
Интерфейсы
Реализация интерфейсов

Особенности реализации интерфейсов:
1. Методы, которые реализуют интерфейс, должны быть
объявлены как public. Сигнатура типа реализующего метода
должна точно соответствовать сигнатуре типа, указанной в
определении интерфейса.
2. Если класс включает интерфейс, но реализует не все его
методы, то такой класс должен быть объявлен как
абстрактный.
3. Если класс реализует интерфейс, унаследованный от другого
интерфейса, класс должен реализовать все методы,
определенные в цепочке наследования интерфейсов.
37
Интерфейсы
Ссылочные переменные
интерфейсного типа
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));}
}

38
Интерфейсы
Ссылочные переменные
интерфейсного типа
class TestIface
{public static void main(String args[ ])
{Callback с = new Client();
c.callback(42); //верно!
c.getSquare(42); //ошибка! ссылочная
переменная интерфейсного типа не может
обращаться к собственным методам
классов
}
}
39
Интерфейсы
Взаимоотношения классов и
интерфейсов
Классы

Интерфейсы
implements

C1

I1

extends

C2

C3

extends
implements

extends

C4

C5 C6 C7

I2

I3
extends

I4

I5 I6

I7

extends

I8
40
Классы и методы
Модификатор final
1. final double pi = 3.14; //неизменяемая
локальная переменная
2. final int getX()
{…}
//метод, для которого запрещено
переопределение (overriding)
3. final class A
{…}
//класс, для которого запрещено
наследование
41
Классы и методы
class A {

final-члены классов,
неизменяемые объекты

final String mName;
public A(String name) {
mName = name;

Преимущества

}

неизменяемых объектов:

public getName() {

1) Потокобезопасность !

return mName;

2) Производительность !

}
public setK(String name) {
mName = name;
}
}

42
Классы и методы
Перечисления в Java: enum
enum Season
{ WINTER, SPRING, SUMMER, AUTUMN }

Season season = Season.SPRING;
if (season == Season.SPRING) {
season = Season.SUMMER;
}
System.out.println(season);

43
Классы и методы
Перечисление – это класс
Объявляя enum мы неявно создаем класс
производный от java.lang.Enum. Конструкция
enum Season { ... }
эквивалентна
class Season extends java.lang.Enum { ... }.
Явным образом наследоваться от java.lang.Enum
не позволяет компилятор, но:
System.out.println(Season.class.getSuperclass());
дает вывод:
class java.lang.Enum
44
Классы и методы
Перечисление – это класс
Собственно наследование за нас автоматически
выполняет компилятор Java.
Условимся называть класс, созданный
компилятором для реализации перечисления –
enum-классом,
а возможные значения перечисляемого типа –
элементами enum-a.
Элементы перечисления - экземпляры enumкласса, доступные статически.

45
Классы и методы
Название и порядковый номер
элемента enum
Любой enum-класс наследует 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
46
Классы и методы
Получение элемента по
строковому имени
Задача: получить элемент 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.
47
Классы и методы
Получение всех элементов
перечисления
Иногда необходимо получить список всех элементов enumкласса во время выполнения. Для этих целей в каждом enumклассе компилятор создает метод:
public static EnumClass[ ] values()
Пример использования:
System.out.println(Arrays.toString(Season.values()));
Вывод:
[WINTER, SPRING, SUMMER, AUTUMN]
Обратите внимание, что ни метод valueOf(), ни метод values()
не определен в классе java.lang.Enum. Вместо этого они
автоматически добавляются компилятором на этапе
компиляции enum-класса.
48
Классы и методы
Методы с переменным числом
аргументов в Java
Возможность была добавлена в JDK 1.5.
Для указания аргумента переменной длины
используют три точки (...). Например:
static void vaTest(int ... v) { … }
Эта синтаксическая конструкция указывает
компилятору, что метод vaTest () может
вызываться с нулем или более аргументов. В
результате v неявно объявляется как массив типа
int [ ]. Таким образом, внутри метода vaTest ()
доступ к v осуществляется с использованием
синтаксиса обычного массива.
49
Классы и методы
Методы с переменным числом
аргументов в Java
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 (); // без аргументов
}
}

50
Классы и методы
Методы с переменным числом
аргументов в Java
Вывод:
Количество аргументов: 1
10
Количество аргументов: 3
123
Количество аргументов: 0

51
Классы и методы
Методы с переменным числом
аргументов в Java
Вместе с параметром переменной длины массив
может содержать обычные параметры. Однако
параметр переменной длины должен быть
последним параметром, объявленным методом.
Например:
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) // ошибка!
52
Пакеты
Понятие пакета
Java обеспечивает специальный механизм для
разделения пространства имен классов на
именованные области. Этот механизм
называется «пакеты» (packages). Пакет – это
контейнер для классов, в пределах которого
должна сохраняться уникальность имен
классов.
Общая форма определения пакета:
package <pkg_name>;
53
Пакеты
Иерархия пакетов
Иерархия пакетов:
package pkg1[.pkg2[.pkg3]];
Чтобы хранить пакеты, Java использует
каталоги файловой системы. Classфайлы для всех классов, принадлежащих
к одному пакету, должны быть сохранены
в каталоге, название которого
совпадает с именем пакета (регистр важен).
package java.awt.image;

javaawtimage

Размещением корня любой иерархии пакетов в файловой
системе управляет специальная переменная окружения
CLASSPATH.
54
Пакеты
Импорт пакетов
Полное имя класса включает всю иерархию пакетов.
Импорт класса или пакета:
import pkg1[.pkg2].(classname|*);
1. Импортирование класса никак не влияет на
уровень доступа к его элементам !!!
2. В любую Java-программу автоматически
импортируется пакет java.lang.* !!!

55
Пакеты
Уровни доступа с учетом пакетов
package p1;

package p2;

public class A {

public class D extends A {

public int pub;

}

protected prot;

public class E {

int def;

}

private int priv;
}
public class B extends A {
}
public class C { }
56
Пакеты
Уровни доступа с учетом пакетов
A

B

C

D

E

public

+

+

+

+

+

protecte
d

+

+

+

+

-

<default>

+

+

+

-

-

private

+

-

-

-

-

57
Пакеты
Уровни доступа с учетом пакетов
1. Доступ на уровне класса:
-

public - класс виден везде

-

<default> - класс виден в пределах
своего пакета

2. Доступ на уровне членов класса:
Модификатор

Внутри В том же
класса
пакете

Подкласс в
другом
пакете

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

public

+

+

+

+

protected

+

+

+

-

<default>

+

+

-

-

private

+

-

-

58
Структура Java-программы
-

В первой строке файла может
быть 1 необязательный оператор
package

-

В следующих строках может быть
1 или несколько необязательных
операторов import

-

Далее идут описания классов и
интерфейсов

Среди классов, описанных в одном
файле, только один может быть
объявлен с модификатором
public.
59
Ad

More Related Content

Similar to 3. java lecture classes (20)

Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
itc73
 
Lec 2
Lec 2Lec 2
Lec 2
Alexander Rusin
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
Igor Shkulipa
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
Igor Shkulipa
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
chashnikov
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работам
student_kai
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
Ural Federal University named after First President of Russia B.N. Yeltsin
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
robete3065
 
наследование
наследованиенаследование
наследование
mary110190
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
Tricky Java Generics
Tricky Java GenericsTricky Java Generics
Tricky Java Generics
Alexander Matorin
 
посов илья. база генерируемых задач
посов илья. база генерируемых задачпосов илья. база генерируемых задач
посов илья. база генерируемых задач
VeeRoute
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
itc73
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
Igor Shkulipa
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
Igor Shkulipa
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
chashnikov
 
презентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работампрезентация кметодическим указаниям к лаб. работам
презентация кметодическим указаниям к лаб. работам
student_kai
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
robete3065
 
наследование
наследованиенаследование
наследование
mary110190
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
Igor Shkulipa
 
посов илья. база генерируемых задач
посов илья. база генерируемых задачпосов илья. база генерируемых задач
посов илья. база генерируемых задач
VeeRoute
 

More from MERA_school (6)

2. java lecture syntax
2. java lecture syntax2. java lecture syntax
2. java lecture syntax
MERA_school
 
7. java lecture events
7. java lecture events7. java lecture events
7. java lecture events
MERA_school
 
6. java lecture swing
6. java lecture swing6. java lecture swing
6. java lecture swing
MERA_school
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
MERA_school
 
4. java lecture exceptions
4. java lecture exceptions4. java lecture exceptions
4. java lecture exceptions
MERA_school
 
1. java lecture intro
1. java lecture intro1. java lecture intro
1. java lecture intro
MERA_school
 
2. java lecture syntax
2. java lecture syntax2. java lecture syntax
2. java lecture syntax
MERA_school
 
7. java lecture events
7. java lecture events7. java lecture events
7. java lecture events
MERA_school
 
6. java lecture swing
6. java lecture swing6. java lecture swing
6. java lecture swing
MERA_school
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
MERA_school
 
4. java lecture exceptions
4. java lecture exceptions4. java lecture exceptions
4. java lecture exceptions
MERA_school
 
1. java lecture intro
1. java lecture intro1. java lecture intro
1. java lecture intro
MERA_school
 
Ad

3. java lecture classes

  • 1. Классы и методы Описание класса <модификатор> class <ИмяКласса> {[модификатор] <тип> <переменная_экземпляра1>; … [модификатор] <тип> <переменная_экземпляраN>; [модификатор] <тип> <метод_класса1>(<список форм. парам.) { // тело метода; } … [модификатор] <тип> <метод_классаМ>(<список форм.парам.>) { // тело метода; } } 1
  • 2. Классы и методы Описание класса class Point {int x, y; Point () Экземплярные переменные (instance variables) {x=0; y=0; } Point (int x1,int y1) Конструкторы Члены класса (class (перегруженные) members) {x=x1; y=y1; } int getX() {return x;} int getY() {return y;} } Методы класса (methods) 2
  • 3. Классы и методы Создание ссылочных переменных и объектов класса Point p1; создана ссылочная переменная p1 = new Point(); Point p2 = new Point(); Point p3 = p1; p1 создан объект «короткая форма» создания объекта создана ссылочная переменная указывающая на p1 объект p3 cсылка на p1 3
  • 4. Классы и методы Создание ссылочных переменных и объектов класса Cannot find variable p1 Point p1; { p1 = new Point(5,10); p1 = null; } System.out.println(p1.x + "" + p1.y); 5, 10 {Point p1 = new Point(5,10); } System.out.println(p1.x + "" + p1.y); NullPointerException Point p2; {Point p1 = new Point(5,10); p2 = p1; p1 = null; } System.out.println(p2.x + “, “ + p2.y); 4
  • 5. Классы и методы Перегрузка (overloading) методов [модификатор] <тип> <имя_метода> (<список форм. парам.) сигнатура метода Перегрузка – создание 2 и более методов с одинаковыми именами но разными сигнатурами 5
  • 6. Классы и методы Перегрузка (overloading) методов 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); } } 6
  • 7. Классы и методы Модификатор static Статические переменные Объявление: static <type> <name> Обращение: <classname>.<varname> Статические переменные: • создаются в единственном экземпляре • существуют вне зависимости от объектов класса • создаются JVM в момент первого обращения к классу • допускают обращение до создания объектов класса 7
  • 8. Классы и методы Модификатор static Статические методы Объявление: static <type> <name> (<parameters>) Обращение: <classname>.<metodname>() Статические методы: • могут вызывать только другие статические методы данного класса • должны обращаться только к статическим переменным • внутри статических методов нельзя использовать ссылки this и super 8
  • 9. Классы и методы Модификатор static Статические блоки кода Объявление: static { … } Статический блок кода выполняется один раз при первоначальной загрузке класса 9
  • 10. Классы и методы Использование ключевого слова this 1. Чтобы обойти скрытие переменной экземпляра формальными параметрами Class Point { int x, y; Point (int x, int y) {this.x=x; this.y=y; } } 10
  • 11. Классы и методы Использование ключевого слова 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; } } 11
  • 12. Классы и методы Использование ключевого слова 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; } } 12
  • 13. Классы и методы Вложенные классы Вложенные классы Статические вложенные классы Нестатические вложенные классы (static nested classes) (inner classes внутренние классы) Причины создания вложенных классов: 1.Логическая группировка классов 2.Расширяет возможности инкапсуляции 3.В некоторых случаях повышает читабельность кода 13
  • 14. Классы и методы Статические вложенные классы Статический вложенный класс является статическим членом класса, в который он вложен. Т.е. он не может напрямую работать с нестатическими переменными и методами внешнего класса. 14
  • 15. Классы и методы Статические вложенные классы class A { static int x; int y; A() { System.out.println("constructor A"); } static class B {B() { System.out.println("constrcutor B"); x = 5; public class Test { A a = new A(); public static void main(String[ ] args) a.y = 15; { } A.B b = new A.B(); } } } } 15
  • 16. Классы и методы Нестатические вложенные классы Нестатический вложенный класс является обычным членом внешнего класса, т.е. существует только в составе объекта внешнего класса и имеет прямой доступ к переменным и методам внешнего класса. Объект вложенного класса может существовать только внутри объекта внешнего класса Существуют (и довольно часто используются) также анонимные внутренние классы (рассмотрим в обработке событий) 16
  • 17. Классы и методы Нестатические вложенные классы class A { static int x; int y; A() { System.out.println("constructor A"); } class B { B() { System.out.println("constrcutor B"); x = 5; public class Test { y = 15; public static void main(String[ ] args) } { A a = new A(); } A.B b = a.new B(); } } } 17
  • 18. Классы и методы Наследование Общая форма объявления класса, наследующего суперкласс: class <subclass_name> extends <superclass_name> { //тело класса } Язык Java не поддерживает множественного наследования классов!!! 18
  • 19. Классы и методы Наследование class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1, int y1, int z1) { z=z1; } } 19
  • 20. Классы и методы Порядок вызова конструкторов при наследовании При создании объекта подкласса всегда вызывается конструктор его базового класса, у того конструктор его базового класса и т.д. вплоть до корня иерархии (класса Object). Причем если не указано явно (с помощью super) вызывается конструктор без параметров (созданный явно или по умолчанию). Если подходящего конструктора нет – выдается ошибка компиляции. 20
  • 21. Классы и методы Ключевое слово super 1. Вызов конструктора непосредственного суперкласса super (parameters) – вызов должен быть первым в конструкторе подкласса Внимание! Это применяется только если надо вызвать конструктор суперкласса с параметрами! 2. Доступ к элементу суперкласса, скрытому элементом подкласса super.var_name или super.metod_name() (super не влияет на тип доступа) 21
  • 22. Классы и методы Порядок вызова конструкторов при наследовании без использования super class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { z=z1; } Point3D p3d = new Point3D(); Point() -> Point3D() Point3D p3d = new Point3D(10, 20, 30); Point() -> Point3D(10,20,30) } 22
  • 23. Классы и методы Порядок вызова конструкторов при наследовании с использованием super class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { super (x1, y1); Point3D p3d = new Point3D(); Point() -> Point3D() Point3D p3d = new Point3D(10, 20, 30); Point(10, 20) -> Point3D(10,20,30) z=z1; } } 23
  • 24. Классы и методы Модификаторы доступа class Parent class Other {public int v1; { private int v2; // доступны v1, v3, v4 protected int v3; class Child // недоступна v2 int v4; extends Parent } { } // доступны v1, v3, v4 // недоступна v2 } 24
  • 25. Классы и методы Модификаторы доступа В правильно спроектированном Javaклассе, все экземплярные переменные класса должны иметь модификатор private, доступ должен осуществляться через set/get методы («сеттеры/геттеры») В Eclipse: Source -> generate Getters and Setters 25
  • 26. Классы и методы Модификаторы доступа class Point {private int x, y; class Point {int x, y; Point () {x=0; y=0; } Point (int x1,int y1) 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 int setX(int x) { this.x = x;} {x=x1; y=y1; } } public int setY(int y) { this.y = y;} } 26
  • 27. Классы и методы Динамическая диспетчеризация ссылок Ссылочной переменной суперкласса может быть назначена ссылка на любой подкласс, производный от этого суперкласса. Если ссылочная переменная суперкласса указывает на объект подкласса, через эту переменную можно получить доступ только к тем членам подкласса, которые определяются в суперклассе. 27
  • 28. Классы и методы Динамическая диспетчеризация ссылок class Point Point Pobj = new Point(); { int x, int y; Point3D Cobj = new Point3D(); Pobj = Cobj; } class Point3D extends Point { int z; } … Pobj.x = 1; //верно! x определена в Point Pobj.z = 10; //ошибка! z не определена в Point … 28
  • 29. Классы и методы Динамическая диспетчеризация методов Переопределение метода (overriding) – создание в подклассе метода, совпадающего по сигнатуре с методом суперкласса. Динамическая диспетчеризация методов – это механизм, позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции. 29
  • 30. Классы и методы Динамическая диспетчеризация методов class Figure class Rectangle extends Figure {double dim1, dim2; {Rectangle(double a, double b) Figure(double a, double b) {super(a,b); } {dim1 = a; dim2 = b; } void square() void square() {System.out.println (“Square is not defined”); } {System.out.println(“Rectangle square = ” + (dim1*dim2)); } } } 30
  • 31. Классы и методы Динамическая диспетчеризация методов class Triangle extends Figure {Triangle(double a, double b) {super(a,b); } void square() {System.out.println(“Trian gle square= ” + (dim1*dim2/2)); } } 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); } f.square(); } } } 31
  • 32. Классы и методы Динамическая диспетчеризация методов Вывод этой программы: Rectangle square = 45.0 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 32
  • 33. Классы и методы Абстрактные методы и классы Объявление абстрактного метода: abstract <type> <method_name> (<parameters>); Если в классе есть хотя бы один абстрактный метод -> класс должен быть объявлен абстрактным. abstract class <class_name> { … } Любой подкласс абстрактного класса должен или реализовать все его абстрактные методы или сам должен быть объявлен абстрактным ! 33
  • 34. Классы и методы Абстрактные методы и классы abstract class Figure {double dim1, dim2; Figure(double a, double b) {dim1 = a; dim2 = b; } abstract void square(); } 34
  • 35. Интерфейсы [<модификатор>] interface <имя> [extends <список интерфейсов>] { <тип> <имя_метода>(<список параметров>); ... <тип> <имя_константы> = <значение>; } 1. Интерфейсы допускают множественное наследование 2. Все методы – абстрактные (без модификатора abstract) 3. Все переменные – static и final (без соотв. модификаторов), необходима инициализация 4. Все переменные и методы – public (без модификатора) 35
  • 36. Интерфейсы Реализация интерфейсов class <имя_класса> [extends <имя_суперкласса>] [implements <список интерфейсов>] { …} interface Callback {void callback(int param); } class Client implements Callback {public void callback(int p) {System.out.println("callback called with " + p); } } 36
  • 37. Интерфейсы Реализация интерфейсов Особенности реализации интерфейсов: 1. Методы, которые реализуют интерфейс, должны быть объявлены как public. Сигнатура типа реализующего метода должна точно соответствовать сигнатуре типа, указанной в определении интерфейса. 2. Если класс включает интерфейс, но реализует не все его методы, то такой класс должен быть объявлен как абстрактный. 3. Если класс реализует интерфейс, унаследованный от другого интерфейса, класс должен реализовать все методы, определенные в цепочке наследования интерфейсов. 37
  • 38. Интерфейсы Ссылочные переменные интерфейсного типа 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));} } 38
  • 39. Интерфейсы Ссылочные переменные интерфейсного типа class TestIface {public static void main(String args[ ]) {Callback с = new Client(); c.callback(42); //верно! c.getSquare(42); //ошибка! ссылочная переменная интерфейсного типа не может обращаться к собственным методам классов } } 39
  • 41. Классы и методы Модификатор final 1. final double pi = 3.14; //неизменяемая локальная переменная 2. final int getX() {…} //метод, для которого запрещено переопределение (overriding) 3. final class A {…} //класс, для которого запрещено наследование 41
  • 42. Классы и методы class A { final-члены классов, неизменяемые объекты final String mName; public A(String name) { mName = name; Преимущества } неизменяемых объектов: public getName() { 1) Потокобезопасность ! return mName; 2) Производительность ! } public setK(String name) { mName = name; } } 42
  • 43. Классы и методы Перечисления в Java: enum enum Season { WINTER, SPRING, SUMMER, AUTUMN } Season season = Season.SPRING; if (season == Season.SPRING) { season = Season.SUMMER; } System.out.println(season); 43
  • 44. Классы и методы Перечисление – это класс Объявляя enum мы неявно создаем класс производный от java.lang.Enum. Конструкция enum Season { ... } эквивалентна class Season extends java.lang.Enum { ... }. Явным образом наследоваться от java.lang.Enum не позволяет компилятор, но: System.out.println(Season.class.getSuperclass()); дает вывод: class java.lang.Enum 44
  • 45. Классы и методы Перечисление – это класс Собственно наследование за нас автоматически выполняет компилятор Java. Условимся называть класс, созданный компилятором для реализации перечисления – enum-классом, а возможные значения перечисляемого типа – элементами enum-a. Элементы перечисления - экземпляры enumкласса, доступные статически. 45
  • 46. Классы и методы Название и порядковый номер элемента enum Любой enum-класс наследует 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 46
  • 47. Классы и методы Получение элемента по строковому имени Задача: получить элемент 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. 47
  • 48. Классы и методы Получение всех элементов перечисления Иногда необходимо получить список всех элементов enumкласса во время выполнения. Для этих целей в каждом enumклассе компилятор создает метод: public static EnumClass[ ] values() Пример использования: System.out.println(Arrays.toString(Season.values())); Вывод: [WINTER, SPRING, SUMMER, AUTUMN] Обратите внимание, что ни метод valueOf(), ни метод values() не определен в классе java.lang.Enum. Вместо этого они автоматически добавляются компилятором на этапе компиляции enum-класса. 48
  • 49. Классы и методы Методы с переменным числом аргументов в Java Возможность была добавлена в JDK 1.5. Для указания аргумента переменной длины используют три точки (...). Например: static void vaTest(int ... v) { … } Эта синтаксическая конструкция указывает компилятору, что метод vaTest () может вызываться с нулем или более аргументов. В результате v неявно объявляется как массив типа int [ ]. Таким образом, внутри метода vaTest () доступ к v осуществляется с использованием синтаксиса обычного массива. 49
  • 50. Классы и методы Методы с переменным числом аргументов в Java 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 (); // без аргументов } } 50
  • 51. Классы и методы Методы с переменным числом аргументов в Java Вывод: Количество аргументов: 1 10 Количество аргументов: 3 123 Количество аргументов: 0 51
  • 52. Классы и методы Методы с переменным числом аргументов в Java Вместе с параметром переменной длины массив может содержать обычные параметры. Однако параметр переменной длины должен быть последним параметром, объявленным методом. Например: 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) // ошибка! 52
  • 53. Пакеты Понятие пакета Java обеспечивает специальный механизм для разделения пространства имен классов на именованные области. Этот механизм называется «пакеты» (packages). Пакет – это контейнер для классов, в пределах которого должна сохраняться уникальность имен классов. Общая форма определения пакета: package <pkg_name>; 53
  • 54. Пакеты Иерархия пакетов Иерархия пакетов: package pkg1[.pkg2[.pkg3]]; Чтобы хранить пакеты, Java использует каталоги файловой системы. Classфайлы для всех классов, принадлежащих к одному пакету, должны быть сохранены в каталоге, название которого совпадает с именем пакета (регистр важен). package java.awt.image; javaawtimage Размещением корня любой иерархии пакетов в файловой системе управляет специальная переменная окружения CLASSPATH. 54
  • 55. Пакеты Импорт пакетов Полное имя класса включает всю иерархию пакетов. Импорт класса или пакета: import pkg1[.pkg2].(classname|*); 1. Импортирование класса никак не влияет на уровень доступа к его элементам !!! 2. В любую Java-программу автоматически импортируется пакет java.lang.* !!! 55
  • 56. Пакеты Уровни доступа с учетом пакетов package p1; package p2; public class A { public class D extends A { public int pub; } protected prot; public class E { int def; } private int priv; } public class B extends A { } public class C { } 56
  • 57. Пакеты Уровни доступа с учетом пакетов A B C D E public + + + + + protecte d + + + + - <default> + + + - - private + - - - - 57
  • 58. Пакеты Уровни доступа с учетом пакетов 1. Доступ на уровне класса: - public - класс виден везде - <default> - класс виден в пределах своего пакета 2. Доступ на уровне членов класса: Модификатор Внутри В том же класса пакете Подкласс в другом пакете Произвольный класс в другом пакете public + + + + protected + + + - <default> + + - - private + - - 58
  • 59. Структура Java-программы - В первой строке файла может быть 1 необязательный оператор package - В следующих строках может быть 1 или несколько необязательных операторов import - Далее идут описания классов и интерфейсов Среди классов, описанных в одном файле, только один может быть объявлен с модификатором public. 59