JavaRush /Java Blog /Random-TK /Java-da jemleýji, yzygiderli we üýtgewsiz

Java-da jemleýji, yzygiderli we üýtgewsiz

Toparda çap edildi
Salam! “Üýtgediji” sözi size eýýäm tanyş. Iň bolmanda, giriş üýtgedijilerine (jemgyýetçilik, hususy) we statiki üýtgedijä duş geldiňiz. Bu gün ýörite jemleýji üýtgediji barada gürleşeris . Programmamyzyň hemişe, birmeňzeş, üýtgewsiz hereketlerine mätäç ýerlerini “sement” diýip bileris. Programmamyzyň üç ugry boýunça ulanylyp bilner: synplar, usullar we üýtgeýjiler. Java-da üýtgewsiz: jemleýji, yzygiderli we üýtgewsiz - 2 Geliň, birin-birin geçeliň. Synp deklarasiýasynda iň soňky üýtgediji bar bolsa , bu synpdan miras alyp bilmejekdigiňizi aňladýar. Öňki leksiýalarda mirasyň ýönekeý bir mysalyny gördük: ene-atalar synpymyz Animal, iki çaga synpymyz bardy - CatweDog
public class Animal {
}

public class Cat extends Animal {
   //..поля и методы класса Cat
}

public class Dog extends Animal {

   //..поля и методы класса Dog
}
AnimalŞeýle-de bolsa, synp üçin üýtgediji görkezsek , synplar hem ondan finalmiras alyp bilmezler . CatDog
public final class Animal {

}

public class Cat extends Animal {

   //ошибка! Cannot inherit from final Animal
}
Düzediji derrew ýalňyşlyk döredýär. Java-da eýýäm ýerine ýetirilen köp sanly klas bar final. Yzygiderli ulanýanlaryňyzyň arasynda iň meşhury String. Mundan başga-da, synp yglan edilse final, onuň ähli usullary hem bolýar final. Bu näme many berýär? Bir usul üçin üýtgediji görkezilen bolsa final, bu usuly ýok edip bolmaz. AnimalMysal üçin, usuly kesgitleýän synpymyz bar voice(). Şeýle-de bolsa, itler we pişikler başgaça “gürleşýärler”. Şonuň üçin synplaryň hersinde - Catwe Dog- usul dörederis voice(), ýöne başgaça durmuşa geçireris.
public class Animal {

   public void voice() {
       System.out.println("Voice!");
   }
}

public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void voice() {
       System.out.println("Woof!");
   }
}
Sapaklarda Catwe Dogene-atalar synpynyň usulyny ýok etdik. Indi haýwan haýsy synp obýektine baglylykda ses çykarar:
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       Dog dog = new Dog();

       cat.voice();
       dog.voice();
   }
}
Netije: Meow! Woof! Şeýle-de bolsa, bir synpda Animalbir usuly yglan etsek , ony beýleki synplarda täzeden kesgitlemek mümkin bolmaz: voice()final
public class Animal {

   public final void voice() {
       System.out.println("Voice!");
   }
}


public class Cat extends Animal {

   @Override
   public void voice() {//ошибка! final-метод не может быть переопределен!
       System.out.println("Meow!");
   }
}
Soňra obýektlerimiz voice()ene synpda kesgitlenişi ýaly usuly ulanmaga mejbur bolarlar:
public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   cat.voice();
   dog.voice();
}
Netije: Ses! Ses! Indi finalüýtgeýänler hakda. Otherwiseogsam olara yzygiderli diýilýär . Ilki bilen (we iň esasysy), hemişelik bellenen ilkinji bahany üýtgedip bolmaz. Bir gezek we hemişelik bellenýär.
public class Main {

   private static final int CONSTANT_EXAMPLE = 333;

   public static void main(String[] args) {

       CONSTANT_EXAMPLE = 999;//ошибка! Нельзя присвоить новое meaning final-переменной!
   }
}
Hemişelik derrew başlamagyň zerurlygy ýok. Bu soňrak edilip bilner. Emma ilki bilen bellenen baha baky galar.
public static void main(String[] args) {

   final int CONSTANT_EXAMPLE;

   CONSTANT_EXAMPLE = 999;//так делать можно
}
Ikinjiden, üýtgeýjimiziň adyna üns beriň. Java yzygiderliliginiň başga atlandyryş konwensiýasy bar. Bu, biziň öwrenişen düýänimiz däl. Adaty üýtgeýji bolan ýagdaýynda, oňa hemişelikExample diýeris, ýöne yzygiderli atlar baş harplar bilen ýazylýar we sözleriň arasynda (olaryň birnäçesi bar bolsa) aşaky çyzgy bar - "CONSTANT_EXAMPLE". Näme üçin yzygiderlilik gerek? Mysal üçin, bir programmada yzygiderli bahany yzygiderli ulansaňyz, peýdaly bolar. Taryha girip, diňe “Jadygöý 4” oýunyny ýazmak kararyna geldiňiz diýeliň. Oýun baş gahrymanyň adyny - “Geralt of Rivia” ulanar. Bu setiri we beýleki gahrymanlaryň atlaryny hemişelik bölmek has gowudyr: zerur baha bir ýerde saklanar we millionlarça gezek ýazanyňyzda hökman ýalňyşlyk goýbermersiňiz.
public class TheWitcher4 {

   private static final String GERALT_NAME = "Геральт из Ривии";
   private static final String YENNEFER_NAME = "Йеннифэр из Венгерберга";
   private static final String TRISS_NAME = "Трисс Меригольд";

   public static void main(String[] args) {

       System.out.println("Ведьмак 4");
       System.out.println("Это уже четвертая часть Ведьмака, а " + GERALT_NAME + " ниHow не определится кто ему" +
               " нравится больше: " + YENNEFER_NAME + " or " + TRISS_NAME);

       System.out.println("Но если вы никогда не играли в Ведьмака - начнем сначала.");
       System.out.println("Главного героя зовут " + GERALT_NAME);
       System.out.println(GERALT_NAME + " - ведьмак, охотник на чудовищ");
   }
}
Netije:
Ведьмак 4
Это уже четвертая часть Ведьмака, а Геральт из Ривии ниHow не определится, кто ему нравится больше: Йеннифэр из Венгерберга or Трисс Меригольд.
Но если вы никогда не играли в Ведьмака — начнем сначала.
Главного героя зовут Геральт из Ривии
Геральт из Ривии — ведьмак, охотник на чудовищ
Nyşanlaryň atlaryny yzygiderli böldük, indi hökman ýalňyşmarys we her gezek el bilen ýazmagyň zerurlygy bolmaz. Anotherene bir goşmaça: ahyrky netijede bir üýtgeýjiniň bahasyny tutuş programma boýunça üýtgetmeli bolsak, ony tutuş kod boýunça el bilen gaýtadan işlemegiň ýerine bir ýerde ýerine ýetirmek ýeterlikdir :)

Üýtgemeýän görnüşler

Java-da işleýän wagtyňyz, programmistiň ähli obýektleriň ýagdaýyna doly gözegçilik edýändigine eýýäm öwrenişen bolsaňyz gerek. Islenýän - bir obýekt döretdi Cat. Islesem, adyny üýtgetdim. Islese, ýaşyny ýa-da başga bir zady üýtgetdi. Emma Java-da aýratyn ýagdaýy bolan birnäçe maglumat görnüşi bar. Olar üýtgewsiz ýa-da üýtgewsiz . Diýmek, synp üýtgewsiz bolsa, obýektleriniň ýagdaýyny üýtgedip bolmaz. Mysallar? Geň galyp bilersiňiz, emma Immutable synpynyň iň meşhur mysaly String! Setiriň bahasyny üýtgedip bilmeýän ýaly? Synag edeliň:
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1 = "I love Python";//но поведение str1 ниHow не влияет на str2
   System.out.println(str2);//str2 продолжает указывать на строку "I love Java", хотя str1 уже указывает на другой an object
}
Netije: Java-ny gowy görýärin Java-ny ýazanymyzdan soň:
str1 = "I love Python";
"Java-y söýýärin" setiri bolan obýekt üýtgemedi we hiç ýere gitmedi. Ygtybarly bar we içinde edil öňki ýaly tekst bar. Kod:
str1 = "I love Python";
ýaňy başga bir obýekt döretdi we indi üýtgeýän str1oňa görkezýär. Emma “Java-y söýýärin” obýektine hiç hili täsir edip bilmeris . Bolýar, geliň başgaça synap göreliň! Synp Stringusullardan doly we olaryň käbiri hataryň ýagdaýyny üýtgedýän ýaly! Mysal üçin, bir usul bar replace(). Geliň, “Java” sözüni setirimizdäki “Python” sözüne üýtgedeliň!
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1.replace("Java", "Python");//попробуем изменить состояние str1, заменив слово "Java" на “Python”
   System.out.println(str2);
}
Netije: Java-ny gowy görýärin Java-y gowy görýärin Bu täzeden işlemedi! Belki egrilik usuly işlemän biler? Başga birini synap göreliň. Mysal üçin , substring(). Geçirilen nyşanlaryň sanyna esaslanyp bir setir kesýär. Geliň, ilkinji 10 simwoly keseliň:
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1.substring(10);//обрезаем исходную строку
   System.out.println(str2);
}
Netije: Java-ny gowy görýärin Java-y halaýaryn Java-da üýtgewsiz: jemleýji, üýtgewsiz we üýtgewsiz - 3 Hiç zat üýtgemedi. Şeýle bolmaly däl. Aýdyşymyz ýaly, zatlar Stringüýtgewsizdir. Onda bu synp usullarynyň hemmesi näme String? Setiri kesip, içindäki nyşanlary üýtgedip we ş.m. Onda hiç zat bolaýmasa näme üçin zerur? Başararlar! Emma olar her gezek täze setir obýektini gaýtaryp berýärler. Writingazmagyň peýdasy ýok:
str1.replace("Java", "Python");
- asyl obýekti üýtgetmersiňiz. Methodöne usulyň netijesini täze salgy üýtgeýjisine ýazsaňyz, tapawudyny derrew görersiňiz!
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   String str1AfterReplacement =  str1.replace("Java", "Python");
   System.out.println(str2);

   System.out.println(str1AfterReplacement);
}
Bu usullaryň hemmesiniň işlemeginiň ýeke-täk usuly String. "Java-y söýýärin" obýekti bilen hiç zat edip bilmersiňiz . Diňe täze bir obýekt dörediň we ýazyň: "Täze obýekt = " Java-y söýýärin " obýekti bilen käbir manipulýasiýalaryň netijesi ." Başga haýsy görnüşler üýtgewsiz? Indi hökman ýatda saklamaly zatlaryňyzdan - başlangyç görnüşleriň üstündäki ähli sapaklar üýtgewsizdir. Integer,,,,,,, - bu synplaryň hemmesi üýtgewsiz zatlary döredýär . Byte_ Bu, şeýle hem, köp sanly döretmek üçin ulanylýan sapaklary öz içine alýar - we . Recentlyakynda kadadan çykmalary başdan geçirdik we degip geçdik . Şeýlelik bilen: java.lang.StackTraceElement synpynyň obýektleri hem üýtgewsizdir. Bu mantykly: kimdir biri biziň bukjamyzdaky maglumatlary üýtgedip bilse, onuň bilen ähli işleri ýatyryp biler. Kimdir biriniň StackTrace girip , OutOfMemoryError- y FileNotFoundException- a üýtgedýändigini göz öňüne getiriň . Bu ýygyndy bilen işlemeli we ýalňyşlygyň sebäbini gözlemeli. Programma faýllary asla ulanmaýar :) Şonuň üçin howpsuz tarapda bolmak üçin bu zatlar üýtgewsiz edildi. “StackTraceElement” bilen has düşnükli. Näme üçin her kim setirleri üýtgewsiz etmek isleýär? Gymmatlyklaryny üýtgetmek mümkin bolsa näme problema bolardy. Has amatly bolmagy ähtimal: / Munuň birnäçe sebäbi bar. Birinjiden, ýady tygşytlamak. Üýtgemeýän setirler ýerleşdirilip bilner we şol bir setirleri her gezek täzelerini döretmegiň ýerine ulanyp bolýar. Ikinjiden, howpsuzlyk. Mysal üçin, islendik programmadaky girişleriň we parollaryň köpüsi setirlerdir. Olary üýtgetmek mümkinçiligi awtorizasiýa bilen baglanyşykly problemalara sebäp bolup biler. Başga sebäpler bar, ýöne entek Java öwrenip bilmedik - soňrak gaýdyp geleris. CharacterShortBooleanLongDoubleFloatBigIntegerBigDecimalStackTraceString Pool
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION