Классы и объекты Теория и технология программирования

81
1 Основы программирования на языке Java Классы и объекты Теория и технология программирования

Upload: khangminh22

Post on 11-Mar-2023

1 views

Category:

Documents


0 download

TRANSCRIPT

1

Основы программирования

на языке Java

Классы и объекты

Теория и технология программирования

2

Программа

• Классы и объекты в Java: основные сведения

• Управление памятью для ссылочных типов

• Реализация наследования в Java

• Пакеты как механизм реализации пространств имен в

Java

• Абстрактные классы и интерфейсы

• Настраиваемые типы

• Обработка исключений

• Многопоточное программирование

3

Программа

• Классы и объекты в Java: основные сведения

• Управление памятью для ссылочных типов

• Реализация наследования в Java

• Пакеты как механизм реализации пространств имен в Java

• Абстрактные классы и интерфейсы

• Настраиваемые типы

• Обработка исключений

• Многопоточное программирование

4

Классы и объекты в Java: основные сведения

• Главный класс приложения

package dragons;

public class Main {

public static void main(String[] args) {

System.out.println("Hello World of Dragons");

}

}

Demo: dragons

5

Классы и объекты в Java: основные сведения

• Переменные и методы класса

Demo: dragons

6

Классы и объекты в Java: основные сведения

• Переменные и методы класса

package animals;

public class Reptile {

private int length;

public Reptile( int length ) {

this.length = length;

}

public void eat( Bird bird ) {

bird.isEaten = true;

length++;

}

public int size() {

return length;

}

}

7

Классы и объекты в Java: основные сведения

• Наследование: классы, суперклассы,

подклассы

Demo: dragons

8

Классы и объекты в Java: основные сведения

• Наследование: классы, суперклассы,

подклассы

package dragons;

import animals.Reptile;

public class Dragon extends Reptile {

private String magic = "fire";

public Dragon() {

super(1000);

}

String getMagic(){

return magic;

}

}

9

Классы и объекты в Java: основные сведения

• Спецификаторы доступа

> Обеспечивают реализацию инкапсуляции в Java

> Изменяя спецификаторы, можно контролировать область

видимости:

> полей (переменных, констант – членов класса)

> методов класса (в том числе и конструкторов)

> самих классов (как элементов пакетов)

10

Классы и объекты в Java: основные сведения

• Спецификаторы доступа для полей

private Поле не может быть использовано нигде кроме данного класса или егоэкземпляра.

protected Поле не может быть использовано нигде кроме данного класса и всех его наследников.

public Поле доступно отовсюду.

Нет спецификатора Поле доступно только из текущего пакета.

11

Классы и объекты в Java: основные сведения

• Спецификаторы полей, не связанные с правами доступа

volatile Значение этого поля будет обновляться каждый раз при обращении к нему. Обычно используется при параллельном исполнении программы.

static Поле принадлежит структуре класса. Одно значение присуще всем экземплярам..

final Поле не может быть изменено.

transient Поле не участвует в процессе сериализации (сохранение состояния объекта во внешнюю память) по умолчанию.

12

Классы и объекты в Java: основные сведения

• Спецификаторы доступа для методов

private Метод не может быть использован ниоткуда кроме данного класса (его объекта).

protected Метод не может быть использован ниоткуда кроме данного класса (его объекта) и всех его наследников (их объектов).

public Метод доступен из любого пакета (публичный API).

Нет спецификатора Метод доступен только из данного пакета.

13

Классы и объекты в Java: основные сведения

• Спецификаторы для методов, не связанные с правами

доступа

final Метод не может быть перезаписан (overriden) в наследнике.

static Метод принадлежит классу (то есть не получает ссылку на экземпляр при вызове)

abstract Метод не имеет реализации.

synchronized Запрещено одновременное выполнение метода на разных потоках.

native Метод имеет реализацию на языке С или С++.

14

Классы и объекты в Java: основные сведения

• Спецификаторы доступа для классов

Нет спецификатора Класс доступен только в текущем пакете.

public Класс доступен из любого пакета (публичный API).

final Класс не может расширяться с помощью наследования.

abstract Класс является абстрактным, нельзя создать объект этого класса.

static Допустимо только для вложенных классов. Внутренний класс является статическим членом внешнего класса.

15

Классы и объекты в Java: основные сведения

• Конструктор класса

> Имя конструктора совпадает с именем класса

> Создает экземпляр класса

> Обеспечивает правильную гарантированную инициализацию объекта класса

> Не имеет возвращаемого значения

public class Reptile {

private int length;

public Reptile( int length ) {

this.length = length;

}

Demo: dragons

16

Классы и объекты в Java: основные сведения

• Конструктор класса

> Один класс может иметь несколько конструкторов

public class Reptile {

private int length;

public Reptile() {

length = 1;

}

public Reptile( int length ) {

this.length = length;

}

Demo: dragons

17

Классы и объекты в Java: основные сведения

• Конструктор класса

> Если класс не имеет не одного конструктора, то

конструктор по умолчанию генерируется автоматически

public class Bird {

public boolean isEaten = false;

}

Bird bird = new Bird();

Demo: dragons

18

Классы и объекты в Java: основные сведения

• Назначение ссылочных переменных объекта

> При присваивании или инициализации ссылочной

переменной копируется ссылка (а не объект)

Bird bird1 = new Bird();

Bird bird2 = bird1;bird1

bird2

19

Классы и объекты в Java: основные сведения

• Конструктор копирования

> Для создания правильной копии можно воспользоваться

конструктором копирования

Bird bird1 = new Bird();

Bird bird2 = new Bird( bird1 );

public class Bird {

public boolean isEaten = false;

Bird( Bird arg ) {

isEaten = arg.isEaten;

}

}

20

Классы и объекты в Java: основные сведения

• Статические инициализаторы

> В классе можно определить специальный блок,

выполняющийся при инициализации класса

> Статический блок выполняется независимо от того, будут ли

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

> Статический блок может работать со статическими данными или

методами класса

21

Классы и объекты в Java: основные сведения

• Статические инициализаторыclass Some {

static int a = 100;

static int b;

static int init() {

return (int) (Math.random()*10);

}

static {

System.out.println("Static fields are initialized");

b = a*init();

}

}

Demo: StaticBlockSample

22

Классы и объекты в Java: основные сведения

• Методы класса

> Аргументы встроенных типов всегда передаются по

значению

> Объекты (аргументы ссылочных типов) всегда передаются

по ссылке

> НО САМА ССЫЛКА всегда передается ПО ЗНАЧЕНИЮ

> То есть изменить значение ссылки НЕЛЬЗЯ!

Demo: MethodsSample

23

Классы и объекты в Java: основные сведения

• Методы класса

> Тип возвращаемого значения метода может быть любым

> Фактически это означает, что метод может возвращает значение

встроенного типа или ссылку на объект (например, ссылку на

массив!)

Demo: MethodsSample

public int[] returnArray() {

int[] vals = new int[5];

for( int i=0; i<vals.length; i++ ) {

vals[i]= (int) (Math.random()*10);

}

return vals;

}

24

Классы и объекты в Java: основные сведения

• Методы класса

> Методы могут быть статическими

> Статические методы могут обращаться только к статическим

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

> Методы допускают перегрузку имен (name overloading)

> Перегрузка имен является одним из способов реализации

концепции полиморфизма: один интерфейс – множество методов

Demo: StaticAndOverloadSample

25

Классы и объекты в Java: основные сведения

• Методы класса

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

(variable-arity)

> Параметры неявно упаковываются в массив

> Методы с переменным числом параметров могут входить в набор

перегруженных методов, если не возникает неоднозначности

Demo: VariableArity1Sample

Demo: VariableArity2Sample

26

Классы и объекты в Java: основные сведения

• Методы класса

> Методы с переменным числом параметров: ограничения

> Параметр, содержащий переменное число аргументов, должен

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

> Допускается только один такой параметр

27

Классы и объекты в Java: основные сведения

• Служебное слово this

> Для разрешения конфликта имен между параметрами

метода и членами класса

public class Complex {

public double real;

public double image;

public Complex(double real, double image) {

this.real = real;

this.image = image;

}

//...

28

Классы и объекты в Java: основные сведения

• Служебное слово this

> Для вызова другого конструктора класса

public class Complex {

//...

public Complex(double real, double image) {

this.real = real;

this.image = image;

}

public Complex() {

this( 0, 0 );

}

29

Классы и объекты в Java: основные сведения

• Служебное слово this

> Для формирования возвращаемого значения – ссылки на

объект

public class Complex {

//...

public Complex add( Complex arg ) {

real += arg.real;

image += arg.image;

return this;

}

//...

30

Классы и объекты в Java: основные сведения

• Служебное слово this

> Недоступно в статических методах!

31

• Два вида констант размерных типов

> Константы времени компиляции, неизменяемые в

принципе

> Значения, инициализированные во время выполнения,

которые мы не намерены изменять

• “Константные” ссылки на объект

Классы и объекты в Java: основные сведения

32

public class CompileTimeFinalData {

final int CONST_ONE = 10;

static final int CONST_TWO = 100;

public static final int CONST_THREE = 200;

// public - usable outside the package

// static – there’s only one

// final - it’s constant

}

Классы и объекты в Java: основные сведения

• Константы времени компиляции

CompileTimeFinalData.CONST_THREE

33

class RunTimeFinalData {

final int rand1 = (int)( Math.random()*20 );

static final int rand2 =

(int)( Math.random()*20 );

public void print( String id ) {

System.out.println(

id + ": " + "rand1 = " + rand1 +

", rand2 = " + rand2 );

}

}

Классы и объекты в Java: основные сведения

Demo: RunTimeFinalData

• Константы времени выполнения

34

Классы и объекты в Java: основные сведения

Demo: RunTimeFinalData

• Константы времени выполненияpublic class Main {

public static void main( String[] args ) {

RunTimeFinalData rtfd1 =

new RunTimeFinalData();

rtfd1.print( "rtfd1“ );

System.out.println( “New RunTimeFinalData” );

RunTimeFinalData rtfd2 =

new RunTimeFinalData();

rtfd1.print( "rtfd1“ );

rtfd2.print( "rtfd2“ );

} //main

} // class

35

class BlankFinal {

final int j; // Blank final: must be initialized

// in a constructor

BlankFinal( int x = 0 ) {

j = x; // Initializes blank final

}

public static void main(String[] args) {

BlankFinal bf = new BlankFinal();

}

}

Классы и объекты в Java: основные сведения

• Константы, инициализируемые в конструкторе

36

Класс Object

• Все классы неявно являются подклассами Object

> Переопределяемые методы класса Object

>public boolean equals(Object o);

>public int hashCode();

>public String toString();

>public Class getClass();

>protected Object clone();

>protected void finalize();

>+ методы синхронизации потоков

37

Класс Object

• Сравнение объектов

> Операции == и != работают со ссылками

class Test1{

int val;

Test1( int val ) {

this.val = val;

}

}

Demo: ObjectOverrideTest

38

Класс Object

• Сравнение объектов

> Операции == и != работают со ссылками

{

Test1 ref1 = new Test1( 27 );

Test1 ref2 = new Test1( 27 );

System.err.println( "ref1==ref2 is " + (ref1==ref2) );

System.err.println( "ref1!=ref2 is " + (ref1!=ref2) );

}

Demo: ObjectOverrideTest

39

Класс Object

• Сравнение объектов

> Операции == и != работают со ссылками

{

Test1 ref1 = new Test1( 27 );

Test1 ref2 = ref1;

System.err.println( "ref1==ref2 is " + (ref1==ref2) );

System.err.println( "ref1!=ref2 is " + (ref1!=ref2) );

}

Demo: ObjectOverrideTest

40

Класс Object

• Сравнение объектов

> Использование метода equals из класса Object

{

Test1 ref1 = new Test1( 27 );

Test1 ref2 = new Test1( 27 );

Test1 ref3 = ref1;

System.err.println( ref1.equals(ref2) );

System.err.println( ref1.equals(ref3) );

}

Demo: ObjectOverrideTest

41

Класс Object

• Сравнение объектов

> Переопределение метода equals

class Test2{

int val;

Test2( int val ) { this.val = val; }

@Override

public boolean equals( Object arg ) {

if( val == ((Test2)arg).val ) return true;

return false;

}

}

Demo: ObjectOverrideTest

42

Класс Object

• Сравнение объектов

> Использование переопределенного метода equals

{

Test2 ref1 = new Test2( 27 );

Test2 ref2 = new Test2( 27 );

Test2 ref3 = ref1;

System.err.println( ref1.equals(ref2) );

System.err.println( ref1.equals(ref3) );

}

Demo: ObjectOverrideTest

43

Класс Object

• Создание копии объекта

> Переопределение метода clone

class Test2{

int val;

Test2( int val ) { this.val = val; }

@Override

public Test2 clone() {

return new Test2( this.val );

}

}

Demo: ObjectOverrideTest

44

Класс Object

• Сравнение объектов

> Использование переопределенного метода clone

{

Test2 ref1 = new Test2( 27 );

Test2 ref2 =ref1.clone();

System.err.println( ref1==ref2 );

System.err.println( ref1.equals(ref2) );

}

Demo: ObjectOverrideTest

45

Класс Object

• Создание копии объекта

> Переопределение метода toString

class Test2{

int val;

Test2( int val ) { this.val = val; }

@Override

public String toString() {

return Integer.toString( val );

}

}

Demo: ObjectOverrideTest

46

Класс Object

• Формирование хэш-кода объекта

> хэш-коды РАВНЫХ объектов (с точки зрения equals)

ДОЛЖНЫ быть равны

> хэш-коды НЕРАВНЫХ объектов ПО ВОЗМОЖНОСТИ

должны различаться

> по умолчанию хэш-код равен адресу объекта

47

Класс Object

• toString – формирование строкового представления

объекта; по умолчанию формируется из адреса

объекта

• getClass – возвращает объект типа Class, имеющий

доступ к спискам полей и методов данного типа

(Reflection, рефлексия, интроспекция – отслеживание

собственной структуры)

48

Класс Object

• clone() – возвращает копию данного объекта

• finalize() – вызывается сборщиком мусора перед

разрушением объекта

49

Класс Object: что дает общий суперкласс?

• Мы получаем возможность создавать массивы (контейнеры) из объектов произвольного типа (на самом деле, контейнеры как раз хранят внутри себя ссылки типа Object)

• Мы получаем возможность сравнить два объекта любого типа на равенство

• Мы получаем возможность получить строковое представление любого объекта

• …

• То есть, класс Object содержит общие свойства всех объектов Java

50

Классы и объекты в Java: основные сведения

• Вложенные, внутренние и локальные классы

> Вложенный (nested) класс –класс, определенный внутри

другого класса

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

> Внутренний (inner) класс – нестатический класс, определенный

внутри другого класса. Имеет доступ к переменным

охватывающего класса

> Локальный (local) класс – класс, определенный внутри

метода, блока или выражения. Доступен только в этом

методе (блоке, выражении)

51

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

на примере класса Integerpublic final class Integer {

public static final int MIN_VALUE=0x80000000;

public static final int MAX_VALUE=0x7fffffff;

public static int parseInt(String s) throws NumberFormatException { … }

private final int value;

public Integer(int value) {

this.value = value;

}

public Integer(String s) throws NumberFormatException {

this.value = parseInt(s);

}

public int intValue() {

return value;

}

}

52

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

на примере класса Integerpublic final class Integer {

@Override

public String toString() {

return String.valueOf(value);

}

@Override

public int hashCode() {

return value;

}

@Override

public boolean equals(Object obj) {

if (obj instanceof Integer)

return value==((Integer)obj).intValue();

return false;

}

}

53

Проектирование своего класса –

интервал• Задача – спроектировать класс

"интервал целых значений" [min:max]

• Необходимые методы:

> объединение и пересечений

> сложение и вычитание:если a=[1,2] и b=[3,4], то a+b=[4,6], b-a=[1,3]

> инвертирование:если a=[-2,-1], то –a=[1,2]

> сравнение на равенство:интервалы равны, если их границы равны

Demo: Intervals

54

Проектирование своего класса –

интервал

• Дополнительные методы:

> конструкторы [0:0], [val:val], [min:max]

> преобразование в строку

> хэш-код

55

Проектирование своего класса –

поля класса/**

* Интервал целых значений

* @author Mikhail Glukhikh

*/

public class IntegerInterval implements Cloneable {

/** Нижняя граница */

private final int min;

/** Верхняя граница */

private final int max;

/**

* Конструктор нуля

*/

public IntegerInterval() {

this(0, 0);

}

}

56

Проектирование своего класса –

основной конструктор/**

* Конструктор полноценного интервала

* @param min нижняя граница

* @param max верхняя граница

* @throws IllegalArgumentException * если нижняя граница больше верхней

*/

public IntegerInterval(int min, int max) throws IllegalArgumentException {

if (min > max) throw new IllegalArgumentException(

"Нижняя граница " + min + " больше верхней " + max);

this.min = min;

this.max = max;

}

57

Проектирование своего класса –

клонирование, границы/**

* Клонирование

* @return глубокая копия интервала

*/

@Override

public IntegerInterval clone() throws CloneNotSupportedException {

return (IntegerInterval)super.clone();

}

/**

* Получить нижнюю границу

* @return нижняя граница

*/

public int getMin() {

return min;

}

58

Проектирование своего класса –

объединение интервалов/**

* Объединиться с интервалом

* @param variant второй интервал

* @return результат объединения

*/

public IntegerInterval disj(IntegerInterval variant) {

final int min1 = this.getMin();

final int min2 = variant.getMin();

final int max1 = this.getMin();

final int max2 = variant.getMax();

return new IntegerInterval(min1<min2?min1:min2, max1>max2?max1:max2);

}

59

Проектирование своего класса –

пересечение интервалов/**

* Пересечься с интервалом

* @param variant второй интервал

* @return результат пересечения

* @throws IllegalArgumentException * если интервалы не пересекаются */

public IntegerInterval conj(IntegerInterval variant) throws IllegalArgumentException {

final int min1 = this.getMin(), min2 = variant.getMin();

final int max1 = this.getMax(), max2 = variant.getMax();

final int resMin = min1>min2?min1:min2;

final int resMax = max1<max2?max1:max2;

if (resMin > resMax) throw new IllegalArgumentException(

"Интервалы " + this + " и " + variant + " не пересекаются");

return new IntegerInterval(resMin, resMax);

}

60

Проектирование своего класса –

вычитание интервалов

/**

* Операция вычитание

* @param value второй аргумент

* @return результат операции

*/

public IntegerInterval sub(IntegerInterval variant) {

final int rmin = this.getMin() - variant.getMax();

final int rmax = this.getMin() - variant.getMax();

return new IntegerInterval(rmin, rmax);

}

61

Проектирование своего класса –

преобразование в строку/**

* Преобразование в строку

* @return строковое представление в форме a:b

*/

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

sb.append(min);

sb.append(':');

sb.append(max);

return sb.toString();

}

62

Проектирование своего класса –

сравнение на равенство/**

* Сравнение на равенство

* @param obj сравниваемый объект

* @return true, если интервалы равны * (обе границы совпадают)

*/

@Override

public boolean equals(Object obj) {

if (obj==this)

return true;

else if (obj instanceof IntegerInterval) {

final IntegerInterval var = (IntegerInterval)obj;

return this.min == var.min && this.max == var.max;

} else return false;

}

63

Проектирование своего класса –

хэш-код/**

* Хэш-код интервала

* @return хэш-код

*/

@Override

public int hashCode() {

int hash = 5;

hash = 29 * hash + this.min;

hash = 29 * hash + this.max;

return hash;

}

64

Проектирование тестов класса

• Тесты предназначены для проверки правильности функционирования спроектированного класса

• Классическая структура теста – выполняем некоторую операцию, например, [1:2]+[3:4], и сравниваем результат с ожидаемым [4:6]

• Тесты находятся в группе пакетов Test Packages; как правило, тест класса располагается в том же пакете, что и сам класс

65

Тестирующий класс

package intervals;

import org.junit.Test;

import static org.junit.Assert.*;

/**

* Тесты интервала целых значений

* @author Mikhail Glukhikh

*/

public class IntegerIntervalTest {

}

66

Тестирующий класс –

примеры тестов@Test

public void testAdd() {

final IntegerInterval var1 = new IntegerInterval(-6, 4);

final IntegerInterval var2 = new IntegerInterval(2, 5);

final IntegerInterval res = new IntegerInterval(-4, 9);

assertEquals(res, var1.add(var2));

assertEquals(res, var2.add(var1));

}

@Test

public void testSub() {

final IntegerInterval var1 = new IntegerInterval(-6, 4);

final IntegerInterval var2 = new IntegerInterval(2, 5);

final IntegerInterval res = new IntegerInterval(-11, 2);

assertEquals(res, var1.sub(var2));

assertEquals(res, var2.sub(var1));

}

67

Тестирующий класс –

примеры тестов@Test

public void testClone() {

try {

final IntegerInterval var = new IntegerInterval(10, 20);

final IntegerInterval res = var.clone();

assertEquals(var, res);

assertNotSame(var, res);

} catch (CloneNotSupportedException ex) {

fail("Клонирование не поддерживается: " +ex.getMessage());

}

}

68

Тестирующий класс –

примеры тестов@Test

public void testConj2() {

try {

final IntegerInterval var1 = new IntegerInterval(1, 2);

final IntegerInterval var2 = new IntegerInterval(3, 4);

var1.conj(var2);

fail("Должно было произойти исключение");

} catch (IllegalArgumentException ex) {}

}

69

Классы и объекты в Java: основные сведения

• Вложенные классы: пример

Demo: NestedSample

70

Классы и объекты в Java: основные сведения

• Локальные внутренние классы: пример

Demo: LocalnnerSample

71

Классы и объекты в Java: основные сведения

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

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

> применительно к интерфейсам

> применительно к управлению событиями

> в том числе – использование анонимных внутренних

классов

72

Классы и объекты в Java: основные сведения

• Перечислимый тип

> Как это ни странно, до SDK 1.5 тип enum отсутствовал в

Java

> Почему рассматриваем в контексте темы «Классы и

объекты»?

> Перечислимый тип в Java – это класс

> Все перечислимые типы автоматически являются производными от класса java.lang.Enum

73

Классы и объекты в Java: основные сведения

• Перечислимый тип

> Описание перечислимого типа

> Операции над объектами перечислимого типа

> Методы values() и valueOf()

Demo: Enum1Sample

enum Month {

January, February, March,

April, May, June,

July, August, September,

October, November, December

}

74

Классы и объекты в Java: основные сведения

• Перечислимый тип

> Каждая константа в определении перечислимого типа – это

отдельный объект

Demo: Enum2Sample

enum Month {

January(31), February(28), March(31), April(30),

May(31), June(30), July(31), August(31), September(30),

October(31), November(30), December(31);

private int dayLimit;

Month( int days ) { dayLimit = day; }

}

75

Классы и объекты в Java: основные сведения

• Перечислимый тип

– Некоторые методы класса java.lang.Enum

final int compareTo( константа-перечислимого-типа)

Сравнивает порядковые номера двух констант одного перечислимого типа

final Class getDeclaringClass()

Возвращает перечислимый тип, членом которого является вызывающая константа

final String name() Возвращает полностью определенное (unaltered) имя вызывающей константы

final int ordinal() Возвращает порядковый номер константы в списке констант

Demo: Enum3Sample

76

Программа

• Классы и объекты в Java: основные сведения

• Управление памятью для ссылочных типов

• Реализация наследования в Java

• Пакеты как механизм реализации пространств имен в Java

• Абстрактные классы и интерфейсы

• Настраиваемые типы

• Обработка исключений

• Многопоточное программирование

77

Управление памятью для ссылочных типов

• Управление объектами классов в Java

> Все объектные переменные – ссылки на объекты в динамической памяти

> Объект удаляется автоматически в процессе сборки «мусора» (garbage collection)

{

Bird bird = new Bird();

// Удалять объект не нужно, но можно осуществить

// завершение работы с объектом (object finalization)

}

78

Управление памятью для ссылочных типов

• Сборка «мусора»: опорные точки

> Сборка «мусора» - автоматическое удаление объекта из

памяти, если больше никто не ссылается на этот объект

> Объект удаляется тогда, когда это «удобно»

исполнительной системе

> Объект НЕ ОБЯЗАТЕЛЬНО будет удален

> Сборка «мусора» обеспечивает только отсутствие утечек

памяти

79

Управление памятью для ссылочных типов

• Сборка «мусора»: завершение работы с объектом

> Если перед удалением объекта необходимы какие-либо

завершающие действия, использует специальный метод-

завершитель (finalize)

protected void finalize() {

// TO DO:

// Здесь определяются действия, выполняемые

непосредственно

// перед удалением объекта

//...

}

80

Управление памятью для ссылочных типов

• Сборка «мусора»: завершение работы с объектом

> Вызов метода-завершителя не гарантирован!

> Если программе требуется освободить какие-либо внешние

ресурсы, это нужно делать в другом методе, а не

полагаться на finalize

> Метод finalize НЕ ЯВЛЯЕТСЯ эквивалентом деструктора

C++!

• Пример: как работает GC Demo: GCMonitor

81

Q&A