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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° JavaΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 44

Автор Н.А. Вязовик

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова this ΠΈ super Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ наличия ассоциированного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚.Π΅. динамичСского контСкста, использованиС ΠΈΡ… Π² статичСском контСкстС Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово abstract

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠ΅ понятиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ,– ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово abstract.

Иногда ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π±Π΅Π· Π΅Π³ΠΎ Ρ‚Π΅Π»Π°, ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² этом классС. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π΅Π»ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ графичСских элСмСнтов, Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊΠΈΡ… ΠΈΠΌΠ΅Π½Π½ΠΎ. НапримСр, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой гСомСтричСскиС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ – ΠΊΡ€ΡƒΠ³, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Π·Π²Π΅Π·Π΄Π° ΠΈ Ρ‚.Π΄.; ΠΈΠ»ΠΈ элСмСнты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса – ΠΊΠ½ΠΎΠΏΠΊΠΈ, поля Π²Π²ΠΎΠ΄Π° ΠΈ Ρ‚.Π΄. БСйчас это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ значСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ занимаСтся ΠΈΡ… отрисовкой. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ внСшний Π²ΠΈΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ paint() ) Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Ρ€Π°Π·Π½Ρ‹Ρ… элСмСнтах ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Но Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ. НапримСр, любая ΠΈΠ· Π½ΠΈΡ… Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрСкрытия, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π½Π΅ Π²Ρ‹Π»Π΅Π·Π°Π΅Ρ‚ Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΈ Ρ‚.Π΄. КаТдая Ρ„ΠΈΠ³ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π΅Π΅ Π½Π°Π΄ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ, ΠΈΠ»ΠΈ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ ΠΈ Ρ‚.Π΄. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс для всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² Π½Π΅ΠΌ всС ΠΎΠ±Ρ‰ΠΈΠ΅ свойства, Ρ‡Ρ‚ΠΎΠ±Ρ‹ каТдая ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° лишь наслСдовала ΠΈΡ….

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

ИмСнно здСсь ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС. Π£ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ внСшнСго Π²ΠΈΠ΄Π°, Π½ΠΎ извСстно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ наслСдника. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° описываСтся Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС, Ρ‚Π΅Π»ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ наслСдника своС, Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ спокойно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ, Π½Π΅ дСлая Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


// Базовая арифмСтичСская опСрация

abstract class Operation {

public abstract int calculate(int a, int b);

}

// Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅

class Addition extends Operation {

public int calculate(int a, int b) {

return a+b;

}

}

// Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅

class Subtraction extends Operation {

public int calculate(int a, int b) {

return a-b;

}

}

class Test {

public static void main(String s[]) {

Operation o1 = new Addition();

Operation o2 = new Subtraction();

o1.calculate(2, 3);

o2.calculate(3, 5);

}

}


Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ слоТСния ΠΈ вычитания Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main() Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ – ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅Π»Π°, послС описания Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ставится Ρ‚ΠΎΡ‡ΠΊΠ° с запятой. А Ρ€Π°Π· Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ Ρ‚Π΅Π»Π°, Ρ‚ΠΎ ΠΊ Π½Π΅ΠΌΡƒ нСльзя ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ наслСдники Π½Π΅ ΠΎΠΏΠΈΡˆΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ нСльзя ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры класса, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π’Π°ΠΊΠΎΠΉ класс сам ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ абстрактным.

Класс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ абстрактным ΠΈ Π² Ρ‚ΠΎΠΌ случаС, Ссли Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ абстрактным, Ссли Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΅ΡΡ‚ΡŒ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово abstract Π² спискС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² класса, Ссли Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ созданиС экзСмпляров этого класса. ΠšΠ»Π°ΡΡΡ‹-наслСдники Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ (implements) всС абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ) своСго абстрактного родитСля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ нСабстрактными ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ Π½ΠΈΡ… экзСмпляры.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, класс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ abstract ΠΈ final. Π­Ρ‚ΠΎ ΠΆΠ΅ Π²Π΅Ρ€Π½ΠΎ ΠΈ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ private, native, static.

Π‘Π°ΠΌ класс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ своими абстрактными ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ.


abstract class Test {

public abstract int getX();

public abstract int getY();

public double getLength() {

return Math.sqrt(getX()*getX()+

getY()*getY());

}

}


Π­Ρ‚ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ getLength() ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ нСабстрактного класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся наслСдником ΠΎΡ‚ Test, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

По этой ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° абстрактный класс. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null ΠΈΠ»ΠΈ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ нСабстрактного наслСдника этого класса.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² позволяСт ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ мноТСствСнному наслСдованию. Π’ Java класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ родитСля, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ мноТСствСнном наслСдовании ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль. НапримСр, Ссли Ρƒ класса Π΅ΡΡ‚ΡŒ Π΄Π²Π° родитСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… унаслСдуСт Π½ΠΎΠ²Ρ‹ΠΉ класс? И какая Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ лишился своСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π°?

ВсС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. Π”Π°ΠΆΠ΅ Ссли унаслСдовано нСсколько ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², всС Ρ€Π°Π²Π½ΠΎ Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ любого ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

ИмСнно Ρ‚Π°ΠΊ устроСны интСрфСйсы Π² Java. ΠžΡ‚ Π½ΠΈΡ… нСльзя ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ….

ОбъявлСниС интСрфСйсов

ОбъявлСниС интСрфСйсов ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ объявлСниС классов.

Оно начинаСтся с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСн ΠΊΠ°ΠΊ public ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ доступСн для ΠΎΠ±Ρ‰Π΅Π³ΠΎ использования, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ доступа ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ, Π² этом случаС интСрфСйс доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΈΠΏΠΎΠ² своСго ΠΏΠ°ΠΊΠ΅Ρ‚Π°. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ abstract для интСрфСйса Π½Π΅ трСбуСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС интСрфСйсы ΡΠ²Π»ΡΡŽΡ‚ΡΡ абстрактными. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ этого Π½Π΅ рСкомСндуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄.

Π”Π°Π»Π΅Π΅ записываСтся ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово interface ΠΈ имя интСрфСйса.

ПослС этого ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово extends ΠΈ список интСрфСйсов, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹ΠΉ интСрфСйс. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ наслСдования Π½Π΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π»ΠΎ цикличСской зависимости.

НаслСдованиС интСрфСйсов Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π³ΠΈΠ±ΠΊΠΎΠ΅. Π’Π°ΠΊ, Ссли Π΅ΡΡ‚ΡŒ Π΄Π²Π° интСрфСйса, A ΠΈ B, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ B наслСдуСтся ΠΎΡ‚ A, Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ интСрфСйс C ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π½ΠΈΡ… ΠΎΠ±ΠΎΠΈΡ…. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, понятно, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ наслСдования ΠΎΡ‚ A являСтся ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ, всС элСмСнты этого интСрфСйса ΠΈ Ρ‚Π°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΏΠΎ наслСдству Ρ‡Π΅Ρ€Π΅Π· интСрфСйс B.

Π—Π°Ρ‚Π΅ΠΌ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобках записываСтся Ρ‚Π΅Π»ΠΎ интСрфСйса.


public interface Drawable extends Colorable,

Resizable {

}


Π’Π΅Π»ΠΎ интСрфСйса состоит ΠΈΠ· объявлСния элСмСнтов, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ΠΉ-констант ΠΈ абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ВсС поля интСрфСйса Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ public final static, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ эти ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ поля ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡ… сразу ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

public interface Directions {

int RIGHT=1;

int LEFT=2;

int UP=3;

int DOWN=4;

}


ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ интСрфСйса ΡΠ²Π»ΡΡŽΡ‚ΡΡ public abstract ΠΈ эти ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹.

public interface Moveable {

void moveRight();

void moveLeft();

void moveUp();

void moveDown();

}


Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, описаниС интСрфСйса Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ объявлСниС класса.

РСализация интСрфСйса

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ доступныС интСрфСйсы. ΠŸΡ€ΠΈ этом Π² классС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ всС абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, появившиСся ΠΏΡ€ΠΈ наслСдовании ΠΎΡ‚ интСрфСйсов ΠΈΠ»ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹ΠΉ класс ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ объявлСн нСабстрактным.

Если ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ сигнатурой, Ρ‚ΠΎ достаточно ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для всСх этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Однако Ссли Ρƒ Π½ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚:


interface A {

int getValue();

}

interface B {

double getValue();

}


Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Π° эти интСрфСйса, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка компиляции. Π’ классС оказываСтся Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ сигнатурой, Ρ‡Ρ‚ΠΎ являСтся Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΡ‹ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠΌ. Π­Ρ‚ΠΎ СдинствСнноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Π±ΠΎΡ€ интСрфСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ класс.

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ с полями-константами Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½:


interface A {

int value=3;

}

interface B {

double value=5.4;

}

class C implements A, B {

public static void main(String s[]) {

C c = new C();

// System.out.println(c.value); - ошибка!

System.out.println(((A)c).value);

System.out.println(((B)c).value);

}

}


Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ полю Ρ‡Π΅Ρ€Π΅Π· сам класс нСльзя, компилятор Π½Π΅ смоТСт ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΏΠΎΠ»Π΅ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Но ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ явного привСдСния ΡΠΎΡΠ»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ….