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

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

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

// инициализация экзСмпляром: {

print ("Counter О");

}

public int next О {

printnb(name): // Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ return count++:

}

public static void main(String[] args) {

LocalInnerClass lie = new LocalInnerClassO: Counter

cl = lic.getCounter(" Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ"), c2 = lic.getCounter2(" бСзымянный"): for(int i = 0: i < 5: i++) print(cl.nextO): for(int i = 0: i < 5: i++) print(c2.next());

}

}

} /* Output: Local CounterO CounterO Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ 0 Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ 1 Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ 2 Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ 3 Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ 4 бСзымянный 5 бСзымянный 6 бСзымянный 7 бСзымянный 8 бСзымянный 9 *///:-

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

// Π£ локального Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ класса // ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ собствСнный конструктор: pri nt("Local Counter()");

}

public int next О {

printnb(name): // Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ return count++;

Другая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° для использования локального Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ класса вмСсто бСзымянного Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ создания Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса.

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… классов

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс компилируСтся Π² Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .class, содСрТащий ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ создании Π΅Π³ΠΎ экзСмпляров (эта информация помСщаСтся Π² Β«ΠΌΠ΅Ρ‚Π°-класс», Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Class), Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ .class для хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ своих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… Class. ИмСна этих Ρ„Π°ΠΉΠ»ΠΎΠ²-классов строятся ΠΏΠΎ ТСстко Π·Π°Π΄Π°Π½Π½ΠΎΠΉ схСмС: имя ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅Π³ΠΎ внСшнСго класса, Π·Π°Ρ‚Π΅ΠΌ символ $ ΠΈ имя Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ класса. НапримСр, для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ LocallnnerClass.java ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .class:

Counter.class

LocalInnerClass$2.class

LocalInnerClass$lLocalCounter.class

LocalInnerClass.class

Если Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы ΡΠ²Π»ΡΡŽΡ‚ΡΡ бСзымянными, компилятор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π² качСствС ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π½ΠΎΠΌΠ΅Ρ€Π°. Если Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы Π²Π»ΠΎΠΆΠ΅Π½Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы, ΠΈΡ… ΠΈΠΌΠ΅Π½Π° просто ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ послС символа $ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² всСх Π²Π½Π΅ΡˆΠ½ΠΈΡ… классов.

Π₯отя такая схСма построСния Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΈΠΌΠ΅Π½ проста ΠΈ прямолинСйна, ΠΎΠ½Π° Π²ΠΏΠΎΠ»Π½Π΅ Π½Π°Π΄Π΅ΠΆΠ½Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ практичСски Π² Π»ΡŽΠ±Ρ‹Ρ… ситуациях. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° являСтся стандартной для языка Java, всС ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ автоматичСски становятся ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ½ΠΎ-нСзависимыми.

РСзюмС

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы β€” вСсьма Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языках Π²Ρ‹ ΠΈΡ… Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅. НапримСр, Π² Π‘++ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ. ВмСстС ΠΎΠ½ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Ρ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π‘++ пытаСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ мноТСствСнного наслСдования. Однако мноТСствСнноС наслСдованиС Π‘++ создаСт массу ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ; ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π½ΠΈΠΌ интСрфСйсы ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ классы Java Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ доступны.

Π₯отя сами ΠΏΠΎ сСбС эти ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ слоТны, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΡ… использовании принимаСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ проСктирования (ΠΊΠ°ΠΊ ΠΈ Π² случаС с ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠΎΠΌ). Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ сразу ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ, Π³Π΄Π΅ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²Ρ‹Π³ΠΎΠ΄Ρƒ даст интСрфСйс, Π³Π΄Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ класс, Π° Π³Π΄Π΅ Π½ΡƒΠΆΠ½Ρ‹ ΠΎΠ±Π΅ возмоТности сразу. А ΠΏΠΎΠΊΠ° достаточно хотя Π±Ρ‹ Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΈΡ… синтаксисом ΠΈ сСмантикой.

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с фиксированным Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ для ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

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

ΠœΡƒΠ’ΡƒΡ€Π΅ aReference;

Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π°Ρ€Π°Π½Π΅Π΅ нСизвСстно, сколько Ρ‚Π°ΠΊΠΈΡ… ссылок Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ потрСбуСтся.

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

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ‚ΠΈΠΏΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹

Одна ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΡ… ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ Π΄ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π° Java SE5, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компилятор позволял Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΠΎΠ΄ΠΈΠ½ ΠΈΠ· основных Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²

ArrayList, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ собираСмся Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Apple. Пока рассматривайтС ArrayList ΠΊΠ°ΠΊ «автоматичСски Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΉ массив». Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌ нСслоТно: создайтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, вставляйтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ add(), ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡŒ ΠΊ Π½ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ get(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ индСксированиС β€” Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ для массивов, Π½ΠΎ Π±Π΅Π· ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок. ArrayList Ρ‚Π°ΠΊΠΆΠ΅ содСрТит ΠΌΠ΅Ρ‚ΠΎΠ΄ size(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство элСмСнтов Π² массивС.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Apple ΠΈ Orange, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ компилятор Java Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ парамСтризация, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Java SE5 сущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° @SuppressWarnings для подавлСния ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ со Π·Π½Π°ΠΊΠ° @ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹; Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ «нСпровСряСмыС» прСдупрСТдСния:

//: hoiding/ApplesAndOrangesWithoutGenerics. java

// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ

// (компилятор Π²Ρ‹Π΄Π°Π΅Ρ‚ прСдупрСТдСния).

// {ThrowsException}

import java.util.*;

class Apple {

private static long counter; private final long id = counter++; public long id() { return id; }

}

class Orange {}

public class ApplesAndOrangesWithoutGenerics { @SuppressWarni ngs("unchecked") public static void main(String[] args) {

ArrayList apples = new ArrayListO; for(int i = 0; i < 3; i++)

apples, add (new AppleO); // He прСпятствуСт добавлСнию ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Orange: apples.add(new OrangeO); for(int i = 0; i < apples.size(). i++) ((Apple)apples.get(i)).id();

// ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Orange обнаруТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния

}

}

///:-

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Java SE5 Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΠΏΠΎΠ·Π΄Π½Π΅Π΅.

Apple ΠΈ Orange β€” ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ классы; ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ происхоТдСния ΠΎΡ‚ Object (напомню: Ссли Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ явно Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, Ρ‚ΠΎ Π² этом качСствС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Object). Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ArrayList хранятся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Object, ΠΌΠ΅Ρ‚ΠΎΠ΄ add() ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Apple, Π½ΠΎ ΠΈ Orange, Π±Π΅Π· ошибок компиляции ΠΈΠ»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния. Но ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° get() класса ArrayList Π²Ρ‹ вмСсто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Apple ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ссылку Π½Π° Object, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Apple. ВсС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ‚ΠΈΠΏΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ 279

ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° id() класса Apple. Π’ΠΎ врСмя выполнСния, ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ прСобразования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Orange Π² Apple, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π’ Π³Π»Π°Π²Π΅ Β«ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹Β» Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ созданиС классов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ довольно слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… классов ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ArrayList, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для хранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Apple, достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто ΠΈΠΌΠ΅Π½ΠΈ ArrayList запись А Π³ ray Li s t< A p p le>. Π’ ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² (ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько), ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², хранящихся Π² Π΄Π°Π½Π½ΠΎΠΌ экзСмплярС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ занСсСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π° стадии компиляции. Рассмотрим Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ с использованиСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ:

// hoiding/ApplesAndOrangesWithGenerics java import java.util.*;

public class ApplesAndOrangesWithGenerics { public static void main(String[] args) {

ArrayList<Apple> apples = new ArrayList<Apple>(), forCint i = 0; i < 3; i++)

apples, add (new AppleO); // Ошибка компиляции: // apples.add(new OrangeO); for(int i = 0; i < apples.size(); i++)

System, out. pri ntl n(appl es. get( i) .idO). // ИспользованиС синтаксиса foreach: for(Apple с β€’ apples)

System.out.pri nt1n(с.i d());

}

} /* Output: 0 1 2 0 1 2

*///-

На этот Ρ€Π°Π· компилятор Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Orange Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ apples, поэтому Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π½Π° стадии компиляции (Π° Π½Π΅ Π½Π° стадии выполнСния).

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· List Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ прСобразования Ρ‚ΠΈΠΏΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π½Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ хранящихся Π² Π½Π΅ΠΌ элСмСнтов, ΠΎΠ½ автоматичСски выполняСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ get(). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, парамСтризация Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ позволяСт компилятору ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹, Π½ΠΎ ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ синтаксис Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, Ссли индСксы элСмСнтов Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ синтаксисом foreach.