3. java lecture classes

59
1 Классы и методы Описание класса <модификатор> class <ИмяКласса> {[модификатор] <тип> <переменная_экземпляра1>; [модификатор] <тип> <переменная_экземпляраN>; [модификатор] <тип> <метод_класса1>(<список форм. парам.) { // тело метода; } [модификатор] <тип> <метод_классаМ>(<список форм.парам.>) { // тело метода; } }

Upload: meraschool

Post on 15-Jun-2015

141 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 3. java lecture classes

1

Классы и методы

Описание класса

<модификатор> class <ИмяКласса>

{[модификатор] <тип> <переменная_экземпляра1>;

[модификатор] <тип> <переменная_экземпляраN>;

[модификатор] <тип> <метод_класса1>(<список форм. парам.)

{ // тело метода; }

[модификатор] <тип> <метод_классаМ>(<список форм.парам.>)

{ // тело метода; }

}

Page 2: 3. java lecture classes

2

Классы и методы

Описание классаclass Point

{int x, y;

Point ()

{x=0; y=0;

}

Point (int x1,int y1)

{x=x1; y=y1;

}

int getX() {return x;}

int getY() {return y;}

}

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

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

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

members)

Page 3: 3. java lecture classes

3

Классы и методы

Создание ссылочных переменных

и объектов класса

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

p1 = new Point(); создан объект

Point p3 = p1; создана ссылочная переменная

указывающая на p1

Point p2 = new Point(); «короткая форма»

создания объекта

p1

p3

объект

cсылка на p1

Page 4: 3. java lecture classes

4

Классы и методыСоздание ссылочных переменных

и объектов класса

Point p1;

{ p1 = new Point(5,10);

p1 = null;

}

System.out.println(p1.x + "" + p1.y);

NullPointerException

{Point p1 = new Point(5,10);

}

System.out.println(p1.x + "" + p1.y);Cannot find variable p1

Point p2;

{Point p1 = new Point(5,10);

p2 = p1;

p1 = null;

}

System.out.println(p2.x + “, “ + p2.y);5, 10

Page 5: 3. java lecture classes

5

Классы и методы

Перегрузка (overloading) методов

[модификатор] <тип> <имя_метода> (<список форм. парам.)

сигнатура метода

Перегрузка – создание 2 и более методов с одинаковыми

именами но разными сигнатурами

Page 6: 3. java lecture classes

6

Классы и методы

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);

}

}

Перегрузка (overloading) методов

Page 7: 3. java lecture classes

7

Классы и методы

Модификатор static

Статические переменные

Объявление: static <type> <name>

Статические переменные:

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

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

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

• допускают обращение до создания объектов класса

Обращение: <classname>.<varname>

Page 8: 3. java lecture classes

8

Классы и методы

Модификатор static

Статические методы

Обращение: <classname>.<metodname>()

Статические методы:

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

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

• внутри статических методов нельзя использовать ссылки this и super

Объявление: static <type> <name> (<parameters>)

Page 9: 3. java lecture classes

9

Классы и методы

Модификатор static

Статические блоки кода

Объявление:

static

{

}

Статический блок кода выполняется один раз при

первоначальной загрузке класса

Page 10: 3. java lecture classes

10

Классы и методы

Использование ключевого слова this

1. Чтобы обойти скрытие переменной экземпляра формальными параметрами

Class Point

{ int x, y;

Point (int x, int y)

{this.x=x;

this.y=y;

}

}

Page 11: 3. java lecture classes

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; }

}

Page 12: 3. java lecture classes

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; }

}

Page 13: 3. java lecture classes

13

Классы и методы

Вложенные классы

Вложенные классы

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

(static nested classes)

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

(inner classes - внутренние классы)

Причины создания вложенных классов:

1.Логическая группировка классов

2.Расширяет возможности инкапсуляции

3.В некоторых случаях повышает читабельность кода

Page 14: 3. java lecture classes

14

Классы и методы

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

Статический вложенный класс является статическим членом класса, в который он вложен. Т.е. он не может напрямую работать с нестатическими переменными и методами внешнего класса.

Page 15: 3. java lecture classes

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;

A a = new A();

a.y = 15;

}

}

}

public class Test {

public static void main(String[ ] args)

{

A.B b = new A.B();

}

}

Page 16: 3. java lecture classes

16

Классы и методы

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

Нестатический вложенный класс является обычным членом внешнего класса, т.е. существует только в составе объекта внешнего класса и имеет прямой доступ к переменным и методам внешнего класса.

Объект вложенного класса может существовать только внутри объекта внешнего класса

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

Page 17: 3. java lecture classes

17

Классы и методы

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

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 = a.new B();

}

}

Page 18: 3. java lecture classes

18

Классы и методы

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

Общая форма объявления класса, наследующего

суперкласс:

class <subclass_name> extends <superclass_name>

{

//тело класса

}

Язык Java не поддерживает множественного

наследования классов!!!

Page 19: 3. java lecture classes

19

Классы и методы

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

class Point3D extends Point

{int z;

Point3D ()

{ z=0; }

Point3D (int x1, int y1, int z1)

{ z=z1; }

}

Page 20: 3. java lecture classes

20

Классы и методы

Порядок вызова конструкторов при наследовании

При создании объекта подкласса всегда вызывается

конструктор его базового класса, у того конструктор

его базового класса и т.д. вплоть до корня иерархии

(класса Object). Причем если не указано явно (с

помощью super) вызывается конструктор без

параметров (созданный явно или по умолчанию). Если

подходящего конструктора нет – выдается ошибка

компиляции.

Page 21: 3. java lecture classes

21

Классы и методы

Ключевое слово super

super (parameters) – вызов должен быть первым

в конструкторе подкласса

Внимание! Это применяется только если надо

вызвать конструктор суперкласса с параметрами!

1. Вызов конструктора непосредственного суперкласса

super.var_name или super.metod_name()

(super не влияет на тип доступа)

2. Доступ к элементу суперкласса, скрытому элементом подкласса

Page 22: 3. java lecture classes

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)

Page 23: 3. java lecture classes

23

Классы и методы

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

super

class Point3D extends Point

{int z;

Point3D ()

{ z=0; }

Point3D (int x1,int y1, int z1)

{ super (x1, y1);

z=z1; }

}

Point3D p3d = new Point3D();

Point() -> Point3D()

Point3D p3d = new Point3D(10, 20, 30);

Point(10, 20) -> Point3D(10,20,30)

Page 24: 3. java lecture classes

24

Классы и методы

Модификаторы доступа

class Parent

{public int v1;

private int v2;

protected int v3;

int v4;

}

class Child

extends Parent

{

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

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

}

class Other

{

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

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

}

Page 25: 3. java lecture classes

25

Классы и методы

Модификаторы доступа

В правильно спроектированном Java-

классе, все экземплярные

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

модификатор private, доступ должен

осуществляться через set/get методы

(«сеттеры/геттеры»)

В Eclipse:

Source -> generate Getters and Setters

Page 26: 3. java lecture classes

26

Классы и методы

Модификаторы доступа

class Point

{int x, y;

Point ()

{x=0; y=0; }

Point (int x1,int y1)

{x=x1; y=y1; }

}

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 int setX(int x) {

this.x = x;}

public int setY(int y) {

this.y = y;}

}

Page 27: 3. java lecture classes

27

Классы и методы

Динамическая

диспетчеризация ссылок

Ссылочной переменной суперкласса может быть

назначена ссылка на любой подкласс, производный

от этого суперкласса. Если ссылочная переменная

суперкласса указывает на объект подкласса, через

эту переменную можно получить доступ только к тем

членам подкласса, которые определяются в

суперклассе.

Page 28: 3. java lecture classes

28

Классы и методы

Динамическая

диспетчеризация ссылок

class Point

{

int x, int y;

}

class Point3D extends Point

{

int z;

}

Point Pobj = new Point();

Point3D Cobj = new Point3D();

Pobj = Cobj;

Pobj.x = 1; //верно! x определена в Point

Pobj.z = 10; //ошибка! z не определена в Point

Page 29: 3. java lecture classes

29

Классы и методы

Динамическая

диспетчеризация методов

Переопределение метода (overriding) – создание в подклассе

метода, совпадающего по сигнатуре с методом суперкласса.

Динамическая диспетчеризация методов – это механизм,позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции.

Page 30: 3. java lecture classes

30

Классы и методы

Динамическая

диспетчеризация методов

class Figure

{double dim1, dim2;

Figure(double a, double b)

{dim1 = a; dim2 = b; }

void square()

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

}

class Rectangle extends Figure

{Rectangle(double a, double b)

{super(a,b); }

void square()

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

}

Page 31: 3. java lecture classes

31

Классы и методы

Динамическая

диспетчеризация методов

class Triangle extends Figure

{Triangle(double a, double b)

{super(a,b); }

void square()

{System.out.println(“Triangle 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(); }

} }

Page 32: 3. java lecture classes

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

Page 33: 3. java lecture classes

33

Классы и методы

Абстрактные методы и классы

Объявление абстрактного метода:

abstract <type> <method_name> (<parameters>);

Если в классе есть хотя бы один абстрактный метод ->

класс должен быть объявлен абстрактным.

abstract class <class_name>

{

}

Любой подкласс абстрактного класса должен или реализовать

все его абстрактные методы или сам должен быть объявлен

абстрактным !

Page 34: 3. java lecture classes

34

Классы и методы

Абстрактные методы и классы

abstract class Figure

{double dim1, dim2;

Figure(double a, double b)

{dim1 = a;

dim2 = b;

}

abstract void square();

}

Page 35: 3. java lecture classes

35

Интерфейсы

[<модификатор>] interface <имя> [extends <список интерфейсов>]

{ <тип> <имя_метода>(<список параметров>);

...

<тип> <имя_константы> = <значение>;

}

1. Интерфейсы допускают множественное наследование

2. Все методы – абстрактные (без модификатора abstract)

3. Все переменные – static и final (без соотв. модификаторов), необходима инициализация

4. Все переменные и методы – public (без модификатора)

Page 36: 3. java lecture classes

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); }

}

Page 37: 3. java lecture classes

37

Интерфейсы

Реализация интерфейсов

Особенности реализации интерфейсов:

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

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

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

Page 38: 3. java lecture classes

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));}

}

Page 39: 3. java lecture classes

39

Интерфейсы

class TestIface

{public static void main(String args[ ])

{Callback с = new Client();

c.callback(42); //верно!

c.getSquare(42); //ошибка! ссылочная переменная интерфейсного типа не может обращаться к собственным методам классов

}

}

Ссылочные переменные интерфейсного типа

Page 40: 3. java lecture classes

40

ИнтерфейсыВзаимоотношения классов и

интерфейсов

C2

C1

C3

C5C4 C7C6

I2

I1

I3

I5I4 I7I6

I8

Классы Интерфейсы

extends

extends

extends

extends

extends

implements

implements

Page 41: 3. java lecture classes

41

Классы и методы

Модификатор final

1. final double pi = 3.14; //неизменяемая локальная переменная

2. final int getX()

{…}

//метод, для которого запрещено переопределение (overriding)

3. final class A

{…}

//класс, для которого запрещено наследование

Page 42: 3. java lecture classes

42

Классы и методы

final-члены классов,

неизменяемые объектыclass A {

final String mName;

public A(String name) {

mName = name;

}

public getName() {

return mName;

}

public setK(String name) {

mName = name;

}

}

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

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

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

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

Page 43: 3. java lecture classes

43

Перечисления в Java: enum

enum Season

{ WINTER, SPRING, SUMMER, AUTUMN }

Season season = Season.SPRING;

if (season == Season.SPRING) {

season = Season.SUMMER;

}

System.out.println(season);

Классы и методы

Page 44: 3. java lecture classes

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

Классы и методы

Page 45: 3. java lecture classes

45

Перечисление – это класс

Собственно наследование за нас автоматически выполняет компилятор Java.

Условимся называть класс, созданный

компилятором для реализации перечисления –

enum-классом,

а возможные значения перечисляемого типа –

элементами enum-a.

Элементы перечисления - экземпляры enum-класса, доступные статически.

Классы и методы

Page 46: 3. java lecture classes

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

Классы и методы

Page 47: 3. java lecture classes

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.

Классы и методы

Page 48: 3. java lecture classes

48

Получение всех элементов перечисления

Иногда необходимо получить список всех элементов enum-класса во время выполнения. Для этих целей в каждом enum-классе компилятор создает метод:

public static EnumClass[ ] values()

Пример использования:

System.out.println(Arrays.toString(Season.values()));

Вывод:

[WINTER, SPRING, SUMMER, AUTUMN]

Обратите внимание, что ни метод valueOf(), ни метод values() не определен в классе java.lang.Enum. Вместо этого они автоматически добавляются компилятором на этапе компиляции enum-класса.

Классы и методы

Page 49: 3. java lecture classes

49

Методы с переменным числом аргументов в Java

Возможность была добавлена в JDK 1.5.

Для указания аргумента переменной длины используют три точки (...). Например:

static void vaTest(int ... v) { … }

Эта синтаксическая конструкция указывает компилятору, что метод vaTest () может вызываться с нулем или более аргументов. В результате v неявно объявляется как массив типа int [ ]. Таким образом, внутри метода vaTest () доступ к v осуществляется с использованием синтаксиса обычного массива.

Классы и методы

Page 50: 3. java lecture classes

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 (); // без аргументов

}

}

Классы и методы

Page 51: 3. java lecture classes

51

Методы с переменным числом аргументов в Java

Вывод:

Количество аргументов: 1

10

Количество аргументов: 3

1 2 3

Количество аргументов: 0

Классы и методы

Page 52: 3. java lecture classes

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) // ошибка!

Классы и методы

Page 53: 3. java lecture classes

53

Пакеты

Java обеспечивает специальный механизм для

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

именованные области. Этот механизм

называется «пакеты» (packages). Пакет – это

контейнер для классов, в пределах которого

должна сохраняться уникальность имен

классов.

Общая форма определения пакета:

package <pkg_name>;

Понятие пакета

Page 54: 3. java lecture classes

54

Пакеты

Чтобы хранить пакеты, Java использует

каталоги файловой системы. Class-

файлы для всех классов, принадлежащих

к одному пакету, должны быть сохранены

в каталоге, название которого

совпадает с именем пакета (регистр важен).

package pkg1[.pkg2[.pkg3]];Иерархия пакетов:

package java.awt.image; java\awt\image

Размещением корня любой иерархии пакетов в файловой

системе управляет специальная переменная окружения

CLASSPATH.

Иерархия пакетов

Page 55: 3. java lecture classes

55

ПакетыИмпорт пакетов

Импорт класса или пакета:

import pkg1[.pkg2].(classname|*);

Полное имя класса включает всю иерархию пакетов.

1. Импортирование класса никак не влияет на

уровень доступа к его элементам !!!

2. В любую Java-программу автоматически

импортируется пакет java.lang.* !!!

Page 56: 3. java lecture classes

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 { }

Page 57: 3. java lecture classes

57

Пакеты

Уровни доступа с учетом пакетов

A B C D E

public + + + + +

protected

+ + + + -

<default> + + + - -

private + - - - -

Page 58: 3. java lecture classes

58

Пакеты

Уровни доступа с учетом пакетов

1. Доступ на уровне класса: - public - класс виден везде

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

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

Модифи-катор

Внутри класса

В том же

пакете

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

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

пакете

public + + + +

protected + + + -

<default> + + - -

private + - - -

Page 59: 3. java lecture classes

59

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

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

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

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

Среди классов, описанных в одном

файле, только один может быть

объявлен с модификатором

public.