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

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

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

ΠŸΠΎΡ‡Π΅ΠΌΡƒ «восходящСС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅Β»?

Π’Π΅Ρ€ΠΌΠΈΠ½ Π²ΠΎΠ·Π½ΠΈΠΊ ΠΏΠΎ историчСским ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ: Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°Ρ… наслСдования ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ изобраТался Ρƒ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ края страницы, Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Π»Π°ΡΡŒ ΠΊ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ ΠΊΡ€Π°ΡŽ страницы. (ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ свои Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ сочтСтС Π½ΡƒΠΆΠ½Ρ‹ΠΌ.) Для Ρ„Π°ΠΉΠ»Π° Wind.java Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° наслСдования выглядит Ρ‚Π°ΠΊ:

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

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ β€” Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ нисходящСС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ (downcasting). Но ΠΏΡ€ΠΈ этом Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, которая рассматриваСтся Π² Π³Π»Π°Π²Π΅ 1.1.

Π‘Π½ΠΎΠ²Π° ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ с наслСдованиСм

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

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

Π’ Java смысл ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова final зависит ΠΎΡ‚ контСкста, Π½ΠΎ Π² основном ΠΎΠ½ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: Β«Π­Ρ‚ΠΎ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΒ». Π—Π°ΠΏΡ€Π΅Ρ‚ Π½Π° измСнСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒΡΡ двумя ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ: Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ»ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ. Π­Ρ‚ΠΈ Π΄Π²Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, поэтому Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова final.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… примСнСния final: для Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ классов.

НСизмСнныС Π΄Π°Π½Π½Ρ‹Π΅

Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках программирования сущСствуСт Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ способ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ частица Π΄Π°Π½Π½Ρ‹Ρ… являСтся «константой». ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² Π΄Π²ΡƒΡ… ситуациях:

β€’ ΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, которая Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ мСняСтся;

β€’ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ подставляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции Π²ΠΎ всС выраТСния, Π³Π΄Π΅ ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ выполнСния. Π’ Java ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ константы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ, Π° для ΠΈΡ… опрСдСлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово final. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ константы присваиваСтся Π²ΠΎ врСмя опрСдСлСния.

ПолС, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ объявлСнноС с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ словами static ΠΈ final, сущСствуСт Π² памяти Π² СдинствСнном экзСмплярС ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ.

ΠŸΡ€ΠΈ использовании слова final со ссылками Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΅Π³ΠΎ смысл Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½. Для ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² final Π΄Π΅Π»Π°Π΅Ρ‚ постоянным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ для ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ постоянной становится ссылка. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ такая ссылка Π±ΡƒΠ΄Π΅Ρ‚ связана с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΎΠ½Π° ΡƒΠΆΠ΅ Π½Π΅ смоТСт ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ; Π² Java Π½Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ. (Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π²Ρ‹ сами ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ваш класс Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ факичСски Π±Ρ‹Π»ΠΈ константными.) Π”Π°Π½Π½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ относится ΠΈ ΠΊ массивам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΎΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт использованиС final для ΠΏΠΎΠ»Π΅ΠΉ классов:

// reusing/Final Data java

// ДСйствиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова final для ΠΏΠΎΠ»Π΅ΠΉ.

import java util *,

import static net mindview.util Print.*;

class Value {

int i. // доступ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚Π° public Value(int i) { this i = i, }

}

public class FinalData {

private static Random rand = new Random(47); private String id,

public FinalData(String id) { this.id = id: } // ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ константами Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, private final int valueOne = 9. private static final int VALUE_TW0 = 99, // Випичная открытая константа, public static final int VALUE_THREE = 39: // He ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константой Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции: private final int i4 = rand.nextlnt(20); static final int INT_5 = rand nextlnt(20); private Value vl = new Value(ll): private final Value v2 = new Value(22), private static final Value VAL_3 = new Value(33): // ΠœΠ°ΡΡΠΈΠ²Ρ‹.

private final int[] a = { 1. 2, 3. 4, 5, 6 }: public String toStringO {

return id + ": " + "i4 = " + i4 + ". INT_5 = " + INT_5;

}

public static void main(String[] args) {

FinalData fdl = new FinalDataCfdl"),

//! fdl.valueOne++, // Ошибка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ

fdl.v2 i++, // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ!

fdl.vl = new Value(9); // OK - Π½Π΅ являСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ

for(int i = 0, i < fdl.a.length; i++)

fdl a[i]++; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ! //! fdl v2 = new Value(O); // Ошибка: ссылку //! fdl VAL_3 = new Valued); // нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ //' fdl a = new int[3], print(fdl),

print("Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ FinalData"); FinalData fd2 = new FinalData("fd2M). print(fdl), print(fd2):

}

} /* Output.

fdl i4 = 15. INT 5 = 18 Π›

ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ &

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Final Data fdl: i4 = 15. INT_5 = 18 fd2: i4 = 13. INT_5 = 18 *///:-

Π’Π°ΠΊ ΠΊΠ°ΠΊ valueOne ΠΈ VALUE_TWO ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ со значСниями, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° стадии компиляции, ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС констант Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции, ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π½Π΅Ρ‚. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° VALUE_THREE дСмонстрируСт общСпринятый способ опрСдСлСния ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ: спСцификатор public ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊ Π½Π΅ΠΉ доступ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°; ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово static ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° сущСствуСт Π² СдинствСнном числС, Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово final ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ final static с Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ константы Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции) Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, Π° слова Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ (эта схСма записи констант позаимствована ΠΈΠ· языка Π‘).

Π‘Π°ΠΌΠΎ ΠΏΠΎ сСбС присутствиС final Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ извСстно ΡƒΠΆΠ΅ Π½Π° стадии компиляции. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ продСмонстрирован Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ i4 ΠΈ INT_5 с использованиСм случайных чисСл. Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ статичСскими ΠΈ нСстатичСскими константами. Она проявляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя исполнСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ компилятором ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ (ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ просто ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ с Ρ†Π΅Π»ΡŒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ). Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ проявляСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ значСния поля i4 для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² fdl ΠΈ fd2 ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹, Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля INT_5 Π½Π΅ измСняСтся ΠΏΡ€ΠΈ создании Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° FinalData. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ INT_5 объявлСно ΠΊΠ°ΠΊ static, поэтому ΠΎΠ½ΠΎ инициализируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ класса.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ vl Π΄ΠΎ VAL_3 ΠΏΠΎΡΡΠ½ΡΡŽΡ‚ смысл объявлСния ссылок с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом final. Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° main(), объявлСниС ссылки v2 ΠΊΠ°ΠΊ final Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Однако ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ссылку v2 ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π½Π΅ получится, ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±Ρ‹Π»Π° объявлСна ΠΊΠ°ΠΊ final. ИмСнно Ρ‚Π°ΠΊΠΎΠΉ смысл ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово final ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ссылкам. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это Π²Π΅Ρ€Π½ΠΎ ΠΈ для массивов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ просто Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒΡŽ ссылки. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, для ссылок ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово final ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ мСньшСй практичСской Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Π΅ΠΌ для ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ².

ΠŸΡƒΡΡ‚Ρ‹Π΅ константы

Π’ Java Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ пустыС константы β€” поля, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ final, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ Π±Ρ‹Π»ΠΎ присвоСно Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΎ всСх случаях ΠΏΡƒΡΡ‚ΡƒΡŽ константу ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ использованиСм, ΠΈ компилятор слСдит Π·Π° этим. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, пустыС константы Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ свободу дСйствий ΠΏΡ€ΠΈ использовании ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова final, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»Π΅ final Π² классС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΎ сохраняСт свою Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

//: c06:BlankFinal .java // "ΠŸΡƒΡΡ‚Ρ‹Π΅" Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Π΅ поля.

class Poppet {

private int i:

Poppet(int ii) { i = ii; }

}

public class BlankFinal {

private final int i = 0; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ константа private final int j; // ΠŸΡƒΡΡ‚Π°Ρ константа private final Poppet p; // ΠŸΡƒΡΡ‚Π°Ρ константа-ссылка II ΠŸΡƒΡΡ‚Ρ‹Π΅ константы ΠΠ•ΠžΠ‘Π₯ΠžΠ”Π˜ΠœΠž ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ // Π² конструкторС: public BlankFinalО {

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, ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… использованиСм.