Конструкторлар туралы жалпы мәліметтер
Конструктор
әдіске ұқсас құрылым болып табылады, оның мақсаты класс данасын жасау болып табылады. Дизайнердің ерекшеліктері:
- Конструктордың аты сынып атауына сәйкес болуы керек (шарт бойынша бірінші әріп бас әріппен жазылады, әдетте зат есім);
- Кез келген сыныпта конструктор бар. Сіз жазбасаңыз да, 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)");
}
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 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");
}
private void VoidDemo2()
{
System.out.println("Method");
}
public static void main(String s[])
{
VoidDemo2 m = new VoidDemo2();
}
}
Операторды конструкторда жазуға рұқсат етіледі
return
, бірақ тек бос, ешқандай қайтару мәні жоқ. Файл
ReturnDemo.java
class ReturnDemo
{
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
. Негізінде үш нәрсе болады:
- Айнымалы мән
x
параметр мәнінің көшірмесімен value
(яғни сан 1000
) инициализацияланады.
- Айнымалының мәні
x
үш есе өсті - ол енді -ге тең 3000
. Дегенмен, айнымалының мәні value
тең болып қалады 1000
.
- Конструктор аяқталады және айнымалы
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
кеңейтіледі . Қарама-қарсы опция, айнымалы типті болғанда және конструктор тек параметрге ие болса , бұл жағдайда компиляция қатесіне әкеледі.
int
double
i
double
int
Конструкторды шақыру және оператор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 құру кезінде орындалатын жалпы әрекеттер тізімі берілген. Олардың ішінде класс өрістерін инициализациялау және класс конструкторын өңдеу процестері бар, олар өз кезегінде ішкі тәртіпке ие:
- Барлық деректер өрістері әдепкі мәндеріне (0, жалған немесе нөл) инициализацияланады.
- Барлық өріс инициализаторлары мен инициализация блоктары сынып декларациясында көрсетілген ретпен орындалады.
- Егер конструктордың бірінші жолында басқа конструктор шақырылса, онда шақырылған конструктор орындалады.
- Конструктордың денесі орындалады.
Конструктор инициализациямен байланысты, себебі 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()
SuperClassDemo
Child
super
super()
Call.java
class A
{
A()
{
System.out.println("Inside A constructor.");
}
}
class B extends A
{
B()
{
System.out.println("Inside B constructor.");
}
}
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
, оны кез келгеннен шақыруға болады.
GO TO FULL VERSION