JavaRush /Java блогы /Random-KK /Класс конструкторлары. Java JDK 1.5
articles
Деңгей

Класс конструкторлары. Java JDK 1.5

Топта жарияланған
Класс конструкторлары.  Java JDK 1.5 - 1

Конструкторлар туралы жалпы мәліметтер

Конструкторәдіске ұқсас құрылым болып табылады, оның мақсаты класс данасын жасау болып табылады. Дизайнердің ерекшеліктері:
  • Конструктордың аты сынып атауына сәйкес болуы керек (шарт бойынша бірінші әріп бас әріппен жазылады, әдетте зат есім);
  • Кез келген сыныпта конструктор бар. Сіз жазбасаңыз да, Java компиляторы әдепкі конструктор жасайды, ол бос болады және суперкласс конструкторын шақырудан басқа ештеңе істемейді.
  • Конструктор әдіске ұқсас, бірақ ол әдіс емес, ол тіпті сыныптың мүшесі болып саналмайды. Сондықтан оны ішкі сыныпта мұраға алуға немесе қайта анықтауға болмайды;
  • Конструкторлар мұраға берілмейді;
  • Бір сыныпта бірнеше конструктор болуы мүмкін. Бұл жағдайда конструкторлар шамадан тыс жүктелген деп айтылады;
  • Егер сынып конструкторды анықтамаса, компилятор codeқа автоматты түрде параметрсіз конструкторды қосады;
  • Конструкторда қайтару түрі жоқ; ол тіпті тип бола алмайды void; егер тип қайтарылса void, сынып атауымен сәйкестігіне қарамастан, ол енді конструктор емес, әдіс болып табылады.
  • Оператор конструкторда рұқсат етілген return, бірақ тек бос, ешқандай қайтару мәні жоқ;
  • Конструктор қатынас модификаторларын пайдалануға мүмкіндік береді, модификаторлардың бірін орнатуға болады: public, protected, privateнемесе модификаторсыз.
  • Конструкторда abstract, final, nativeнемесе модификаторлары болуы мүмкін staticемес synchronized;
  • Кілт сөз thisсол сыныптағы басқа конструкторға сілтеме жасайды. Егер пайдаланылса, оған шақыру конструктордың бірінші жолы болуы керек;
  • Түйінді сөз superата-аналық сыныптың конструкторын шақырады. Егер пайдаланылса, оған сілтеме конструктордың бірінші жолы болуы керек;
  • Егер конструктор аталық сыныптың конструкторына (аргументтермен немесе аргументсіз) қоңырау шалмаса super, компилятор аргументсіз аталық сыныптың конструкторын шақыру үшін codeты автоматты түрде қосады;

Әдепкі конструктор

Кез келген сыныпта конструктор бар. Сіз жазбасаңыз да, Java компиляторы әдепкі конструктор жасайды. Бұл конструктор бос және суперкласс конструкторын шақырудан басқа ештеңе істемейді. Анау. жазсаңыз:
public class Example {}
онда бұл жазуға тең:
public class Example
{
     Example()
     {
          super;
     }
}
Бұл жағдайда ата-баба класы анық көрсетілмейді және әдепкі бойынша барлық Java сыныптары классты мұра етеді, Objectсондықтан класс конструкторы деп аталады Object. Егер сынып конструкторды параметрлері бар анықтаса, бірақ параметрлері жоқ шамадан тыс жүктелген конструктор болмаса, конструкторды параметрлерсіз шақыру қате болып табылады. Дегенмен, Java-да 1.5 нұсқасынан бастап айнымалы ұзындық аргументтері бар конструкторларды пайдалануға болады. Ал егер айнымалы ұзындық аргументі бар конструктор болса, әдепкі конструкторды шақыру қате болмайды. Бұл айнымалы ұзындық аргументі бос болуы мүмкін болғандықтан болмайды. Мысалы, келесі мысал компиляцияланбайды, бірақ конструкторды айнымалы ұзындық аргументі арқылы алып тастасаңыз, ол сәтті компиляцияланады және іске қосылады және нәтижелі code жолының іске қосылуы DefaultDemo dd = new DefaultDemo(); конструктор шақырылады DefaultDemo(int ... v). Әрине, бұл жағдайда JSDK 1.5 пайдалану қажет. Файл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();
 }
}
Түсініктемесіз конструктормен бағдарламаның нәтижесі:
DefaultDemo(int ...)
Дегенмен, класс ешқандай конструкторды анықтамайтын жалпы жағдайда әдепкі конструкторды шақыру (параметрлерсіз) қажет болады, себебі әдепкі конструкторды ауыстыру автоматты түрде жүреді.

Объектіні құру және конструкторлар

Объектіні құру кезінде келесі әрекеттер ретімен орындалады:
  • Нысан класы бағдарламада бұрыннан қолданылған сыныптар арасында ізделеді. Егер ол жоқ болса, онда ол бағдарламаға қол жетімді барлық каталогтар мен кітапханаларда ізделеді. Класс каталогта немесе кітапханада табылғаннан кейін сыныптың статикалық өрістері жасалады және инициализацияланады. Анау. Әрбір сынып үшін статикалық өрістер тек бір рет инициализацияланады.
  • Жад an object үшін бөлінген.
  • Сынып өрістері инициализациялануда.
  • Класс конструкторы орындайды.
  • Құрылған және инициализацияланған нысанға сілтеме қалыптасады. Бұл сілтеме нысанды жасайтын өрнектің мәні болып табылады. Объектіні newInstance()класс әдісін шақыру арқылы да жасауға болады java.lang.Class. Бұл жағдайда параметрлер тізімі жоқ конструктор қолданылады.

Конструкторларды шамадан тыс жүктеу

Бір кластағы конструкторлардың аты бірдей және әртүрлі қолтаңбасы болуы мүмкін. Бұл қасиет комбинация немесе шамадан тыс жүктелу деп аталады. Егер сыныпта бірнеше конструктор болса, конструктордың шамадан тыс жүктелуі орын алады.

Параметрленген конструкторлар

Конструктордың қолтаңбасы - бұл параметрлердің саны мен түрлері, сонымен қатар конструктор параметрлері тізіміндегі олардың түрлерінің реттілігі. Қайтару түрі ескерілмейді. Конструктор ешбір параметрді қайтармайды. Бұл мәлімдеме белгілі бір мағынада Java шамадан тыс жүктелген конструкторларды немесе әдістерді қалай ажырататынын түсіндіреді. Java шамадан тыс жүктелген әдістерді қайтару түрі бойынша емес, енгізу параметрлерінің түрлерінің саны, түрлері және реттілігі бойынша ажыратады. Конструктор тіпті түрін қайтара алмайды void, әйтпесе ол сынып атауына ұқсас болса да, әдеттегі әдіске айналады. Келесі мысал мұны көрсетеді. ФайлVoidDemo.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();
 }
}
Нәтижесінде бағдарлама мыналарды шығарады:
Constructor
Бұл конструктор қайтару параметрлері жоқ әдіс екенін тағы бір рет дәлелдейді. Дегенмен, конструкторға public, privateнемесе үш модификатордың бірін беруге болады protected. Енді мысал келесідей болады: ФайлVoidDemo2.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();
 }
}
Операторды конструкторда жазуға рұқсат етіледі return, бірақ тек бос, ешқандай қайтару мәні жоқ. ФайлReturnDemo.java
class ReturnDemo
{
 /**
  * В конструкторе допускается использование оператора
  * return без параметров.
  */
 public ReturnDemo()
 {
  System.out.println("Constructor");
  return;
 }

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

Айнымалы ұзындық аргументтерімен параметрленген конструкторлар

Java SDK 1.5 көптен күткен құралды – конструкторлар мен әдістерге арналған айнымалы ұзындықтағы аргументтерді ұсынды. Бұрын құжаттардың ауыспалы саны екі қолайсыз жолмен өңделетін. Олардың біріншісі аргументтердің максималды саны аз санмен шектеліп, алдын ала белгілі болуын қамтамасыз ету үшін жасалған. Бұл жағдайда әдістің шамадан тыс жүктелген нұсқаларын, әдіске берілген аргументтер тізімінің әрбір нұсқасы үшін біреуін жасауға болады. Екінші әдіс алдын ала белгісіз нәрсеге және көптеген дәлелдерге арналған. Бұл жағдайда аргументтер массивке орналастырылды және бұл массив әдіске жіберілді. Айнымалы ұзындық аргументтері көбінесе айнымалы инициализациялары бар кейінгі манипуляцияларға қатысады. Кейбір күтілетін конструктор немесе әдіс аргументтерінің жоқтығын әдепкі мәндермен ауыстыру ыңғайлы. Айнымалы ұзындық аргументі массив болып табылады және массив ретінде қарастырылады. Мысалы, аргументтер саны айнымалы сыныптың конструкторы Checkingкелесідей болады:
class Checking
{
 public Checking(int ... n)
 {
 }
}
Таңбалар комбинациясы ... компиляторға аргументтердің айнымалы саны пайдаланылатынын және бұл аргументтер сілтеме мәні n айнымалысында қамтылған массивте сақталатынын айтады. Конструкторды аргументтердің әртүрлі санымен шақыруға болады, соның ішінде ешқандай дәлелдер жоқ. Аргументтер автоматты түрде массивке орналастырылады және n арқылы өтеді. Аргументтер болмаса, массив ұзындығы 0 болады. Параметрлер тізімі айнымалы ұзындық аргументтерімен бірге міндетті параметрлерді де қамтуы мүмкін. Бұл жағдайда аргументтердің айнымалы санын қамтитын параметр параметрлер тізімінде соңғы болуы керек. Мысалы:
class Checking
{
 public Checking(String s, int ... n)
 {
 }
}
Өте айқын шектеу айнымалы ұзындық параметрлерінің санына қатысты. Параметрлер тізімінде тек бір айнымалы ұзындық параметрі болуы керек. Айнымалы ұзындықтың екі параметрін ескере отырып, компилятор бір параметр аяқталып, екіншісі қай жерде басталатынын анықтау мүмкін емес. Мысалы:
class Checking
{
 public Checking(String s, int ... n, double ... d) //ОШИБКА!
 {
 }
}
Файл Checking.java Мысалы, автокөліктердің нөмірлерін танитын және күндізгі уақытта көліктердің әрқайсысы барған аумақтың квадраттарының нөмірлерін есте сақтай алатын жабдық бар. Тіркелген көліктердің жалпы массасынан аудан картасына сәйкес бір тәулік ішінде берілген екі алаңға, айталық 22 және 15-ке барғандарды таңдау керек. Автокөліктің күндізгі уақытта көптеген алаңдарды аралайтыны, немесе тек біреуі болуы әбден мүмкін. Әлбетте, баратын шаршылардың саны автокөліктің физикалық жылдамдығымен шектеледі. Класс конструкторы аргументтер ретінде міндетті параметр ретінде автокөлік нөмірін және саны айнымалы болуы мүмкін аумақтың барылған квадраттарының сандарын алатын шағын бағдарламаны құрайық. Конструктор көліктің екі шаршыда пайда болғанын тексереді, егер бар болса, экранда оның нөмірін көрсетеді.

Параметрлерді конструкторға беру

Бағдарламалау тілдерінде параметрлердің негізінен екі түрі бар:
  • негізгі типтер (примитивтер);
  • an objectілерге сілтемелер.
Мән бойынша шақыру термині конструктор шақырушы модуль арқылы оған берілген мәнді алатынын білдіреді. Керісінше, сілтеме арқылы шақыру конструктордың шақырушыдан айнымалының мекенжайын алатынын білдіреді. Java тек мән бойынша қоңырауды пайдаланады. Параметр мәні бойынша және параметр сілтеме мәні бойынша. Java нысандар үшін сілтеме арқылы қоңырауды пайдаланбайды (бірақ көптеген бағдарламашылар мен кейбір кітаптардың авторлары мұны мәлімдейді). Нысандарды Java-ға беру кезінде параметрлер сілтеме бойынша емес , нысан сілтемесінің мәні бойынша беріледі ! Кез келген жағдайда конструктор барлық параметрлер мәндерінің көшірмелерін алады. Конструктор өзінің енгізу параметрлерімен жасай алмайды:
  • конструктор негізгі (қарапайым) типтердің кіріс параметрлерінің мәндерін өзгерте алмайды;
  • конструктор енгізу параметрінің сілтемелерін өзгерте алмайды;
  • конструктор енгізу параметрінің сілтемелерін жаңа нысандарға қайта тағайындай алмайды.
Конструктор өзінің енгізу параметрлерімен жасай алады:
  • енгізу параметрі ретінде берілген нысанның күйін өзгерту.
Келесі мысал Java тілінде конструкторға енгізу параметрлері нысан сілтеме мәні арқылы берілетінін дәлелдейді. Бұл мысал сонымен қатар конструктор енгізу параметрлерінің сілтемелерін өзгерте алмайтынын, бірақ енгізу параметрлерінің көшірмелерінің сілтемелерін нақты өзгертетінін көрсетеді. ФайлEmpoyee.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);
 }
}
Бағдарламаның нәтижесі:
name1=Alice
name2=Mary
name1Егер Java нысанды параметр ретінде беру үшін сілтеме бойынша шақыруды пайдаланса, конструктор осы мысалда және ауыстырады name2. name1Конструктор және айнымалы мәндерінде сақталған нысан сілтемелерін іс жүзінде ауыстырмайды name2. Бұл конструктор параметрлері осы сілтемелердің көшірмелерімен инициализацияланғанын көрсетеді. Содан кейін конструктор көшірмелерді ауыстырады. Конструктор өз жұмысын аяқтағанда, x және y айнымалылары жойылады, ал бастапқы айнымалылар алдыңғы нысандарға сілтеме жасай name1береді .name2

Конструкторға берілген параметрлерді өзгерту.

Конструктор негізгі түрлердің берілген параметрлерін өзгерте алмайды. Дегенмен, конструктор параметр ретінде берілген нысанның күйін өзгерте алады. Мысалы, келесі бағдарламаны қарастырыңыз: ФайлSalary1.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);
 }
}
Бағдарламаның нәтижесі:
x=3000
value=1000
Бұл әдіс негізгі түр параметрін өзгертпейтіні анық. Сондықтан конструкторды шақырғаннан кейін айнымалының мәні valueтең болып қалады 1000. Негізінде үш нәрсе болады:
  1. Айнымалы мән xпараметр мәнінің көшірмесімен value(яғни сан 1000) инициализацияланады.
  2. Айнымалының мәні xүш есе өсті - ол енді -ге тең 3000. Дегенмен, айнымалының мәні valueтең болып қалады 1000.
  3. Конструктор аяқталады және айнымалы xенді пайдаланылмайды.
Келесі мысалда қызметкердің жалақысы сәтті үш еселенді, себебі нысан сілтемесінің мәні әдіске параметр ретінде жіберіледі. ФайлSalary2.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);
 }
}
Бағдарламаның нәтижесі:
s1.value=3000
s2.value=1000
Нысан сілтемесінің мәні параметр ретінде пайдаланылады. Жолды орындау кезінде Salary2 s2 = new Salary2(s1); конструкторға Salary2(Salary x)айнымалы нысанға сілтеме мәні беріледі s1, ал конструктор жалақыны тиімді үш есеге арттырады , өйткені конструктор ішінде жасалған s1.valueкөшірме айнымалы нысанға нұсқайды . (Salary x)s1

Примитивтермен параметрленген конструкторлар.

Егер шамадан тыс жүктелген конструктордың параметрлері тарылуға болатын примитивті пайдаланса (мысалы int <- double), онда мұндай параметрмен шамадан тыс жүктелген әдіс жоқтығына қарамастан, тарылтылған мәнмен әдісті шақыру мүмкін. Мысалы: ФайлPrimitive.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);
 }
}
Бағдарламаның нәтижесі:
d=30.0
PrimitiveСыныпта типті параметрі бар конструктор жоқ болғанына қарамастан int, кіріс параметрі бар конструктор жұмыс істейді double. Конструкторды шақырмас бұрын, айнымалы түрден түрге дейін iкеңейтіледі . Қарама-қарсы опция, айнымалы типті болғанда және конструктор тек параметрге ие болса , бұл жағдайда компиляция қатесіне әкеледі. intdoubleidoubleint

Конструкторды шақыру және операторnew

Конструкторды әрқашан оператор шақырады new. Конструктор оператормен шақырылғанда new, конструктор әрқашан жаңа нысанға сілтеме жасайды. Конструкторды жаңа нысанға сілтеменің орнына бұрыннан бар нысанға сілтемені құруға мәжбүрлеу мүмкін емес, сериядан шығарылатын нысанды ауыстыруды қоспағанда. Ал жаңа оператормен жаңа нысанға сілтеменің орнына бұрыннан бар нысанға сілтеме жасау мүмкін емес. Мысалы: ФайлSalary3.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);
 }
}
Бағдарламаның нәтижесі:
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
Біріншіден, сызықты пайдалану Salary3 s1 = new Salary3(); жаңа нысан жасалады. Әрі қарай, жолды пайдалансаңыз Salary3 s2 = new Salary3(s1); немесе жолдар Salary3 s3 = new Salary3(s1); бұрыннан бар нысанға сілтеме жасауға болады, содан кейін s1.value s2.valueолар s3.valueбірдей мәнді сақтайды 1000. Іс жүзінде қатарда Salary3 s2 = new Salary3(s1); айнымалы үшін жаңа нысан жасалады және конструктор параметріндегі нысанға оның сілтеме мәнін беру арқылы s2айнымалыға арналған нысанның күйі өзгереді . s1Мұны шығыс нәтижелері арқылы тексеруге болады. Және сызықты орындау кезінде Salary3 s3 = new Salary3(s1); айнымалы үшін ЖАҢА нысан жасалады s3және айнымалыға арналған нысанның күйі қайтадан өзгереді s1.

Конструкторлар және инициализация блоктары, конструкторды шақыру кезіндегі әрекеттер тізбегі

Объектіні және конструкторларды құру бөлімінде an object құру кезінде орындалатын жалпы әрекеттер тізімі берілген. Олардың ішінде класс өрістерін инициализациялау және класс конструкторын өңдеу процестері бар, олар өз кезегінде ішкі тәртіпке ие:
  1. Барлық деректер өрістері әдепкі мәндеріне (0, жалған немесе нөл) инициализацияланады.
  2. Барлық өріс инициализаторлары мен инициализация блоктары сынып декларациясында көрсетілген ретпен орындалады.
  3. Егер конструктордың бірінші жолында басқа конструктор шақырылса, онда шақырылған конструктор орындалады.
  4. Конструктордың денесі орындалады.
Конструктор инициализациямен байланысты, себебі Java-да сыныптағы өрісті инициализациялаудың үш жолы бар:
  • декларацияда мән беру;
  • инициализация блогында мәндерді тағайындау;
  • оның мәнін конструкторда орнатыңыз.
Әрине, инициализация codeын түсіну оңай болатындай етіп ұйымдастыру керек. Мысал ретінде келесі класс берілген:
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);
 }
}
Жоғарыдағы мысалда айнымалылар келесі ретпен инициализацияланады: статикалық айнымалылар алдымен әдепкі xмәндермен инициализацияланады y. Содан кейін статикалық инициализация блогы орындалады. Содан кейін айнымалы iәдепкі мәнге инициализацияланады және айнымалы инициализацияланады z. Содан кейін дизайнер жұмысқа кіріседі. Класс конструкторларын шақыру өрістердің жариялану ретіне байланысты болмауы керек. Бұл қателерге әкелуі мүмкін.

Конструкторлар және мұрагерлік

Конструкторлар мұраға берілмейді. Мысалы:
public class Example
{
 Example()
 {
 }
 public void sayHi()
 {
  system.out.println("Hi");
 }
}

public class SubClass extends Example
{
}
Класс ата-аналық сыныпта анықталған SubClassәдісті автоматты түрде иеленеді . sayHi()Сонымен қатар, Example()ата-аналық сыныптың конструкторы оның ұрпағына мұраланбайды SubClass.

thisКонструкторлардағы түйінді сөз

thisКонструкторлар бір сыныптағы, бірақ басқа параметрлер тізімі бар басқа конструкторға сілтеме жасау үшін қолданылады . Егер конструктор кілт сөзін пайдаланса this, ол бірінші жолда болуы керек; бұл ережені елемеу компилятор қатесіне әкеледі. Мысалы: ФайлThisDemo.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();
 }
}
Бағдарламаның нәтижесі:
Mary
John
Бұл мысалда екі конструктор бар. Біріншісі жол аргументін алады. Екіншісі ешқандай аргументтерді қабылдамайды, ол жай ғана әдепкі «Джон» атауын пайдаланып бірінші конструкторды шақырады. Осылайша, конструкторларды өріс мәндерін анық және әдепкі бойынша инициализациялау үшін пайдалануға болады, бұл бағдарламаларда жиі қажет.

superКонструкторлардағы түйінді сөз

superКонструкторлар суперкласс конструкторын шақыру үшін қолданылады . Егер конструктор қолданса super, онда бұл шақыру бірінші жолда болуы керек, әйтпесе компилятор қате жібереді. Төменде мысал келтірілген: ФайлSuperClassDemo.java
public class SuperClassDemo
{
 SuperClassDemo()
 {
 }
}

class Child extends SuperClassDemo
{
 Child()
 {
  super();
 }
}
Бұл қарапайым мысалда конструктор сыныптан басқа сынып данасын жасайтын Child()шақыруды қамтиды . Өйткені ол ішкі класс конструкторында орындалатын бірінші оператор болуы керек, бұл реттілік әрқашан бірдей және -ге тәуелді емес . Егер ол пайдаланылмаса, алдымен негізгі сыныптан бастап әрбір суперкласстың әдепкі (параметрлері жоқ) конструкторы орындалады. Келесі бағдарлама конструкторлардың қашан орындалатынын көрсетеді. Файлsuper()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();
 }
}
Осы бағдарламаның нәтижесі:
Inside A constructor.
Inside B constructor.
Inside C constructor.
Конструкторлар класс бағыну ретімен шақырылады. Бұл біраз мағына береді. Суперсыныптың қандай да бір ішкі сынып туралы білімі болмағандықтан, оны орындау қажет кез келген инициализация бөлек. Мүмкін болса, ол ішкі сынып орындайтын кез келген инициализациядан бұрын болуы керек. Сондықтан алдымен мұны істеу керек.

Реттелетін конструкторлар

Орындалу уақыты түрін анықтау механизмі полиморфизмді жүзеге асыратын Java тілінің қуатты негізгі принциптерінің бірі болып табылады. Дегенмен, мұндай механизм кейбір жағдайларда әзірлеушіні үйлеспейтін типті кастингтен қорғамайды. Ең жиі кездесетін жағдай - әртүрлі типтері алдын ала белгісіз және орындалу уақытында анықталатын an objectілер тобының манипуляциясы. Түрдің үйлесімсіздігімен байланысты қателер тек орындау уақыты сатысында пайда болуы мүмкін болғандықтан, бұл оларды табуды және жоюды қиындатады. Java 2 5.0 жүйесінде реттелетін түрлерді енгізу осы қателердің кейбірін орындау уақытынан компиляция уақытына жылжытады және кейбір жетіспейтін түр қауіпсіздігін қамтамасыз етеді. ObjectТүрден нақты түрге көшу кезінде нақты типті құюдың қажеті жоқ . Түрді теңшеу құралдары тек нысандармен жұмыс істейтінін және класс мұрагерлік тармағынан тыс орналасқан қарапайым деректер түрлеріне қолданылмайтынын есте ұстаған жөн. Пайдаланушы түрлерімен барлық трансляциялар автоматты түрде және сахна артында орындалады. Бұл түр сәйкессіздіктерінен қорғауға және codeты жиірек пайдалануға мүмкіндік береді. Конструкторларда теңшелетін типтерді қолдануға болады. Класс теңшелетін түрі болмаса да, конструкторлар реттелетін болуы мүмкін. Мысалы:
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();
 }
}
Конструктор GenConstructorкласстан алынған класс болуы керек теңшелетін түр параметрін көрсеткендіктен Number, оны кез келгеннен шақыруға болады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION