Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 39

Автор Π‘Ρ€ΡŽΡ ЭккСль

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ использовались конструкторы ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ конструкторы Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π£ компилятора Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ‚Π°ΠΊΠΈΡ… конструкторов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ вопросов ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚. Если класс Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ конструктора ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ Π²Π°ΠΌ понадобится Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ конструктор Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, этот Π²Ρ‹Π·ΠΎΠ² придСтся ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ явно, с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова super ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

//: reusing/Chess.java

// НаслСдованиС, конструкторы ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

import static net.mindview.util.Print.*;

class Game {

Game(int i) {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Game"),

}

}

class BoardGame extends Game { BoardGame(int i) { super(i);

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ BoardGame");

}

}

public class Chess extends BoardGame { Chess О {

super(ll);

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Chess");

}

public static void main(String[] args) { Chess x = new ChessO:

}

} /* Output-ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Game ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ BoardGame ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Chess *///:-

Если Π½Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ конструктор Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π² BoardGame(), Ρ‚ΠΎ компилятор «поТалуСтся» Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ конструктор Π² Ρ„ΠΎΡ€ΠΌΠ΅ Game(). Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ Π²Ρ‹Π·ΠΎΠ² конструктора Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π² конструкторС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. (Если Π²Ρ‹ Π²Π΄Ρ€ΡƒΠ³ Π·Π°Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΠ± этом, компилятор Π²Π°ΠΌ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚.)

Π”Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π²ΠΈΠ΄ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Π² Java Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, называСтся Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Он Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ наслСдованиСм ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ: экзСмпляр ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создаваСмый класс (ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ), Π½ΠΎ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ встроСнного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° становятся доступными Π² Π½ΠΎΠ²ΠΎΠΌ классС (ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ наслСдовании). НапримСр, класс SpaceShipControls ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ управлСния космичСским ΠΊΠΎΡ€Π°Π±Π»Π΅ΠΌ:

//. reusing/SpaceShipControls.java

public class SpaceShipControls { void up(int velocity) {} void down(int velocity) {} void left(int velocity) {} void right(int velocity) {} void forward(int velocity) {} void back(int velocity) {} void turboBoostO {} } ///-

Для построСния космичСского корабля ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ наслСдованиСм:

// reusing/SpaceShip java

public class SpaceShip extends S^ceShipControls { private String name.

public SpaceShip(String name) { this.name = name, }

public String toStringO { return name. }__

public static void main(String[] args) {

SpaceShip protector = new SpaceShipC'NSEA Protector"), protector forward(lOO).

}

} /// ~

Однако космичСский ΠΊΠΎΡ€Π°Π±Π»ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ частный случай своСго ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ модуля β€” нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π²ΠΏΠ΅Ρ€Π΅Π΄ (forward()). Π’ΠΎΡ‡Π½Π΅Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ SpaceShip содСрТит SpaceShipControls, ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ послСднСго ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ классом SpaceShip. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ дСлСгирования:

// reusing/SpaceShipDelegation java

public class SpaceShipDelegation { private String name, private SpaceShipControls controls =

new SpaceShipControlsO: public SpaceShipDelegation(String name) {

this name = name. }

// Π”Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: public void back(int velocity) { controls.back(velocity);

}

public void down(int velocity) { controls.down(velocity);

}

public void forward(int velocity) { controls forward(velocity).

}

public void leftCint velocity) { controls left(velocity).

}

public void rightOnt velocity) { controls right(velocity);

}

public void turboBoostO {

controls.turboBoostO.

}

public void up(int velocity) { controls.up(velocity):

}

public static void main(String[] args) { SpaceShipDelegation protector =

new SpaceShipDelegationC'NSEA Protector"); ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

protector.forwarcK 100);

}

} ///:-

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΡƒΡŽΡ‚ΡΡ встроСнному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ controls, Π° интСрфСйс остаСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ наслСдовании. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ происходящим, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ нСбольшим подмноТСством ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² встроСнного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π₯отя Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ поддСрТиваСтся языком Java, Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° присутствуСт Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… срСдах Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. НапримСр, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Ρ‹Π» автоматичСски сгСнСрирован Π² JetBrains Idea IDE.

Π‘ΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ наслСдования

ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ ΠΎΡ‡Π΅Π½ΡŒ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСстС с наслСдованиСм. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт процСсс создания Π±ΠΎΠ»Π΅Π΅ слоТного класса с объСдинСниСм ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ наслСдования, с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² конструкторС:

II: reusing/PlaceSetting.java 11 Π‘ΠΎΠ²ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ наслСдования, import static net.mindview.util.Print.*;

class Plate {

'PlateCint i) {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Plate");

}

}

class DinnerPlate*extends Plate { DinnerPlate(int i) { super(i),

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ DinnerPlate");

class Utensil {

Utensil(int i) {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Utensil");

}

}

class Spoon extends Utensil { Spoon(int i) {

super(i);

print'CKoHCTpyKTop Spoon");

class Fork extends Utensil { Fork(int i) {

super(i);

System.out.println("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Fork");

}

class Knife extends Utensil { Knife(int i) {

super(i):

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Knife");

class Custom {

Custom(int i) {

print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Custom");

public class'PIaceSetting extends Custom { private Spoon sp; private Fork frk; private Knife kn; private DinnerPlate pl; public PIaceSetting(int i) { super(i + 1); sp = new Spoon(i + 2); frk = new Fork(i + 3); kn = new Knifed + 4); pl = new DinnerPlated + 5); pri nt("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ PlaceSetti ng"):

}

public static void main(String[] args) {

. PlaceSetting x = new PlaceSetting(9);

}

} /* Output: ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Custom ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Utensil ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Spoon ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Utensil ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Fork ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Utensil ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Knife ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Plate ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ DinnerPlate конструктор PlaceSetting *///:-

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ компилятор заставляСт вас ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Π΄Π΅Π»Π°Π»ΠΈ это прямо Π² Π½Π°Ρ‡Π°Π»Π΅ конструктора, ΠΎΠ½ Π½Π΅ слСдит Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ встроСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сами ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± этом.

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ

Π’ Java отсутствуСт понятиС дСструктора ΠΈΠ· Π‘++ β€” ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ Java программисты просто Β«Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚Β» ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, Π½Π΅ уничтоТая ΠΈΡ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ очистки памяти Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Ρ‹ Π½Π° сборщика мусора.

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях эта модСль Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° класс выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΡ… дСйствий. Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 5, Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ сборщик мусора ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π»ΠΈ это Π²ΠΎΠΎΠ±Ρ‰Π΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π² классС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ дСйствия ΠΏΠΎ очисткС, Π²Π°ΠΌ придСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ для этого особый ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ программисты-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π·Π½Π°Π»ΠΈ ΠΎ нСобходимости Π²Ρ‹Π·ΠΎΠ²Π° этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ описано Π² Π³Π»Π°Π²Π΅ 10, Π²Π°ΠΌ придСтся ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ дСйствия Π² сСкции finally.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ систСмы Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ проСктирования, которая рисуСт Π½Π° экранС изобраТСния:

//: reusing/CADSystem.java // ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ package reusing:

import static net.mindview util.Print.*;

class Shape {

Shape(int i) { print("ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape"); } void disposed { print("Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape"); }

'}

class Circle extends Shape { Circle(int i) {

super(i),

print("РисуСм ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Circle");

}

void disposeO {

print("Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Circle"); super. disposeO;

}

}

class Triangle extends Shape { Triangle(int i) { super(i);

print("РисуСм Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Triangle");

}

void disposeO {

print("Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Triangle"); super.disposeO;

}

}

class Line extends Shape { private int start, end; Line(int start, int end) { super(start); this.start = start; this.end = end;

print("РисуСм линию Line: " + start + ", " + end);

}

void disposeO {

print("Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ линию Line: " + start + ", " + end). super.disposeO;

}

public class CADSystem extends Shape { private Circle c; private Triangle t; private Line[] lines = new Line[3], public CADSystem(int i) { super(i + 1).

for(int j = 0, j < lines length; j++) lines[j] = new Line(j. j*j), с = new Circled), t = new Triangle(l), print("ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктор").

}

void disposed {

print("CADSystem.dispose()"); // Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ осущСствляСтся Π² порядкС, // ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядку ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ t disposed; с.disposed;

for(int i = lines length - 1; i >=0; i--)

lines[i] .disposed; super disposed;

}

public static void main(String[] args) { CADSystem x = new CADSystem(47), try {

// Код ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. } finally {

Ρ… disposed,

}

}

} /* Output: ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape РисуСм линию Line- 0, 0 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape РисуСм линию Line- 1. 1 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape РисуСм линию Line- 2, 4 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape РисуСм ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Circle ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Shape РисуСм Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Triangle ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ конструктор CADSystem. disposed Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Triangle Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Circle Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ линию Line: 2, 4 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ линию Line: 1, 1 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ линию Line 0. 0 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Shape *///.-

ВсС Π² этой систСмС являСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ класса Shape (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, нСявно наслСдуСт ΠΎΡ‚ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ класса Object). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс пСрСопрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ dispose() класса Shape, вызывая ΠΏΡ€ΠΈ этом Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова super. ВсС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы, унаслСдованныС ΠΎΡ‚ Shape β€” Circle, Triangle ΠΈ Line, ΠΈΠΌΠ΅ΡŽΡ‚ конструкторы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто выводят сообщСниС, хотя Π²ΠΎ врСмя ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° любой ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ очистки. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС Π΅ΡΡ‚ΡŒ свой собствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ dispose(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ восстанавливаСт рСсурсы, Π½Π΅ связанныС с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΊ исходному ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π΄ΠΎ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main() Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слова, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСны Π² Π³Π»Π°Π²Π΅ 10: try ΠΈ finally. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово try ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° Π½ΠΈΠΌ Π±Π»ΠΎΠΊ (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками) являСтся Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ сСкциСй. Код Π² сСкции finally выполняСтся всСгда, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡˆΠ»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° try. (ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· Π±Π»ΠΎΠΊΠ° try Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ способами.) Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сСкция finally ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: Β«Π§Ρ‚ΠΎ Π±Ρ‹ Π½ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Π² ΠΊΠΎΠ½Ρ†Π΅ всСгда Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ x.dispose()Β».

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° порядок Π²Ρ‹Π·ΠΎΠ²Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-Ρ‡Π»Π΅Π½ΠΎΠ² Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½ΠΈ зависят Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π’ основном Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ компилятор Π‘++ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ дСструкторов: сначала провСсти Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ дСйствия для вашСго класса Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ порядку ΠΈΡ… создания. (ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для этого трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ элСмСнты Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.) Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.