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

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

Группада жарыяланган
Класстын конструкторлору.  Java JDK 1.5 - 1

Конструкторлор жөнүндө жалпы маалымат

Конструкторметодго окшош структура болуп саналат, анын максаты класстын үлгүсүн түзүү. Дизайнердин мүнөздөмөлөрү:
  • Конструктордун аты класстын атына дал келиши керек (шарт боюнча, биринчи тамга баш тамга менен жазылат, көбүнчө зат атооч);
  • Кандай гана класста болбосун конструктор бар. Эгер сиз жазбасаңыз да, Java компилятору демейки конструкторду түзөт, ал бош болот жана суперкласс конструкторун чакыруудан башка эч нерсе кылbyte.
  • Конструктор методго окшош, бирок ал метод эмес, ал класстын мүчөсү катары да каралbyte. Демек, аны тукум кууп өтүүгө же субкласста жокко чыгарууга болбойт;
  • Конструкторлор тукум кууп өткөн эмес;
  • Класста бир нече конструктор болушу мүмкүн. Бул учурда конструкторлор ашыкча жүктөлөт деп айтылат;
  • Эгерде класс конструкторду аныктабаса, компилятор codeго автоматтык түрдө параметрсиз конструкторду кошот;
  • Конструктор кайтаруучу типке ээ эмес; ал жада калса тип да боло алbyte void; эгер тип кайтарылса void, класстын аты менен дал келгенине карабастан, ал мындан ары конструктор эмес, метод болуп калат.
  • Конструктордо операторго уруксат берилген return, бирок эч кандай кайтаруу мааниси жок, бош гана;
  • Конструктор кирүү модификаторлорун колдонууга мүмкүндүк берет; сиз модификаторлордун бирин орното аласыз: public, protected, privateже модификаторсуз.
  • Конструктордо abstract, final, nativeже модификаторлору болушу мүмкүн staticэмес synchronized;
  • Ачкыч сөз thisошол эле класстагы башка конструкторго тиешелүү. Эгер колдонулса, ага чакыруу конструктордун биринчи сабы болушу керек;
  • Ачкыч сөз superата-класстын конструкторун чакырат. Эгер колдонулса, ага шилтеме конструктордун биринчи сабы болушу керек;
  • Эгерде конструктор ата класстын конструкторуна (аргументтер менен же аргументтерсиз) чалуу жасабаса super, компилятор аргументсиз эле ата класстын конструкторун чакыруу үчүн codeду автоматтык түрдө кошот;

Демейки конструктор

Кандай гана класста болбосун конструктор бар. Эгер сиз жазбасаңыз да, Java компилятору демейки конструкторду түзөт. Бул конструктор бош жана суперкласс конструкторун чакыруудан башка эч нерсе жасаbyte. Ошол. эгер жазсаңыз:
public class Example {}
анда бул жазууга барабар:
public class Example
{
     Example()
     {
          super;
     }
}
Бул учурда ата-теги класс ачык көрсөтүлбөйт жана демейки боюнча бардык Java класстары классты мурастайт, Objectошондуктан класстын конструктору деп аталат Object. Эгерде класс конструкторду параметрлери менен аныктаса, бирок параметрлери жок ашыкча жүктөлгөн конструктор жок болсо, анда конструкторду параметрсиз чакыруу ката болуп саналат. Бирок, Java-да 1.5 versionсынан бери өзгөрүлмө узундуктагы аргументтери бар конструкторлорду колдонууга болот. Ал эми узундугу өзгөрүлмө аргументи бар конструктор болсо, демейки конструкторду чакыруу ката болбойт. Бул өзгөрүлмө узундуктагы аргумент бош болушу мүмкүн болгондуктан болбойт. Мисалы, төмөнкү мисал компиляцияланbyte, бирок сиз конструкторду өзгөрүлмө узундуктагы аргумент менен түшүндүрсөңүз, ал ийгorктүү компиляцияланат жана иштейт жана натыйжада 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 ...)
Бирок класс эч кандай конструкторду такыр аныктабаган жалпы учурда, демейки конструкторду чакыруу (параметрлери жок) керек болот, анткени демейки конструкторду алмаштыруу автоматтык түрдө ишке ашат.

Объектти түзүү жана конструкторлор

Объектти түзүүдө төмөнкү аракеттер ырааттуу түрдө аткарылат:
  • Объект классы программада мурунтан эле колдонулган класстардын арасында изделет. Эгерде ал жок болсо, анда ал программага жеткorктүү болгон бардык каталогдордо жана китепканалардан изделет. Класс каталогдо же китепканада табылгандан кийин, класстын статикалык талаалары түзүлүп, инициализацияланат. Ошол. Ар бир класс үчүн статикалык талаалар бир гана жолу инициализацияланат.
  • Эстутум an object үчүн бөлүнгөн.
  • Класс талаалары инициализацияланууда.
  • Класстын конструктору аткарат.
  • Түзүлгөн жана инициализацияланган an objectке шилтеме түзүлөт. Бул шилтеме an objectти түзгөн туюнтумдун мааниси. Объект newInstance()класс ыкмасын чакыруу менен да түзүлүшү мүмкүн java.lang.Class. Бул учурда параметр тизмеси жок конструктор колдонулат.

Конструкторлорду ашыкча жүктөө

Бир класстын конструкторлору бирдей атка жана башка кол тамгага ээ болушу мүмкүн. Бул касиет комбинация же ашыкча жүктөө деп аталат. Эгерде класста бир нече конструктор болсо, анда конструктор ашыкча жүктөлөт.

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

Конструктордун кол тамгасы - бул параметрлердин саны жана түрлөрү, ошондой эле конструктордун параметрлеринин тизмесиндеги алардын типтеринин ырааттуулугу. Кайтаруу түрү эске алынbyte. Конструктор эч кандай параметрлерди кайтарbyte. Бул билдирүү кандайдыр бир мааниде Java ашыкча жүктөгөн конструкторлорду же ыкмаларды кантип айырмалай турганын түшүндүрөт. Java ашыкча жүктөлгөн ыкмаларды кайтаруу түрү боюнча эмес, киргизүү параметрлеринин түрлөрүнүн саны, түрлөрү жана ырааттуулугу боюнча айырмалайт. Конструктор типти кайтара алbyte 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же үч модификатордун бири берorши мүмкүн protected. Ал эми мисал азыр мындай болот: FileVoidDemo2.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 көптөн күткөн куралды - конструкторлор жана методдор үчүн өзгөрүлмө узундуктагы аргументтерди киргизди. Мурда өзгөрүлмө сандагы documentтер эки ыңгайсыз жол менен иштетилчү. Алардын биринчиси аргументтердин максималдуу саны аз сан менен чектелиши жана алдын ала белгилүү болушу үчүн иштелип чыккан. Бул учурда, методдун ашыкча жүктөлгөн 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тер үчүн кайрылууну колдонбойт (бирок көптөгөн программисттер жана кээ бир китептердин авторлору муну ырасташат). Объекттерди Javaга өткөрүп жатканда, параметрлер шилтеме боюнча эмес , an object шилтемесинин мааниси боюнча өткөрүлөт ! Кандай болбосун, конструктор бардык параметрлердин баалуулуктарынын көчүрмөлөрүн алат. Конструктор өзүнүн киргизүү параметрлери менен кыла алbyte:
  • конструктор негизги (примитивдүү) типтердин кириш параметрлеринин маанилерин өзгөртө алbyte;
  • конструктор киргизүү параметринин шилтемелерин өзгөртө алbyte;
  • конструктор киргизүү параметринин шилтемелерин жаңы an objectтерге кайра дайындай алbyte.
Конструктор өзүнүн киргизүү параметрлери менен жасай алат:
  • киргизүү параметри катары берилген 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 шилтемелерин алмаштырbyte name2. Бул конструктордун параметрлери бул шилтемелердин көчүрмөлөрү менен инициализацияланганын көрсөтүп турат. Андан кийин конструктор көчүрмөлөрдү алмаштырат. Конструктор өз ишин аяктагандан кийин, x жана y өзгөрмөлөрү жок кылынат, ал эми баштапкы өзгөрмөлөр мурунку an objectтерге кайрыла name1беришет .name2

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

Конструктор негизги типтердин өткөн параметрлерин өзгөртө алbyte. Бирок конструктор параметр катары берилген 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
Албетте, бул ыкма негизги түрү параметрин өзгөртө алbyte. Демек, конструкторду чакыргандан кийин, өзгөрмөнүн мааниси valueбарабар бойдон калат 1000. Негизинен үч нерсе болот:
  1. Өзгөрмө xпараметр маанисинин көчүрмөсү менен инициализацияланат value(б.а., сан 1000).
  2. Өзгөрмөнүн мааниси xүч эсеге көбөйдү - ал азыр ге барабар 3000. Бирок, өзгөрмөнүн мааниси valueбарабар бойдон калууда 1000.
  3. Конструктор бүтөт жана өзгөрмө xмындан ары колдонулbyte.
Төмөнкү мисалда, кызматкердин эмгек акысы ийгorктүү үч эсеге көбөйдү, анткени 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көчүрмө да өзгөрмө an objectиге ишарат кылат . (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, конструктор дайыма жаңы 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ти түзүүдө аткарыла турган жалпы аракеттер көрсөтүлгөн. Алардын арасында класс талааларын инициализациялоо жана класстын конструкторун иштеп чыгуу процесстери бар, алар да өз кезегинде ички тартипке ээ:
  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()ата-эне класстын конструктору анын тукуму тарабынан мурасталbyte 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
Бул мисалда эки конструктор бар. Биринчиси сап аргументин алат. Экинчиси эч кандай аргументтерди алbyte, ал жөн гана демейки "Джон" аталышын колдонуп биринчи конструкторду чакырат. Ошентип, сиз конструкторлорду талаанын маанилерин инициализациялоо үчүн колдоно аласыз, бул программаларда көбүнчө зарыл.

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.
Куруучулар класстык баш ийүү тартибинде чакырылат. Бул кандайдыр бир мааниге ээ. Суперкласстын кандайдыр бир подкласс жөнүндө бorми болбогондуктан, аны аткаруу үчүн керек болгон бардык инициализация өзүнчө. Мүмкүн болсо, ал субкласс тарабынан аткарылган ар кандай инициализациядан мурун керек. Ошон үчүн биринчи кезекте муну жасаш керек.

Ыңгайлаштырылган конструкторлор

Иштөө убактысынын түрүн аныктоо механизми полиморфизмди ишке ашырган Java тorнин күчтүү негизги принциптеринин бири болуп саналат. Бирок, мындай механизм кээ бир учурларда шайкеш келбеген типтеги кастингден иштеп чыгуучуну коргобойт. Эң кеңири таралган учур – бул 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класстан алынган класс болушу керек болгон ыңгайлаштырылган типтин параметрин аныктагандыктан Number, аны каалагандан чакырса болот.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION