JavaRush /Блоги Java /Random-TG /Сохтмонҳо дар Java

Сохтмонҳо дар Java

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо як мавзӯи хеле муҳимро дида мебароем, ки ба an objectҳои мо дахл дорад. Дар ин ҷо, бе муболига метавон гуфт, ки шумо ин донишро ҳар рӯз дар кори воқеӣ истифода хоҳед бурд! Мо дар бораи конструкторҳо сӯҳбат мекунем. Шояд шумо ин истилоҳро бори аввал мешунавед, аммо дар асл шумо эҳтимолан конструкторҳоро истифода кардаед, аммо худатон инро пайхас накардаед :) Мо инро баъдтар мебинем.

Конструктор дар Java чист ва чаро он лозим аст?

Биёед ду мисолро дида бароем.
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car bugatti = new Car();
       bugatti.model = "Bugatti Veyron";
       bugatti.maxSpeed = 407;

   }
}
Мо мошини худро офаридем ва модел ва суръати максималии онро муқаррар кардем. Аммо, дар як лоиҳаи воқеӣ, an objectи мошин беш аз 2 майдон дорад. Ва, масалан, 16 майдон!
public class Car {

   String model;//model
   int maxSpeed;//max speed
   int wheels;// disk width
   double engineVolume;//engine capacity
   String color;//color
   int yearOfIssue;//year of issue
   String ownerFirstName;//Owner's name
   String ownerLastName;//owner's last name
   long price;//price
   boolean isNew;//new or not
   int placesInTheSalon;//number of seats in the cabin
   String salonMaterial;// interior material
   boolean insurance;//is it insured
   String manufacturerCountry;//manufacturer country
   int trunkVolume;// trunk volume
   int accelerationTo100km;//acceleration to 100 km/h in seconds


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.yearOfIssue = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.placesInTheSalon = 2;
       bugatti.maxSpeed = 407;
       bugatti.model = "Bugatti Veyron";

   }

}
Мо як an objectи нави мошин эҷод кардем . Як мушкилот: мо 16 майдон дорем, аммо мо танҳо 12 майдонро оғоз кардем ! Ҳоло кӯшиш кунед, ки рамзро истифода баред, то онҳоеро, ки мо фаромӯш кардаем, пайдо кунед! На он қадар осон, дуруст? Дар чунин вазъият, барномасоз метавонад ба осонӣ хато кунад ва аз оғозкунии баъзе соҳаҳо гузаред. Дар натиҷа, рафтори барнома хато мешавад:
public class Car {

   String model;//model
   int maxSpeed;//max speed
   int wheels;// disk width
   double engineVolume;//engine capacity
   String color;//color
   int yearOfIssue;//year of issue
   String ownerFirstName;//Owner's name
   String ownerLastName;//owner's last name
   long price;//price
   boolean isNew;//new or not
   int placesInTheSalon;//number of seats in the cabin
   String salonMaterial;// interior material
   boolean insurance;//is it insured
   String manufacturerCountry;//manufacturer country
   int trunkVolume;// trunk volume
   int accelerationTo100km;//acceleration to 100 km/h in seconds


   public static void main(String[] args) {
       Car bugatti = new Car();

       bugatti.color = "blue";
       bugatti.accelerationTo100km = 3;
       bugatti.engineVolume = 6.3;
       bugatti.manufacturerCountry = "Italy";
       bugatti.ownerFirstName = "Amigo";
       bugatti.yearOfIssue = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.placesInTheSalon = 2;
       bugatti.maxSpeed = 407;
       bugatti.model = "Bugatti Veyron";

       System.out.println("Model Bugatti Veyron. Engine size - " + bugatti.engineVolume + ", trunk - " + bugatti.trunkVolume + ", salon is made of" + bugatti.salonMaterial +
       ", disc width - " + bugatti.wheels + ". Was acquired in 2018 by Mr. " + bugatti.ownerLastName);

   }

}
Натиҷаи консол:
Модели Bugatti Veyron. Ҷойивазкунии муҳаррик - 6,3, танаи - 0, дохor он аз нул, паҳнои обанбор - 0. Соли 2018 аз ҷониби ҷаноби null харида шудааст
Харидори шумо, ки барои як мошин 2 миллион доллар дода буд, бешак "Ҷаноби Нул" ном гирифтанро дӯст намедорад! Аммо ба таври ҷиддӣ, дар ниҳоят, барномаи мо бо як an objectи нодуруст сохташуда анҷом ёфт - мошин бо паҳнои ҳошияи 0 (яъне ҳеҷ ҷанба надорад), танаи гумшуда, дохorи аз маводи номаълум сохташуда ва ҳатто ба шахси номаълум мансуб аст. . Танҳо тасаввур кардан мумкин аст, ки чӣ гуна чунин хато ҳангоми кор кардани барнома рӯй медиҳад! Мо бояд бо кадом роҳе аз чунин ҳолатҳо канорагирӣ кунем. Ба мо лозим аст, ки барномаи мо маҳдудият дошта бошад: ҳангоми сохтани an objectи нави нақлиёт, масалан, модел ва суръати максималӣ бояд ҳамеша барои он муайян карда шаванд. Дар акси ҳол, эҷоди an objectро иҷозат надиҳед. Функсияҳои конструктор ба осонӣ аз ӯҳдаи ин вазифа мебароянд. Онҳо бо як сабаб номи худро гирифтанд. Конструктор як навъ «скелет»-и синфро месозад, ки ҳар як an objectи нави синф бояд ба он мувофиқат кунад. Барои роҳат, биёед ба versionи соддатари синфи Car бо ду майдон баргардем. Бо назардошти талаботи мо, конструктори синфи Car чунин хоҳад буд:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
Ва сохтани an object ҳоло чунин менамояд:
public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 407);
}
Диққат диҳедконструктор чй тавр сохта мешавад. Он ба усули муқаррарӣ монанд аст, аммо намуди бозгашт надорад. Дар ин ҳолат, номи синф дар созанда инчунин бо ҳарфи калон нишон дода мешавад. Дар ҳолати мо - Мошин . Илова бар ин, созанда калимаи калидии new-to-you this ро истифода мебарад . "ин" дар забони англисӣ маънои "ин, ин" аст. Ин калима ба an objectи мушаххас дахл дорад. Рамз дар конструктор:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
метавонад қариб айнан тарҷума карда шавад: " модели ин мошин (ки мо ҳоло онро эҷод карда истодаем) = далели намунавӣ , ки дар конструктор нишон дода шудааст. maxSpeed ​​барои ин мошин (ки мо онро эҷод мекунем) = аргументи maxSpeed ​​, ки дар конструктор нишон дода шудааст». Ин ҳодиса рӯй дод:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car("Bugatti Veyron", 407);
       System.out.println(bugatti.model);
       System.out.println(bugatti.maxSpeed);
   }

}
Натиҷаи консол:
Bugatti Veyron 407
Конструктор арзишҳои заруриро бомуваффақият таъин кард. Шумо шояд пай бурда бошед, ки конструктор ба усули муқаррарӣ хеле монанд аст! Ин чунин аст: конструктор як усул аст, танҳо каме мушаххас аст :) Мисли усул, мо параметрҳоро ба конструктори худ интиқол додем. Ва мисли даъват кардани усул, занги созанда кор намекунад, агар шумо онҳоро муайян накунед:
public class Car {

   String model;
   int maxSpeed;

   public Car(String model, int maxSpeed) {
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   public static void main(String[] args) {
       Car bugatti = new Car(); //error!
   }

}
Бубинед, конструктор он чизеро, ки мо ба он ноил шудан мехостем, кард. Акнун шумо наметавонед мошинро бе суръат ё бе модел созед! Монандиҳо байни конструкторҳо ва усулҳо бо ин тамом намешаванд. Мисли усулҳо, конструкторҳо метавонанд аз ҳад зиёд бор карда шаванд. Тасаввур кунед, ки шумо дар хона 2 гурба доред. Шумо яке аз онҳоро ҳамчун гӯрбача гирифтед ва дуюмашро ҳамчун калонсол аз кӯча ба хона овардед ва аниқ намедонед, ки ӯ чандсола аст. Ин маънои онро дорад, ки барномаи мо бояд гурбаҳои ду намудро эҷод кунад - бо ном ва синну сол барои гурбаи аввал ва танҳо бо ном - барои гурбаи дуюм. Барои ин, мо конструкторро аз ҳад зиёд бор мекунем:
public class Cat {

   String name;
   int age;

   //for the first cat
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   //for the second cat
   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5);
       Cat streetCatNamedBob = new Cat("Bob");
   }

}
Ба конструктори аслӣ бо параметрҳои "ном" ва "синн" мо дигареро илова кардем, танҳо бо ном. Мо усулҳоро дар дарсҳои қаблӣ ҳамин тавр пурбор карда будем. Ҳоло мо метавонем ҳарду versionи гурбаҳоро бомуваффақият эҷод кунем :) Чаро конструкторҳо лозиманд?  - 2Оё шумо дар аввали лексия гуфта будем, ки шумо аллакай конструкторҳоро истифода кардаед, аммо шумо инро пайхас накардед? Ин дуруст аст. Гап дар он аст, ки ҳар як синф дар Java дорои конструктори пешфарз ном дорад. Он ягон далел надорад, аммо ҳар вақте ки ягон an objectи ягон синф сохта мешавад, оташ мезанад.
public class Cat {

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
Дар назари аввал ин ба назар намоён нест. Хуб, мо an object офаридем ва онро офаридаем, кори дизайнер куҷост? Барои дидани ин, биёед бо дасти худ конструктори холӣ барои синфи Cat нависед ва дар дохor он мо як ибораро ба консол чоп мекунем. Агар он нишон дода шавад, пас конструктор кор кардааст.
public class Cat {

   public Cat() {
       System.out.println("Created a cat!");
   }

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
Натиҷаи консол:
Онҳо гурба офариданд!
Ин аст тасдиқ! Созандаи пешфарз ҳамеша дар синфҳои шумо ноаён мавҷуд аст. Аммо шумо бояд боз як хусусияти онро донед. Вақте ки шумо конструкторро бо аргументҳо эҷод мекунед, созандаи пешфарз аз синф нопадид мешавад. Далели ин, дар хакикат, мо дар боло дидем. Дар ин code:
public class Cat {

   String name;
   int age;

   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat barsik = new Cat(); //error!
   }
}
Мо натавонистем гурбаро бидуни ном ва синну сол эҷод кунем, зеро мо конструкторро барои Cat : string + рақам муайян кардем. Созандаи пешфарз дарҳол пас аз ин аз синф нопадид шуд. Аз ин рӯ, ҳатман дар хотир доред: агар ба шумо дар синфи худ якчанд конструктор лозим бошад, аз ҷумла як конструктори холӣ, шумо бояд онро алоҳида эҷод кунед. Масалан, мо барои клиникаи ветеринарй программа тартиб дода истодаем. Дармонгоҳи мо мехоҳад, кори хайре анҷом диҳад ва ба гурбаҳои бесарпаноҳ, ки мо номашон ва синну соли онҳоро намедонем, кумак расонад. Пас рамзи мо бояд чунин бошад:
public class Cat {

   String name;
   int age;

   //for domestic cats
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   //for street cats
   public Cat() {
   }

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 5);
       Cat streetCat = new Cat();
   }
}
Акнун, ки мо ба таври возеҳ конструктори пешфарзро навиштем, мо метавонем гурбаҳои ҳарду намудро эҷод кунем :) Барои конструктор (ба мисли ҳама усулҳо), тартиби аргументҳо хеле муҳим аст. Биёед далелҳои ном ва синну солро дар созандаи худ иваз кунем.
public class Cat {

   String name;
   int age;

   public Cat(int age, String name) {
       this.name = name;
       this.age = age;
   }

   public static void main(String[] args) {

       Cat barsik = new Cat("Barsik", 10); //error!
   }
}
Хатогӣ! Конструктор ба таври возеҳ изҳор мекунад, ки вақте ки an objectи Cat сохта мешавад, он бояд рақам ва сатрро бо ин тартиб гузаронад. Барои ҳамин codeи мо кор намекунад. Боварӣ ҳосил кунед, ки инро дар хотир доред ва ҳангоми сохтани синфҳои худ инро дар хотир доред:
public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Ин ду тарроҳони комилан гуногунанд! Агар ба саволи «Чаро конструктор лозим аст?»-ро дар як чумла баён кунем, гуфта метавонем: то ки an objectхо хамеша дар холати дуруст бошанд. Вақте ки шумо конструкторҳоро истифода мебаред, ҳамаи тағирёбандаҳои шумо дуруст оғоз карда мешаванд ва дар барнома мошинҳои суръати 0 ё дигар an objectҳои "нодуруст" вуҷуд надоранд. Истифодаи онҳо, пеш аз ҳама, барои худи барномасоз хеле фоиданок аст. Агар шумо майдонҳоро худатон оғоз кунед, хатари аз даст додани чизе ва хатогӣ зиёд аст. Аммо ин бо конструктор рӯй намедиҳад: агар шумо ҳамаи далелҳои лозимиро ба он надиҳед ё намудҳои онҳоро омехта карда бошед, компилятор фавран хатогӣ мекунад. Бояд алоҳида қайд кард, ки шумо набояд мантиқи барномаи худро дар дохor конструктор ҷойгир кунед. Барои ин, шумо усулҳое доред, ки дар он шумо тамоми функсияҳои лозимиро тавсиф карда метавонед. Биёед бубинем, ки чаро мантиқи конструктор идеяи бад аст:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factory is called" + this.name);
   System.out.println("She was founded" + this.age + " years ago" );
   System.out.println("During this time it was produced" + this.carsCount +  "cars");
   System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
}

   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Ford", 115 , 50000000);
   }
}
Мо синфи CarFactory дорем , ки корхонаи истеҳсоли мошинҳоро тавсиф мекунад. Дар дохor конструктор мо ҳамаи майдонҳоро оғоз мекунем ва мантиқро дар ин ҷо ҷойгир мекунем: мо баъзе маълумотро дар бораи завод ба консол намоиш медиҳем. Чунин ба назар мерасид, ки дар ин ҳеҷ чиз нодуруст нест, барнома комилан кор мекард. Натиҷаи консол:
Заводи автомобorи мо «Форд» ном дорад, Вай 115 сол пеш аз ин ташкил ёфта буд, дар ин муддат 50 миллион автомашина истехсол кард, Вай ба хисоби миёна соле 434 хазору 782 машина мебарорад.
Вале дар асл мо бомбаи соатй гузоштаем. Ва чунин code метавонад хеле ба осонӣ ба хатогиҳо оварда расонад. Тасаввур кунем, ки холо сухан дар бораи Форд не, балки дар бораи заводи нави «Амиго Моторс», ки камтар аз як сол вучуд дошт ва 1000 машина истехсол кардааст, меравад:
public class CarFactory {

   String name;
   int age;
   int carsCount;

   public CarFactory(String name, int age, int carsCount) {
   this.name = name;
   this.age = age;
   this.carsCount = carsCount;

   System.out.println("Our car factory is called" + this.name);
   System.out.println("She was founded" + this.age + " years ago" );
   System.out.println("During this time it was produced" + this.carsCount +  "cars");
   System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
}


   public static void main(String[] args) {

       CarFactory ford = new CarFactory("Amigo Motors", 0 , 1000);
   }
}
Натиҷаи консол:
Корхонаи мошинсозии мо Amigo Motors Exception дар риштаи "main" java.lang.ArithmeticException номида мешавад: / by zero Он 0 сол пеш таъсис ёфтааст. Дар ин муддат он дар CarFactory 1000 мошин истеҳсол мекард.<init>(CarFactory.java:15) at CarFactory.main(CarFactory.java:23) Раванд бо рамзи баромад ба анҷом расид</init>
Мо расидем! Барнома бо як хатои аҷиб анҷом ёфт. Оё шумо кӯшиш мекунед, ки сабабаш дар чист? Сабаб мантиқест, ки мо дар конструктор ҷойгир кардем. Махсусан, дар ин сатр:
System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
Дар ин чо мо хисобу китобро ба чо меорем ва микдори машинахои истехсолшударо ба синну соли завод таксим мекунем. Ва азбаски корхонаи мо нав аст (яъне 0 сола аст), натиҷа ба 0 тақсим мешавад, ки дар математика манъ аст. Дар натиҷа, барнома бо хато қатъ мешавад. Мо бояд чӣ кор мекардем? Ҳама мантиқро ба усули алоҳида гузаронед ва онро даъват кунед, масалан, printFactoryInfo() . Шумо метавонед онро an objectи CarFactory ҳамчун параметр гузаронед . Шумо инчунин метавонед тамоми мантиқро дар он ҷо ҷойгир кунед ва дар айни замон - коркарди хатогиҳои имконпазир, ба монанди мо бо сифр сол. Ба хар кас худаш. Конструкторҳо барои дуруст муқаррар кардани ҳолати an object лозиманд. Барои мантиқи тиҷорат мо усулҳо дорем. Шумо набояд якеро бо дигаре омехта кунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION