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

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

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

j = 1; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ пустой константы Ρ€ = new Poppet(l); // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ пустой Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ ссылки

}

public BlankFinal(int Ρ…) {

j = Ρ…; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ пустой константы Ρ€ = new Poppet(x), // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ пустой Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ ссылки

}

public static void main(String[] args) { new BlankFinal О; new BlankFinal(47),

}

} ///:-

ЗначСния Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Ρ… (final) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, записываСмом Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΠ»ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· конструкторов класса. Π’Π΅ΠΌ самым гарантируСтся инициализация ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ final, ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… использованиСм.

НСизмСнныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

Java позволяСт Π²Π°ΠΌ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, объявляя ΠΈΡ… с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом final Π² спискС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ пСрСдаваСмая ссылка:

II: reusing/FinalArguments.java II ИспользованиС final с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

class Gizmo {

public void spinO {}

}

public class Final Arguments { void with(final Gizmo g) {

III g = new GizmoO; II Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ -- g объявлСно final

}

void without(Gizmo g) {

g = new GizmoO: II Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ -- g Π½Π΅ являСтся final g.spinO;

}

II void f(final int i) { i++, } II НСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. II Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния: int g(final int i) { return i + 1; } public static void main(String[] args) {

Final Arguments bf = new FinalArgumentsO;

bf .without(null): ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ & bf with(niil 1),

}

} ///.-

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ f() ΠΈ g() ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² с ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΎΠΉ final: ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ удастся.

НСизмСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

НСизмСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° β€” Β«Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Β» ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ содСрТаниС. Π­Ρ‚ΠΎ дСлаСтся ΠΏΠΎ сообраТСниям проСктирования, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ измСнится ΠΏΡ€ΠΈ наслСдовании.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΡΡ‡ΠΈΡ‚Π°Π»Π°ΡΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. Π’ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… рСализациях Java объявлСниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом final позволяло компилятору ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²ΠΎ встроСнныС (inline). Когда компилятор Π²ΠΈΠ΄ΠΈΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°ΠΊ final, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ (Π½Π° своС усмотрСниС) ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ стандартный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ вставки ΠΊΠΎΠ΄Π° для провСдСния Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (занСсти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² стСк, ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ‚Π΅Π»Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ находящийся Ρ‚Π°ΠΌ ΠΊΠΎΠ΄, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· стСка ΠΈ Ρ€Π°ΡΠΏΠΎΡ€ΡΠ΄ΠΈΡ‚ΡŒΡΡ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ) ΠΈ вмСсто этого ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° мСсто Π²Ρ‹Π·ΠΎΠ²Π° копию Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, находящСгося Π² Ρ‚Π΅Π»Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² подстановка ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Β«Ρ€Π°Π·Π±ΡƒΡ…Π°Π½ΠΈΡŽΒ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ, скорСС всСго, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… прСимущСств ΠΎΡ‚ использования прямого встраивания Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Π’ послСдних вСрсиях Java Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина выявляСт ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ситуации ΠΈ устраняСт лишниС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ final для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠΆΠ΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ β€” ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ final ΠΈ private

Π›ΡŽΠ±ΠΎΠΉ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ (private) ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² классС косвСнно являСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ (final) ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π΅ Π² силах ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Ρ‚ΠΎ Π½Π΅ смоТСтС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово final ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π½ΠΎ Π΅Π³ΠΎ присутствиС Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ повлияСт.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСдоразумСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ пСрСопрСдСлСния Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ (private) ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΆΠ΅ нСявно ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ final, всС Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ компилятор Π½Π΅ Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…:

//β€’ reusi ng/Fi nalOverri di ngll1usi on.java

// ВсС выглядСт Ρ‚Π°ΠΊ, Π±ΡƒΠ΄Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ (ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΉ) ΠΌΠ΅Ρ‚ΠΎΠ΄

// ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½ΠΎ это Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅.

import static net mindview.util Print.*,

class WithFinals {

// To ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ просто private:

private final void f() { printC'WithFinals f()M), }

// Π’Π°ΠΊΠΆΠ΅ автоматичСски являСтся final

private void g() { printC'WithFinals.g()"), }

class OverridingPrivate extends WithFinals {

private final void f() {

printC'OverridingPrivate fO").

}

private void g() {

printC'OverridingPrivate g()").

}

}

class 0verridingPrivate2 extends OverridingPrivate {

public final void f() {

print("0verridingPrivate2 f()").

}

public void g() {

print("0verridingPrivate2 g()").

}

public class FinalOverridingll1usion {

public static void main(String[] args) {

0verridingPrivate2 op2 = new 0verridingPrivate2();

op2 f();

op2.g();

// МоТно провСсти восходящСС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅-

OverridingPrivate op = op2;

// Но ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€ΠΈ этом Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

//! op f().

//! op.g().

// И Ρ‚ΠΎ ΠΆΠ΅ самоС здСсь-WithFinals wf = ΠΎΡ€2. //! wf.fO, //! wf g();

}

} /* Output: 0verridingPrivate2.f()

0verridingPrivate2.g() */// ~

Β«ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Β» ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ интСрфСйса Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π˜Π½Π°Ρ‡Π΅ говоря, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ восходящСС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΌΠ΅Ρ‚ΠΎΠ΄ (это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ обсуТдаСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅). Если ΠΌΠ΅Ρ‚ΠΎΠ΄ объявлСн ΠΊΠ°ΠΊ private, ΠΎΠ½ Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса; это просто Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄, скрытый Π²Π½ΡƒΡ‚Ρ€ΠΈ класса, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ оказалось Ρ‚ΠΎ ΠΆΠ΅ имя. Если Π²Ρ‹ создаСтС Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ со спСцификатором public, protected ΠΈΠ»ΠΈ с доступом Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ‚ΠΎ ΠΎΠ½ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ связан с Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π’Π°ΠΊ ΠΊΠ°ΠΊ privat-ΠΌΠ΅Ρ‚ΠΎΠ΄ нСдоступСн ΠΈ фактичСски Π½Π΅Π²ΠΈΠ΄ΠΈΠΌ для ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠΈΡ€Π°, ΠΎΠ½ Π½Π΅ влияСт Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π² классС, Π³Π΄Π΅ ΠΎΠ½ Π±Ρ‹Π» описан.

НСизмСнныС классы

Объявляя класс Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ (записывая Π² Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово final), Π²Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот класс Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ наслСдовании ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚Π΅ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ структура вашСго класса Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ постоянной β€” ΠΈΠ»ΠΈ ΠΆΠ΅ появлСниС субклассов Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎ сообраТСниям бСзопасности.

// reusing/Jurassic java

// ОбъявлСниС Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ всСго класса

class SmallBrain {}

final class Dinosaur { int i = 7, int j = 1,

SmallBrain x = new SmallBrain(), void f() {}

}

//1 class Further extends Dinosaur {}

// Ошибка НСльзя Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΉ класс Dinosaur

public class Jurassic {

public static void main(String[] args) { Dinosaur n = new DinosaurO; n.f(). n.i = 40. n.j++.

}

} ///-

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ поля класса ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ, Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎ Π²Π°ΡˆΠ΅ΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€Ρƒ. Π’Π΅ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Π΅Ρ€Π½Ρ‹ ΠΈ для Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, объявлСн Π»ΠΈ класс Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΊΠ°ΠΊ final. ОбъявлСниС класса со спСцификатором final Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ наслСдованиС ΠΎΡ‚ Π½Π΅Π³ΠΎ β€” ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ большС. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ наслСдованиС, всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΌ классС Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅Ρ‚ способа ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ компилятор ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π²Ρ‹Π±ΠΎΡ€ для обСспСчСния эффСктивности выполнСния, Ρ‡Ρ‚ΠΎ ΠΈ Π² случаС с явным объявлСниСм ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΊΠ°ΠΊ final. И Ссли Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ спСцификатор final ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π² классС, объявлСнном всСцСло ΠΊΠ°ΠΊ final, Ρ‚ΠΎ это Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд идСя объявлСния Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (final) Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ класса выглядит довольно Π·Π°ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ β€” Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ смоТСт ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ваши ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Иногда это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ.

Но Π±ΡƒΠ΄ΡŒΡ‚Π΅ остороТнСС Π² своих допущСниях. Π’Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС возмоТности ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования класса, особСнно для классов ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΊΠ°ΠΊ final, Π²Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования класса Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… программистов Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ сами Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ слуТит стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java. Класс vector Java 1.0/1.1 часто использовался Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈ Π±Ρ‹Π» Π±Ρ‹ Π΅Ρ‰Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π΅Π΅, Ссли Π±Ρ‹ ΠΏΠΎ сообраТСниям эффСктивности (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС эфСмСрной) всС Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ final. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π° основС vector ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ посчитали это излишним. Битуация выглядит Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ°Ρ€Π°Π΄ΠΎΠΊΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, класс Stack унаслСдован ΠΎΡ‚ Vector, ΠΈ это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Stack Π΅ΡΡ‚ΡŒ Vector, Π° это Π½Π΅Π²Π΅Ρ€Π½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π»ΠΎΠ³ΠΈΠΊΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ситуации, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сами ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ наслСдованиС ΠΎΡ‚ Vector. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Vector, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ addElement() ΠΈ elementAt(), ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом synchronized. Как Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² Π³Π»Π°Π²Π΅ 12, синхронизация сопряТСна со Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ Π²ΠΎ врСмя выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, вСроятно, сводят ΠΊ Π½ΡƒΠ»ΡŽ всС прСимущСства ΠΎΡ‚ объявлСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊΠ°ΠΊ final. ВсС это лишь ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΎΡ€ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ", Ρ‡Ρ‚ΠΎ программисты Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ области для примСнСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠžΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠΈΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ½ΠΈΠΊ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Java. (К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, соврСмСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Java замСняСт Vector классом ArrayList, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдСлан Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΠΈ ΠΏΠΎ общСпринятым Π½ΠΎΡ€ΠΌΠ°ΠΌ. К соТалСнию, сущСствуСт ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, написанного с использованиСм старой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ².)

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° классов

Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… языках ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² процСссС запуска. Π”Π°Π»Π΅Π΅ слСдуСт инициализация, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ‚Π°ΠΊΠΈΡ… языках Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ порядок ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ статичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ создавал ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. НапримСр, Π² Π‘++ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· статичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ статичСским ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, хотя послСдний Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½.