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

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

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

//. access/Lunch.java // Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ доступа для классов. // ИспользованиС конструкторов, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… private, // Π΄Π΅Π»Π°Π΅Ρ‚ класс нСдоступным ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

class Soupl {

private SouplО {}

// (1) Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² статичСском ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅: public static Soupl makeSoupO { return new SouplO;

}

}

class Soup2 {

private Soup2() {}

// (2) Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ статичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ // ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ссылку Π½Π° Π½Π΅Π³ΠΎ, private static Soup2 psl = new Soup2(): public static Soup2 accessO { return psl:

}

public void f() {}

}

// Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ public-класс: public class Lunch {

void testPrivateO {

// Π—Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ, Ρ‚.ΠΊ конструктор объявлСн ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ: //! Soupl soup = new SouplO:

}

void testStaticO {

Soupl soup = Soupl.makeSoupO;

}

void testSingletonO {

Soup2.access О f();

}

)

Π”ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΎ ΠΈΠ»ΠΈ void, ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², поэтому ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

public static Soupl makeSoupO { return new SouplO:

} Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд смотрится Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странно. Π‘Π»ΠΎΠ²ΠΎ Soupl ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (makeSbup) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ возвращаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Π’ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ использовалось ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ void, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. Однако ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚; Π² Π΄Π°Π½Π½ΠΎΠΌ случаС возвращаСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Soupl.

ΠšΠ»Π°ΡΡΡ‹ Soupl H'Soup2 наглядно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ прямоС созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса, объявив всС Π΅Π³ΠΎ конструкторы со спСцификатором private. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Π΅Π· явного опрСдСлСния хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ конструктора компилятор сгСнСрируСт конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (конструктор Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π²Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ автоматичСскоС созданиС. Если конструктор объявлСн со спСцификатором private, Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ смоТСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса. Но ΠΊΠ°ΠΊ ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот класс? РассмотрСнный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт Π΄Π²Π° способа. Π’ классС Soupl опрСдСляСтся статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Soupl ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ссылку Π½Π° Π½Π΅Π³ΠΎ. Π­Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ситуациях, Π³Π΄Π΅ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ провСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ ссылки Π½Π° Π½Π΅Π³ΠΎ, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ подсчСтС ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Soupl (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ограничСния ΠΈΡ… максимального количСства).

Π’ классС Soup2 использован Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ всСгда создаСтся Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Soup2 создаСтся ΠΊΠ°ΠΊ статичСская приватная пСрСмСнная, пэтому ΠΎΠ½ всСгда сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ экзСмплярС ΠΈ Π΅Π³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° access().

РСзюмС

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

Если программисты-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ прСдоставлСны сами сСбС ΠΈ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΠΈΠΌ заблагорассудится, с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ класса β€” Π΄Π°ΠΆΠ΅ Ρ‚Π΅ΠΌΠΈ, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ. ВсС Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠΈΡ€Π°.

Π’ этой Π³Π»Π°Π²Π΅ рассматриваСтся процСсс построСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ· классов; Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ классов Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ, Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ управлСния доступом ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ класса.

По ΠΎΡ†Π΅Π½ΠΊΠ°ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° языкС Π‘ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Β«Ρ€Π°ΡΡΡ‹ΠΏΠ°Ρ‚ΡŒΡΡΒ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ достигаСт объСма ΠΎΡ‚ 50 Π΄ΠΎ 100 ΠšΠ±Π°ΠΉΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π‘ ΠΈΠΌΠ΅Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΎΠ΅ «пространство ΠΈΠΌΠ΅Π½Β»; Π² систСмС Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅Π½, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠ΅ массу нСудобств. Π’ Java ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово package, схСма имСнования ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово import ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ.

БущСствуСт Π΄Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ для ограничСния доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ класса. ΠŸΠ΅Ρ€Π²Π°Ρ β€” ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ использования ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса, Π½Π΅ входящСй Π²ΠΎ внСшний интСрфСйс. ОбъявлСниС ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² со спСцификатором private Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ класса, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ сразу видят, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ класса для Π½ΠΈΡ… Π²Π°ΠΆΠ½Ρ‹, Π° ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ВсС это ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ использованиС класса.

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

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ интСрфСйс класса β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ фактичСски Π²ΠΈΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, поэтому ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ «довСсти Π΄ΠΎ ΡƒΠΌΠ°Β» ΠΈΠΌΠ΅Π½Π½ΠΎ эту, ΡΠ°ΠΌΡƒΡŽ Π²Π°ΠΆΠ½ΡƒΡŽ, Ρ‡Π°ΡΡ‚ΡŒ класса Π² процСссС Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. И Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ этом Ρƒ вас остаСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ свобода дСйствий. Π”Π°ΠΆΠ΅ Ссли ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ€Π°Π·Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ β€” Π±Π΅Π· удалСния ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ программистами-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅

использованиС

классов

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ числу Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… прСимущСств Java. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΏΠΎ-настоящСму ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Π΅ измСнСния ΠΎΡ‚Π½ΡŽΠ΄ΡŒ Π½Π΅ сводятся ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΊΠΎΠ΄Π°.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС Π½Π° Π±Π°Π·Π΅ копирования ΠΊΠΎΠ΄Π° Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹Ρ… языков, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π‘, Π½ΠΎ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. РСшСниС этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Java, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, строится Π½Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ класса. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс «с чистого листа», Π²Ρ‹ Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π° основу ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΡƒΠΆΠ΅ создал ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ» Π½Π° Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ.

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

Π’Ρ‚ΠΎΡ€ΠΎΠΉ способ Π³ΠΎΡ€Π°Π·Π΄ΠΎ интСрСснСС. Новый класс создаСтся ΠΊΠ°ΠΊ спСциализация ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса. Взяв ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс Π·Π° основу, Π²Ρ‹ добавляСтС ΠΊ Π½Π΅ΠΌΡƒ свой ΠΊΠΎΠ΄ Π±Π΅Π· измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ называСтся наслСдованиСм (inheritance), ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π½Π΅ΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ компилятор. НаслСдованиС являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Β«ΠΊΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉΒ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования; Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π΅Π³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ описаны Π² Π³Π»Π°Π²Π΅ 8.

Бинтаксис ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈ использовании ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ наслСдования Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ (Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для построСния Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π½Π° Π±Π°Π·Π΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…). Π’ этой Π³Π»Π°Π²Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠ΄Π°.

Ρƒ

ΠΈ

Бинтаксис ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

Π”ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΌΡ‹ ΡƒΠΆΠ΅ довольно часто использовали ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ β€” ссылка Π½Π° внСдряСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ просто Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π½ΠΎΠ²Ρ‹ΠΉ класс. Допустим, Π²Π°ΠΌ понадобился ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, содСрТащий нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² String, ΠΏΠ°Ρ€Ρƒ ΠΏΠΎΠ»Π΅ΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. Для Π½Π΅-ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π½ΠΎΠ²Ρ‹ΠΉ класс Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ссылки, Π° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ сразу:

// reusing/SprinklerSystem java

// ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠ΄Π°.

class WaterSource { private String s, WaterSourceO {

System out println( "WaterSourceO"); s = "сконструирован";

}

public String toStringO { return s; }

}

public class SprinklerSystem {

private String valvel. valve2, valve3, valve4, private WaterSource source = new WaterSourceO; private int i. private float f, public String toStringO { return

"valvel = " + valvel + " " + β€’ "valve2 = " + valve2 + " " + "valve3 = " + valve3 + " " +

"valve4 = " + valve4 + "\n" +

β€’β€’-j = - + -j + β– β–  β€’β€’ + -f = β€’β€’ + f + β€’β€’ " +

"source = " + source,

}

public static void main(String[] args) {

SprinklerSystem sprinklers = new SprinklerSystem(), System out println(sprinklers);

}

} /* Output-WaterSourceO

valvel = null valve2 = null valve3 = null valve4 = null i = 0 f = 0.0 source = сконструирован *///β€’-

Π’ ΠΎΠ±ΠΎΠΈΡ… классах опрСдСляСтся особый ΠΌΠ΅Ρ‚ΠΎΠ΄ toString(). ПозТС Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π΅-ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ toString(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вызываСтся Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… случаях, ΠΊΠΎΠ³Π΄Π° компилятор располагаСт Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π° Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ строковоС прСдставлСниС Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ String. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° S Ρ€ ri n klerSyste m.toStri n g ():

"source = " + source;

компилятор Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊ строкС "source = " «прибавляСтся» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса WaterSource. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊ строкС ΠΌΠΎΠΆΠ½ΠΎ Β«Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΒ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ строку, поэтому ΠΎΠ½ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ source Π² String, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ toString(). ПослС этого компилятор ΡƒΠΆΠ΅ Π² состоянии ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΄Π²Π΅ строки ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ System.out.println() (ΠΈΠ»ΠΈ статичСским ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ print() ΠΈ printnb(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² ΠΊΠ½ΠΈΠ³Π΅). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΎΡΡŒ вашим классом, достаточно Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ toString().

ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² качСствС ΠΏΠΎΠ»Π΅ΠΉ класса, автоматичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ значСниями, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 2. Однако ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ значСниями null, ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΉ ссылкС ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ссылку null ΠΌΠΎΠΆΠ½ΠΎ вывСсти Π±Π΅Π· Π²Ρ‹Π΄Π°Ρ‡ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.