JavaRush /Блоги Java /Random-TG /Созандагони синф. 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 аз versionи 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 ва конструкторҳо

Ҳангоми сохтани an object амалҳои зерин пайдарпай иҷро карда мешаванд:
  • Синфи an object дар байни синфҳои аллакай дар барнома истифодашуда ҷустуҷӯ карда мешавад. Агар он вуҷуд надошта бошад, пас он дар ҳама каталогҳо ва китобхонаҳои барои барнома дастрас ҷустуҷӯ карда мешавад. Вақте ки синф дар феҳрист ё китобхона пайдо мешавад, майдонҳои статикии синф эҷод ва оғоз карда мешаванд. Онхое. Барои ҳар як синф, майдонҳои статикӣ танҳо як маротиба оғоз карда мешаванд.
  • Хотира барои an object ҷудо карда шудааст.
  • Майдонҳои синф оғоз карда мешаванд.
  • Созандаи синф иҷро мекунад.
  • Пайванд ба an objectи сохташуда ва ибтидоӣ ташкил карда мешавад. Ин истинод арзиши ифодаест, ки an objectро месозад. Объектро инчунин тавассути даъват кардани усули newInstance()синф сохтан мумкин аст java.lang.Class. Дар ин ҳолат конструктор бе рӯйхати параметрҳо истифода мешавад.

Аз ҳад зиёд боркунии конструкторҳо

Конструкторҳои як синф метавонанд як ном ва имзои гуногун дошта бошанд. Ин хосият комбинатсияи ё изофабор номида мешавад. Агар синф якчанд конструктор дошта бошад, пас аз ҳад зиёди конструктор мавҷуд аст.

Конструкторҳои параметрӣ

Имзои конструктор адад ва намудхои параметрхо, инчунин пайдарпайии намудхои онхо дар руйхати параметрхои конструктор мебошад. Навъи бозгашт ба назар гирифта намешавад. Конструктор ягон параметрро барнамегардонад. Ин изҳорот ба як маъно мефаҳмонад, ки чӣ гуна Java байни конструкторҳо ё усулҳои изофабор фарқ мекунад. Java усулҳои изофаборро на аз рӯи намуди бозгашташон, балки аз рӯи адад, намудҳо ва пайдарпайии намудҳои параметрҳои воридотӣ фарқ мекунад. Конструктор ҳатто наметавонад type -ро баргардонад 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 як воситаи деринтизор - далелҳои дарозии тағирёбанда барои конструкторҳо ва усулҳоро муаррифӣ кард. Пештар шумораи тағйирёбандаи ҳуҷҷатҳо бо ду роҳи номувофиқ коркард мешуданд. Якумин онҳо барои таъмини он тарҳрезӣ шуда буд, ки шумораи максималии далелҳо бо шумораи кам маҳдуд ва пешакӣ маълум бошад. Дар ин ҳолат, имкон дошт, ки versionҳои изофабори усулро эҷод кунед, барои ҳар як versionи рӯйхати аргументҳои ба метод интиқолшуда якто. Усули дуюм барои чизи пешакӣ номаълум ва шумораи зиёди далелҳо пешбинӣ шудааст. Дар ин ҳолат, аргументҳо дар массив ҷойгир карда шуданд ва ин массив ба метод гузаронида шуд. Далелҳои дарозии тағирёбанда аксар вақт дар коркардҳои минбаъда бо оғозкунии тағирёбанда иштирок мекунанд. Ҷойгир кардани набудани баъзе аргументҳои конструктор ё усулҳои пешбинишударо бо арзишҳои пешфарз қулай аст. Аргументи дарозии тағирёбанда массив аст ва ҳамчун массив баррасӣ мешавад. Масалан, созандаи синф 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 зангро бо истинод барои an objectҳо истифода намебарад (гарчанде ки бисёре аз барномасозон ва муаллифони баъзе китобҳо инро мегӯянд). Ҳангоми интиқоли an objectҳо ба Java, параметрҳо на аз рӯи истинод , балки аз рӯи арзиши истинод ба an object ! Дар ҳар сурат, конструктор нусхаҳои арзишҳои ҳамаи параметрҳоро мегирад. Конструктор наметавонад бо параметрҳои вуруди худ кор кунад:
  • конструктор қиматҳои параметрҳои вурудии навъҳои асосӣ (примитивӣ)-ро тағир дода наметавонад;
  • созанда наметавонад истинодҳои параметрҳои вурудиро тағир диҳад;
  • созанда наметавонад истинодҳои параметри вурудро ба an objectҳои нав таъин кунад.
Конструктор метавонад бо параметрҳои вуруди худ иҷро кунад:
  • тағир додани ҳолати an objectи ҳамчун параметри воридшуда.
Мисоли зерин исбот мекунад, ки дар Java, параметрҳои воридотӣ ба созанда бо арзиши истинод ба an object интиқол дода мешаванд. Ин мисол инчунин инъикос мекунад, ки созанда наметавонад истинодҳои параметрҳои вурудро тағир диҳад, аммо воқеан истинодҳои нусхаҳои параметрҳои вурудро тағир медиҳад. Файл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
Агар Java зангро бо истинод барои интиқоли an objectҳо ҳамчун параметр истифода мекард, конструктор иваз мекунад name1ва дар ин мисол name2. name1Созандаи воқеан истинодҳои an objectи дар ва тағирёбандаҳо нигоҳ дошташударо иваз намекунад name2. Ин нишон медиҳад, ки параметрҳои созанда бо нусхаҳои ин истинодҳо оғоз карда мешаванд. Сипас конструктор нусхаҳоро иваз мекунад. Вақте ки конструктор кори худро анҷом медиҳад, тағирёбандаҳои x ва y нобуд мешаванд ва тағирёбандаҳои аслӣ ба an objectҳои қаблӣ муроҷиат name1мекунанд .name2

Тағир додани параметрҳое, ки ба конструктор дода шудаанд.

Конструктор параметрҳои гузаштаи намудҳои асосиро тағир дода наметавонад. Аммо, конструктор метавонад ҳолати an objectи ҳамчун параметр қабулшударо тағир диҳад. Масалан, барномаи зеринро баррасӣ кунед: Файл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дигар истифода намешавад.
Дар мисоли зерин, маоши корманд бомуваффақият се маротиба зиёд карда мешавад, зеро арзиши истинод ба an object ҳамчун параметр ба усул гузаронида мешавад. Файл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
Арзиши истинод ба an object ҳамчун параметр истифода мешавад. Ҳангоми иҷро кардани сатр Salary2 s2 = new Salary2(s1); ба созанда Salary2(Salary x)арзиши истинод ба an objectи тағирёбанда дода мешавад s1ва созанда муздашро ба таври муассир се маротиба зиёд мекунад s1.value, зеро ҳатто нусхаи (Salary x)дар дохor созанда сохташуда ба an objectи тағирёбанда ишора мекунад 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васеъ карда мешавад . Варианти муқобил, вақте ки тағирёбанда аз type бошад ва созанда танҳо як параметр дошта бошад , дар ин ҳолат ба хатогии компиляция оварда мерасонад. intdoubleidoubleint

Даъвати созанда ва операторnew

Конструкторро ҳамеша оператор даъват мекунад new. Вақте ки конструктор бо оператор даъват карда мешавад new, конструктор ҳамеша истинод ба an objectи навро тавлид мекунад. Конструкторро маҷбур кардан ғайриимкон аст, ки ба ҷои истинод ба an objectи нав истинод ба an objectи аллакай мавҷуда эҷод кунад, ба истиснои ҷойгузини an objectи бесерияшуда. Ва бо оператори нав ба ҷои истинод ба an objectи нав, истинод ба an objectи мавҷуда имконнопазир аст. Масалан: Файл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(); an objectи нав ба вучуд оварда мешавад. Баъдан, агар аз хат истифода шавад Salary3 s2 = new Salary3(s1); ё сатрҳо Salary3 s3 = new Salary3(s1); метавонист пайвандеро ба an objectи мавҷуда эҷод кард, пас s1.value s2.valueонҳо s3.valueҳамон арзишро нигоҳ медоранд 1000. Дар асл дар хати Salary3 s2 = new Salary3(s1); an objectи нав барои тағирёбанда эҷод карда мешавад s2ва ҳолати an object барои тағирёбанда s1тавассути интиқол додани арзиши истинод ба an object дар параметри созанда тағир меёбад. Инро аз руи натичахои баромад тасдик кардан мумкин аст. Ва ҳангоми иҷрои хат Salary3 s3 = new Salary3(s1); an objectи НАВ барои тағирёбанда эҷод карда мешавад s3ва ҳолати an objectи тағирёбанда дубора тағир меёбад s1.

Конструкторҳо ва блокҳои ибтидоӣ, пайдарпайии амалҳо ҳангоми даъвати конструктор

Дар фасли Эҷоди an object ва конструкторҳо амалҳои умумие оварда шудаанд, ки ҳангоми сохтани an object иҷро мешаванд. Дар байни онҳо равандҳои ибтидоии майдонҳои синфҳо ва коркарди конструктори синфҳо мавҷуданд, ки дар навбати худ тартиби дохилӣ доранд:
  1. Ҳама майдонҳои маълумот ба арзишҳои пешфарзии худ оғоз карда мешаванд (0, бардурӯғ ё нул).
  2. Ҳама оғозкунакҳои саҳроӣ ва блокҳои ибтидоӣ бо тартиби дар эъломияи синф номбаршуда иҷро мешаванд.
  3. Агар дар сатри якуми конструктор конструктори дигар даъват карда шавад, он гох конструктори даъватшуда ичро мешавад.
  4. Ҷисми конструктор иҷро карда мешавад.
Конструктор ба инициализатсия алоқаманд аст, зеро дар Java се роҳи оғоз кардани майдон дар синф вуҷуд дорад:
  • дар эъломия арзиш таъин кардан;
  • таъин кардани арзишҳо дар блоки ибтидоӣ;
  • арзиши онро дар конструктор таъин кунед.
Табиист, ки шумо бояд рамзи ибтидоиро ташкил кунед, то фаҳмидани он осон бошад. Синфи зерин ҳамчун намуна оварда шудааст:
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Ҳангоми гузаштан аз намуд ба навъи бетонӣ ба рехтагарии возеҳ зарур нест . Дар хотир бояд дошт, ки асбобҳои мутобиқсозии намудҳо танҳо бо an 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параметри навъи фармоиширо муайян мекунад, ки бояд синфи ҳосилшуда аз class бошад Number, онро метавон аз ҳама гуна файл даъват кард
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION