JavaRush /Java Blogu /Random-AZ /Sinif konstruktorları. Java JDK 1.5
articles
Səviyyə

Sinif konstruktorları. Java JDK 1.5

Qrupda dərc edilmişdir
Sinif konstruktorları.  Java JDK 1.5 - 1

Konstruktorlar haqqında ümumi məlumat

Конструкторmetoda bənzər bir strukturdur, məqsədi sinfin nümunəsini yaratmaqdır. Dizaynerin xüsusiyyətləri:
  • Konstruktorun adı sinfin adına uyğun olmalıdır (şərtə görə, ilk hərf böyük hərflə yazılır, adətən isimdir);
  • İstənilən sinifdə konstruktor var. Hətta siz yazmasanız belə, Java tərtibçisi standart konstruktor yaradacaq, o boş olacaq və superclass konstruktorunu çağırmaqdan başqa heç nə etməyəcək.
  • Konstruktor metoda bənzəyir, lakin o, metod deyil, hətta sinfin üzvü sayılmır. Buna görə də, o, alt sinifdə miras alına və ya ləğv edilə bilməz;
  • Konstruktorlar miras alınmır;
  • Bir sinifdə bir neçə konstruktor ola bilər. Bu halda konstruktorların həddindən artıq yükləndiyi deyilir;
  • Əgər sinif konstruktoru müəyyən etmirsə, kompilyator avtomatik olaraq koda parametrsiz konstruktor əlavə edir;
  • Konstruktorun qaytarma növü yoxdur, hətta bir növ də ola bilməz ; əgər bir növ qaytarılırsa , sinif adı ilə üst-üstə düşməsinə baxmayaraq, o, artıq konstruktor deyil, metoddur.voidvoid
  • Konstruktorda operatora icazə verilir , lakin heç bir qaytarılma dəyəri olmadan yalnız boşdur;return
  • Konstruktor giriş modifikatorlarından istifadə etməyə imkan verir; siz dəyişdiricilərdən birini təyin edə bilərsiniz: , , və ya dəyişdiricisiz.publicprotectedprivate
  • Konstruktorda , , və ya dəyişdiriciləri ola bilməz ;abstractfinalnativestaticsynchronized
  • Açar söz eyni sinifdə olan başqa konstruktora aiddir. İstifadə edilərsə, ona çağırış konstruktorun birinci sətri olmalıdır;this
  • Açar söz ana sinifin konstruktorunu çağırır. İstifadə edilərsə, ona istinad konstruktorun birinci sətri olmalıdır;super
  • Əgər konstruktor əcdad sinfinin konstruktoruna (arqumentli və ya arqumentsiz) zəng etmirsə , kompilyator avtomatik olaraq əcdad sinfinin konstruktorunu arqumentsiz çağırmaq üçün kodu əlavə edir;super

Defolt konstruktor

İstənilən sinifdə konstruktor var. Siz yazmasanız belə, Java tərtibçisi standart konstruktor yaradacaq. Bu konstruktor boşdur və superclass konstruktorunu çağırmaqdan başqa heç nə etmir. Bunlar. yazsanız:
public class Example {}
onda bu yazmağa bərabərdir:
public class Example
{
     Example()
     {
          super;
     }
}
Bu halda, əcdad sinfi açıq şəkildə göstərilmir və standart olaraq bütün Java sinifləri sinfi miras alır, buna görə də sinif konstruktoru adlanır . Əgər sinif parametrləri olan konstruktoru müəyyən edirsə, lakin parametrləri olmayan həddən artıq yüklənmiş konstruktor yoxdursa, konstruktoru parametrsiz çağırmaq xətadır. Bununla belə, Java-da 1.5 versiyasından bəri dəyişən uzunluqlu arqumentləri olan konstruktorlardan istifadə etmək mümkündür. Dəyişən uzunluqlu arqumentə malik konstruktor varsa, defolt konstruktoru çağırmaq xəta olmayacaq. Dəyişən uzunluq arqumenti boş ola biləcəyi üçün olmayacaq. Məsələn, aşağıdakı nümunə tərtib edilməyəcək, lakin siz dəyişən uzunluq arqumenti ilə konstruktoru şərhdən çıxarsanız, o, uğurla tərtib edəcək və işləyəcək və nəticədə kod xətti işləyəcək ; konstruktor çağırılacaq . Təbii ki, bu halda JSDK 1.5-dən istifadə etmək lazımdır. FaylObjectObjectDefaultDemo dd = new DefaultDemo()DefaultDemo(int ... v)DefaultDemo.java
class DefaultDemo
{
 DefaultDemo(String s)
 {
  System.out.print("DefaultDemo(String)");
 }
 /*
 DefaultDemo(int ... v)
 {
  System.out.println("DefaultDemo(int ...)");
 }
 */

 public static void main(String args[])
 {
  DefaultDemo dd = new DefaultDemo();
 }
}
Konstruktorun şərh edilmədiyi proqram çıxışının nəticəsi:
DefaultDemo(int ...)
Bununla belə, sinifin ümumiyyətlə heç bir konstruktor təyin etmədiyi ümumi halda, standart konstruktoru (parametrlər olmadan) çağırmaq lazım olacaq, çünki standart konstruktorun dəyişdirilməsi avtomatik olaraq baş verir.

Obyektin yaradılması və konstruktorlar

Obyekt yaratarkən aşağıdakı hərəkətlər ardıcıl olaraq yerinə yetirilir:
  • Obyekt sinfi proqramda artıq istifadə olunan siniflər arasında axtarılır. Əgər orada deyilsə, o zaman proqramda mövcud olan bütün kataloqlarda və kitabxanalarda axtarılır. Bir qovluqda və ya kitabxanada sinif aşkar edildikdən sonra sinfin statik sahələri yaradılır və işə salınır. Bunlar. Hər bir sinif üçün statik sahələr yalnız bir dəfə işə salınır.
  • Obyekt üçün yaddaş ayrılır.
  • Sinif sahələri işə salınır.
  • Sinif konstruktoru icra edir.
  • Yaradılmış və işə salınmış obyektə keçid yaranır. Bu istinad obyekti yaradan ifadənin dəyəridir. Obyekt sinif metodunu çağırmaqla da yaradıla bilər . Bu halda parametr siyahısı olmayan konstruktordan istifadə edilir.newInstance()java.lang.Class

Konstruktorların həddindən artıq yüklənməsi

Eyni sinfin konstruktorları eyni ada və fərqli imzaya malik ola bilər. Bu xüsusiyyət birləşmə və ya həddindən artıq yükləmə adlanır. Bir sinifdə bir neçə konstruktor varsa, konstruktorun həddindən artıq yüklənməsi mövcuddur.

Parametrləşdirilmiş konstruktorlar

Konstruktorun imzası konstruktor parametrləri siyahısında parametrlərin sayı və növləri, habelə onların növlərinin ardıcıllığıdır. Qaytarma növü nəzərə alınmır. Konstruktor heç bir parametr qaytarmır. Bu bəyanat müəyyən mənada Java-nın həddən artıq yüklənmiş konstruktorlar və ya metodlar arasında necə fərqləndiyini izah edir. Java həddən artıq yüklənmiş metodları qaytarma növünə görə deyil, giriş parametrlərinin sayına, növlərinə və növlərinin ardıcıllığına görə fərqləndirir. Konstruktor hətta növü qaytara bilməz , əks halda o, sinif adına bənzəsə də, müntəzəm metoda çevriləcək. Aşağıdakı misal bunu nümayiş etdirir. FaylvoidVoidDemo.java
class VoidDemo
{
 /**
  * Это конструктор
  */
 VoidDemo()
 {
  System.out.println("Constructor");
 }

 /**
  * А это уже обычный метод, даже не смотря на сходство с
  * именем класса, поскольку имеется возвращаемый тип void
  */
 void VoidDemo()
 {
  System.out.println("Method");
 }

 public static void main(String s[])
 {
  VoidDemo m = new VoidDemo();
 }
}
Nəticədə, proqram çıxış edəcək:
Constructor
Bu bir daha sübut edir ki, konstruktor qaytarılma parametrləri olmayan metoddur. Bununla belə, konstruktora , və ya üç dəyişdiricidən biri verilə bilər . Və nümunə indi belə görünəcək: FaylpublicprivateprotectedVoidDemo2.java
class VoidDemo2
{
 /**
  * Это конструктор
  */
 public VoidDemo2()
 {
  System.out.println("Constructor");
 }

 /**
  * А это уже обычный метод, даже не смотря на сходство с
  * именем класса, поскольку имеется возвращаемый тип void
  */
 private void VoidDemo2()
 {
  System.out.println("Method");
 }

 public static void main(String s[])
 {
  VoidDemo2 m = new VoidDemo2();
 }
}
Konstruktorda operator yazmağa icazə verilir , lakin heç bir qaytarılma dəyəri olmadan yalnız boşdur. FaylreturnReturnDemo.java
class ReturnDemo
{
 /**
  * В конструкторе допускается использование оператора
  * return без параметров.
  */
 public ReturnDemo()
 {
  System.out.println("Constructor");
  return;
 }

 public static void main(String s[])
 {
  ReturnDemo r = new ReturnDemo();
 }
}

Dəyişən uzunluqlu arqumentlərlə parametrləşdirilmiş konstruktorlar

Java SDK 1.5 çoxdan gözlənilən aləti təqdim etdi - konstruktorlar və metodlar üçün dəyişən uzunluqlu arqumentlər. Əvvəllər dəyişən sayda sənədlər iki əlverişsiz üsulla işlənirdi. Onlardan birincisi, arqumentlərin maksimum sayının az sayda məhdudlaşdırılmasını və əvvəlcədən məlum olmasını təmin etmək üçün hazırlanmışdır. Bu halda, metoda ötürülən arqumentlər siyahısının hər bir versiyası üçün bir olmaqla, metodun həddindən artıq yüklənmiş versiyalarını yaratmaq mümkün idi. İkinci üsul əvvəlcədən bilinməyən bir şey və çoxlu arqumentlər üçün nəzərdə tutulmuşdur. Bu halda arqumentlər massivdə yerləşdirilir və bu massiv metoda ötürülürdü. Dəyişən uzunluqlu arqumentlər ən çox dəyişən başlanğıclarla sonrakı manipulyasiyalarda iştirak edir. Bəzi gözlənilən konstruktor və ya metod arqumentlərinin olmamasını standart dəyərlərlə əvəz etmək rahatdır. Dəyişən uzunluq arqumenti massivdir və massiv kimi qəbul edilir. Məsələn, dəyişən arqumentləri olan bir sinif üçün konstruktor belə görünəcək: Checking
class Checking
{
 public Checking(int ... n)
 {
 }
}
Simvol birləşməsi ... kompilyatora dəyişən sayda arqumentlərdən istifadə ediləcəyini və bu arqumentlərin istinad dəyəri n dəyişənində olan massivdə saxlanacağını bildirir. Konstruktor, heç bir arqument daxil olmaqla, müxtəlif sayda arqumentlərlə çağırıla bilər. Arqumentlər avtomatik olaraq massivdə yerləşdirilir və n-dən keçir. Arqumentlər yoxdursa, massivin uzunluğu 0-dır. Parametrlər siyahısına dəyişən uzunluqlu arqumentlərlə yanaşı məcburi parametrlər də daxil ola bilər. Bu halda, dəyişən sayda arqumentləri ehtiva edən parametr parametrlər siyahısında sonuncu olmalıdır. Misal üçün:
class Checking
{
 public Checking(String s, int ... n)
 {
 }
}
Çox açıq bir məhdudiyyət dəyişən uzunluq parametrlərinin sayına aiddir. Parametrlər siyahısında yalnız bir dəyişən uzunluqlu parametr olmalıdır. Dəyişən uzunluqlu iki parametr nəzərə alınmaqla, tərtibçinin bir parametrin harada bitdiyini və digərinin harada başladığını müəyyən etməsi mümkün deyil. Misal üçün:
class Checking
{
 public Checking(String s, int ... n, double ... d) //ОШИБКА!
 {
 }
}
Fayl Məsələn, avtomobillərin nömrə nişanlarını tanıyan və gün ərzində hər bir avtomobilin getdiyi ərazinin kvadratlarının nömrələrini yadda saxlaya bilən avadanlıq var. Qeydə alınmış avtomobillərin ümumi kütləsindən gün ərzində ərazinin xəritəsinə uyğun olaraq iki verilmiş kvadratı, məsələn, 22 və 15-i ziyarət edənləri seçmək lazımdır. Bir avtomobilin gün ərzində bir çox meydanı, bəlkə də yalnız birini ziyarət etməsi tamamilə təbiidir. Aydındır ki, ziyarət edilən meydanların sayı avtomobilin fiziki sürəti ilə məhdudlaşır. Gəlin kiçik bir proqram yaradaq ki, sinif konstruktoru arqument kimi avtomobil nömrəsini məcburi parametr kimi qəbul etsin və ərazinin ziyarət edilən kvadratlarının nömrələrini, sayı dəyişən ola bilər. Konstruktor avtomobilin iki kvadratda göründüyünü yoxlayacaq, əgər varsa, onun nömrəsini ekranda göstərin. Checking.java

Parametrlərin konstruktora ötürülməsi

Proqramlaşdırma dillərində əsasən iki növ parametr var:
  • əsas növlər (primitivlər);
  • obyektlərə istinadlar.
Dəyər üzrə çağırış termini konstruktorun çağıran modul tərəfindən ona ötürülən dəyəri alması deməkdir. Bunun əksinə olaraq, istinadla çağırış konstruktorun dəyişənin ünvanını zəng edəndən alması deməkdir. Java yalnız dəyər üzrə zəngdən istifadə edir. Parametr dəyəri və parametr bağlantı dəyəri ilə. Java obyektlər üçün istinadla çağırışdan istifadə etmir (baxmayaraq ki, bir çox proqramçılar və bəzi kitabların müəllifləri bunu iddia edirlər). Obyektləri Java-ya ötürərkən parametrlər istinadla deyil , obyekt istinadının dəyəri ilə ötürülür ! Hər iki halda konstruktor bütün parametrlərin qiymətlərinin surətlərini alır. Konstruktor giriş parametrləri ilə edə bilməz:
  • konstruktor əsas (ibtidai) növlərin giriş parametrlərinin dəyərlərini dəyişə bilməz;
  • konstruktor giriş parametrlərinin istinadlarını dəyişə bilməz;
  • konstruktor giriş parametrlərinin istinadlarını yeni obyektlərə yenidən təyin edə bilməz.
Konstruktor giriş parametrləri ilə edə bilər:
  • giriş parametri kimi ötürülən obyektin vəziyyətini dəyişdirin.
Aşağıdakı misal sübut edir ki, Java-da konstruktora giriş parametrləri obyekt istinad dəyəri ilə ötürülür. Bu misal həmçinin konstruktorun giriş parametrlərinin istinadlarını dəyişdirə bilməyəcəyini, lakin faktiki olaraq giriş parametrlərinin nüsxələrinin istinadlarını dəyişdirdiyini əks etdirir. FaylEmpoyee.java
class Employee
{
 Employee(String x, String y)
 {
  String temp = x;
  x = y;
  y = temp;
 }
 public static void main(String args[])
 {
  String name1 = new String("Alice");
  String name2 = new String("Mary");
  Employee a = new Employee(name1, name2);
  System.out.println("name1="+name1);
  System.out.println("name2="+name2);
 }
}
Proqramın çıxışı belədir:
name1=Alice
name2=Mary
Əgər Java obyektləri parametrlər kimi ötürmək üçün istinadla çağırışdan istifadə edərsə, konstruktor bu nümunədə və . Konstruktor əslində və dəyişənlərində saxlanılan obyekt istinadlarını dəyişdirməyəcək . Bu, konstruktor parametrlərinin bu istinadların surətləri ilə işə salındığını göstərir. Sonra konstruktor nüsxələri dəyişdirir. Konstruktor işini başa vurduqda, x və y dəyişənləri məhv edilir və orijinal dəyişənlər əvvəlki obyektlərə istinad etməyə davam edir .name1name2name1name2name1name2

Konstruktora ötürülən parametrlərin dəyişdirilməsi.

Konstruktor əsas növlərin ötürülən parametrlərini dəyişdirə bilməz. Bununla belə, konstruktor parametr kimi ötürülən obyektin vəziyyətini dəyişdirə bilər. Məsələn, aşağıdakı proqramı nəzərdən keçirin: FaylSalary1.java
class Salary1
{
 Salary1(int x)
 {
  x = x * 3;
  System.out.println("x="+x);
 }
 public static void main(String args[])
 {
  int value = 1000;
  Salary1 s1 = new Salary1(value);
  System.out.println("value="+value);
 }
}
Proqramın çıxışı belədir:
x=3000
value=1000
Aydındır ki, bu üsul əsas tip parametrini dəyişməyəcək. Buna görə də konstruktoru çağırdıqdan sonra dəyişənin qiyməti bərabər olaraq qalır . Əsasən üç şey olur: value1000
  1. Dəyişən parametr dəyərinin bir nüsxəsi (yəni, rəqəm ) ilə işə salınır.xvalue1000
  2. Dəyişənin dəyəri üç dəfə artır - indi -ə bərabərdir . Bununla belə, dəyişənin dəyəri bərabər olaraq qalır .x3000value1000
  3. Konstruktor fəaliyyətini dayandırır və dəyişən artıq istifadə edilmir.x
Aşağıdakı misalda, obyekt istinadının dəyəri metoda parametr kimi ötürüldüyü üçün işçinin maaşı uğurla üçqat artır. FaylSalary2.java
class Salary2
{
 int value = 1000;
 Salary2()
 {
 }
 Salary2(Salary2 x)
 {
  x.value = x.value * 3;
 }
 public static void main(String args[])
 {
  Salary2 s1 = new Salary2();
  Salary2 s2 = new Salary2(s1);
  System.out.println("s1.value=" +s1.value);
  System.out.println("s2.value="+s2.value);
 }
}
Proqramın çıxışı belədir:
s1.value=3000
s2.value=1000
Parametr kimi obyekt istinadının dəyəri istifadə olunur. Xətti icra edərkən ; konstruktor dəyişən obyektə istinadın dəyərini ötürəcək və konstruktor əmək haqqını effektiv şəkildə üç dəfə artıracaq , çünki hətta konstruktor daxilində yaradılmış nüsxə dəyişən obyektə işarə edir . Salary2 s2 = new Salary2(s1)Salary2(Salary x)s1s1.value(Salary x)s1

Primitivlərlə parametrləşdirilmiş konstruktorlar.

Həddindən artıq yüklənmiş konstruktorun parametrləri daraldıla bilən primitivdən istifadə edərsə (məsələn ), belə bir parametrlə həddən artıq yüklənmiş metodun olmamasına baxmayaraq, daralmış dəyəri olan metodu çağırmaq mümkündür. Məsələn: Faylint <- doublePrimitive.java
class Primitive
{
 Primitive(double d)
 {
  d = d + 10;
  System.out.println("d="+d);
 }
 public static void main(String args[])
 {
  int i = 20;
  Primitive s1 = new Primitive(i);
 }
}
Proqramın çıxışı belədir:
d=30.0
Sinifdə tip parametri olan konstruktorun olmamasına baxmayaraq , giriş parametri olan konstruktor işləyəcək . Konstruktoru çağırmazdan əvvəl dəyişən tipdən tipə genişləndiriləcək . Əks variant, dəyişən tipli olarsa və konstruktor yalnız parametrə malik olarsa , bu vəziyyətdə kompilyasiya xətasına səbəb olar. Primitiveintdoubleiintdoubleidoubleint

Konstruktor çağırışı və operatornew

Konstruktor həmişə operator tərəfindən çağırılır . Konstruktor operatoru ilə çağırıldıqda konstruktor həmişə yeni obyektə istinad yaradır. Konstruktoru yeni obyektə istinad əvəzinə artıq mövcud olan obyektə istinad yaratmağa məcbur etmək qeyri-mümkündür, seriyadan çıxarılan obyekti əvəz etmək istisna olmaqla. Və yeni operatorla yeni obyektə istinad əvəzinə artıq mövcud olan obyektə istinad yaratmaq mümkün deyil. Məsələn: FaylnewnewSalary3.java
class Salary3
{
 int value = 1000;
 Salary3()
 {
 }
 Salary3(Salary3 x)
 {
  x.value = x.value * 3;
 }
 public static void main(String args[])
 {
  Salary3 s1 = new Salary3();
  System.out.println("First object creation: "+s1.value);

  Salary3 s2 = new Salary3(s1);
  System.out.println("Second object creation: "+s2.value);
  System.out.println("What's happend with first object?:"+s1.value);

  Salary3 s3 = new Salary3(s1);
  System.out.println("Third object creation: "+s3.value);
  System.out.println("What's happend with first object?:"+s1.value);
 }
}
Proqramın çıxışı belədir:
First object creation: 1000
Second object creation: 1000
What's happend with first object?: 3000
Third object creation: 1000
What's happend with first object?: 9000
Birincisi, xətti istifadə edərək ; yeni obyekt yaradılır. Sonra, xətt istifadə edirsinizsə ; və ya simlər ; artıq mövcud olan obyektə keçid yaratmaq mümkün olardı, onda onlar eyni dəyəri saxlayacaqlar . Əslində cərgədə ; dəyişən üçün yeni obyekt yaradılacaq və onun istinad dəyərini konstruktor parametrində obyektə ötürməklə dəyişən üçün obyektin vəziyyəti dəyişəcək . Bunu çıxış nəticələri ilə yoxlamaq olar. Və xətti icra edərkən ; dəyişən üçün YENİ obyekt yaradılacaq və dəyişən üçün obyektin vəziyyəti yenidən dəyişəcək . Salary3 s1 = new Salary3()Salary3 s2 = new Salary3(s1)Salary3 s3 = new Salary3(s1)s1.value s2.values3.value1000Salary3 s2 = new Salary3(s1)s2s1Salary3 s3 = new Salary3(s1)s3s1

Konstruktorlar və inisializasiya blokları, konstruktoru çağırarkən hərəkətlərin ardıcıllığı

Obyektin yaradılması və konstruktorlar bölməsində obyekt yaratarkən yerinə yetirilən ümumi hərəkətlər sadalanır. Onların arasında sinif sahələrinin işə salınması və sinif konstruktorunun işlənməsi prosesləri var ki, bu da öz növbəsində daxili nizama malikdir:
  1. Bütün məlumat sahələri standart dəyərlərinə (0, yanlış və ya null) işə salınır.
  2. Bütün sahə başlatıcıları və başlanğıc blokları sinif bəyannaməsində sadalanan ardıcıllıqla yerinə yetirilir.
  3. Əgər konstruktorun birinci sətrində başqa konstruktor çağırılırsa, o zaman çağırılan konstruktor yerinə yetirilir.
  4. Konstruktorun gövdəsi icra olunur.
Konstruktor inisializasiya ilə bağlıdır, çünki Java-da sinifdə sahəni işə salmağın üç yolu var:
  • bəyannamədə qiymət təyin etmək;
  • başlatma blokunda dəyərlər təyin etmək;
  • onun dəyərini konstruktorda təyin edin.
Təbii ki, başlatma kodunu asan başa düşmək üçün təşkil etməlisiniz. Aşağıdakı sinif nümunə olaraq verilmişdir:
class Initialization
{
 int i;
 short z = 10;
 static int x;
 static float y;
 static
 {
  x = 2000;
  y = 3.141;
 }
 Initialization()
 {
  System.out.println("i="+i);
  System.out.println("z="+z);
  z = 20;
  System.out.println("z="+z);
 }
}
Yuxarıdakı misalda dəyişənlər aşağıdakı ardıcıllıqla işə salınır: statik dəyişənlər əvvəlcə standart dəyərlərlə işə salınır . Sonra, statik başlatma bloku icra olunur. Sonra dəyişən standart dəyərə işə salınır və dəyişən işə salınır . Sonra dizayner işə başlayır. Sinif konstruktorlarının çağırılması sahələrin elan olunma ardıcıllığından asılı olmamalıdır. Bu, səhvlərə səbəb ola bilər. xyiz

Konstruktorlar və miras

Konstruktorlar miras alınmır. Misal üçün:
public class Example
{
 Example()
 {
 }
 public void sayHi()
 {
  system.out.println("Hi");
 }
}

public class SubClass extends Example
{
}
Sinif avtomatik olaraq ana sinifdə müəyyən edilmiş SubClassmetodu miras alır . sayHi()Eyni zamanda, Example()ana sinifin konstruktoru onun nəsli tərəfindən miras alınmır SubClass.

thisKonstruktorlarda açar söz

thisKonstruktorlar eyni sinifdə olan, lakin fərqli parametrlər siyahısı ilə başqa konstruktora istinad etmək üçün istifadə olunur . Əgər konstruktor açar sözündən istifadə edirsə this, o, birinci sətirdə olmalıdır; bu qaydaya məhəl qoymamaq kompilyator xətası ilə nəticələnəcək. Məsələn: FaylThisDemo.java
public class ThisDemo
{
 String name;
 ThisDemo(String s)
 {
  name = s;
     System.out.println(name);
 }
 ThisDemo()
 {
  this("John");
 }
 public static void main(String args[])
 {
  ThisDemo td1 = new ThisDemo("Mary");
  ThisDemo td2 = new ThisDemo();
 }
}
Proqramın çıxışı belədir:
Mary
John
Bu nümunədə iki konstruktor var. Birincisi simli arqument alır. İkincisi heç bir arqument qəbul etmir, sadəcə olaraq ilk konstruktoru "John" adından istifadə edərək çağırır. Beləliklə, proqramlarda tez-tez lazım olan sahə dəyərlərini açıq şəkildə və standart olaraq başlatmaq üçün konstruktorlardan istifadə edə bilərsiniz.

superKonstruktorlarda açar söz

superKonstruktorlar superclass konstruktorunu çağırmaq üçün istifadə olunur . Əgər konstruktor istifadə edirsə super, onda bu çağırış birinci sətirdə olmalıdır, əks halda kompilyator xəta atacaq. Aşağıda bir nümunə var: FaylSuperClassDemo.java
public class SuperClassDemo
{
 SuperClassDemo()
 {
 }
}

class Child extends SuperClassDemo
{
 Child()
 {
  super();
 }
}
Bu sadə nümunədə konstruktor sinifdən əlavə sinif nümunəsini yaradan Child()çağırışı ehtiva edir . Bu, alt sinif konstruktorunda icra edilən ilk ifadə olmalıdır, çünki bu sıra həmişə eynidir və olub-olmamasından asılı deyil . İstifadə edilmirsə, onda ilk növbədə əsas sinifdən başlayaraq hər bir superklassın standart (parametrləri yoxdur) konstruktoru yerinə yetiriləcək. Aşağıdakı proqram konstruktorların nə vaxt icra olunduğunu nümayiş etdirir. Faylsuper()SuperClassDemoChildsupersuper()Call.java
//Создать суперкласс A
class A
{
 A()
 {
  System.out.println("Inside A constructor.");
 }
}

//Создать подкласс B, расширяющий класс A
class B extends A
{
 B()
 {
  System.out.println("Inside B constructor.");
 }
}

//Создать класс (C), расширяющий класс В
class C extends B
{
 C()
 {
  System.out.println("Inside C constructor.");
 }
}

class Call
{
 public static void main(String args[])
 {
  C c = new C();
 }
}
Bu proqramdan çıxış:
Inside A constructor.
Inside B constructor.
Inside C constructor.
Konstruktorlar sinfin tabeliyinə görə çağırılır. Bu, müəyyən məna kəsb edir. Supersinifin heç bir alt sinif haqqında məlumatı olmadığı üçün onun yerinə yetirməsi lazım olan hər hansı başlatma ayrıdır. Mümkünsə, o, alt sinif tərəfindən həyata keçirilən hər hansı başlatmadan əvvəl olmalıdır. Ona görə də ilk növbədə bunu etmək lazımdır.

Fərdiləşdirilə bilən konstruktorlar

İş vaxtı növünün identifikasiyası mexanizmi polimorfizmi həyata keçirən Java dilinin güclü əsas prinsiplərindən biridir. Bununla belə, belə bir mexanizm bəzi hallarda tərtibatçını uyğun olmayan tipli dökümdən qorumur. Ən çox rast gəlinən hal, müxtəlif növləri əvvəlcədən bilinməyən və iş vaxtında müəyyən edilən bir qrup obyektin manipulyasiyasıdır. Tip uyğunsuzluğu ilə bağlı səhvlər yalnız iş vaxtı mərhələsində görünə bildiyindən, bu, onların tapılmasını və aradan qaldırılmasını çətinləşdirir. Java 2 5.0-də xüsusi növlərin tətbiqi bu səhvlərin bəzilərini iş vaxtından tərtib müddətinə köçürür və çatışmayan növ təhlükəsizliyin bəzilərini təmin edir. Tipdən konkret tipə keçərkən açıq tip tökməyə ehtiyac yoxdur . Nəzərə almaq lazımdır ki, tip fərdiləşdirmə vasitələri yalnız obyektlərlə işləyir və sinif miras ağacından kənarda yerləşən primitiv məlumat tiplərinə şamil edilmir. Fərdi növlərlə bütün çəkilişlər avtomatik və pərdə arxasında yerinə yetirilir. Bu, tip uyğunsuzluğundan qorunmağa və kodu daha tez-tez təkrar istifadə etməyə imkan verir. Fərdi növlər konstruktorlarda istifadə edilə bilər. Konstruktorlar, hətta sinifləri fərdi tip olmasa belə, fərdi ola bilər. Misal üçün: Object
class GenConstructor
{
 private double val;
 <T extends Number> GenConstructor(T arg)
 {
   val = arg.doubleValue();
 }

 void printValue()
 {
  System.out.println("val: "+val);
 }
}

class GenConstructorDemo
{
 public static void main(String args[])
 {
  GenConstructor gc1 = new GenConstructor(100);
  GenConstructor gc2 = new GenConstructor(123.5F);

  gc1.printValue();
  gc2.printValue();
 }
}
Konstruktor sinifdən törəmə sinif olmalı olan fərdi tip parametrini təyin etdiyi üçün onu istənilən sinifdən çağırmaq olar. GenConstructorNumber
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION