JavaRush /Blog Jawa /Random-JV /Konstruktor ing Jawa

Konstruktor ing Jawa

Diterbitake ing grup
Hello! Dina iki kita bakal nliti topik sing penting banget babagan obyek kita. Ing kene, tanpa exaggeration, kita bisa ngomong yen sampeyan bakal nggunakake kawruh iki saben dina ing karya nyata! Kita bakal ngomong babagan konstruktor. Sampeyan bisa uga krungu istilah iki kanggo pisanan, nanging nyatane sampeyan mbokmenawa wis digunakake konstruktor, nanging sampeyan mung ora sok dong mirsani dhewe :) Kita bakal weruh mengko.

Apa konstruktor ing Jawa lan kenapa perlu?

Ayo goleki rong conto.
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

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

   }
}
Kita nggawe mobil lan nyetel model lan kacepetan maksimal. Nanging, ing proyek nyata, obyek Mobil bakal duwe luwih saka 2 lapangan. Lan, contone, 16 lapangan!
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";

   }

}
Kita wis nggawe obyek Mobil anyar . Siji masalah: kita duwe 16 lapangan, nanging kita mung miwiti 12 ! Coba saiki nggunakake kode kanggo nemokake sing kita kelalen! Ora gampang, ta? Ing kahanan kaya mengkono, programmer bisa gampang nggawe kesalahan lan skip initialization saka sawetara lapangan. Akibaté, prilaku program bakal dadi salah:
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);

   }

}
Output konsol:
Model Bugatti Veyron. Perpindahan mesin - 6.3, trunk - 0, interior digawe saka null, jembaré rim - 0. Dituku ing 2018 dening Pak null
Panuku sampeyan, sing mbayar $ 2 yuta kanggo mobil, mesthi ora seneng diarani "Pak Null"! Nanging kanthi serius, ing pungkasan, program kita rampung karo obyek sing digawe kanthi salah - mobil kanthi lebar rim 0 (yaiku, ora ana pelek), bagasi sing ilang, interior sing digawe saka bahan sing ora dingerteni, lan uga duweke wong sing ora dingerteni. . Siji mung bisa mbayangno carane kesalahan kasebut bisa kedadeyan nalika program lagi mlaku! Kita kudu ngindhari kahanan kaya ngono. Kita kudu program kita duwe watesan: nalika nggawe obyek kendaraan anyar, contone, model lan kacepetan maksimum kudu tansah kasebut. Yen ora, aja ngidini nggawe obyek. Fungsi konstruktor gampang ngrampungake tugas iki. Dheweke entuk jeneng amarga ana alesan. Konstruktor nggawe jinis "kerangka" kelas, sing kudu cocog karo saben obyek anyar saka kelas. Kanggo penak, ayo bali menyang versi sing luwih gampang saka kelas Mobil kanthi rong lapangan. Amarga syarat kita, konstruktor kanggo kelas Mobil bakal katon kaya iki:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
Lan nggawe obyek saiki katon kaya iki:
public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 407);
}
Pay manungsa waécarane konstruktor digawe. Iku padha karo cara biasa, nanging ora duwe jinis bali. Ing kasus iki, jeneng kelas dituduhake ing konstruktor, uga nganggo huruf kapital. Ing kasus kita - Mobil . Kajaba iku, konstruktor nggunakake tembung kunci anyar kanggo sampeyan iki . "iki" ing basa Inggris tegese "iki, iki". Tembung iki nuduhake obyek tartamtu. Kode ing konstruktor:
public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
bisa diterjemahake meh sacara harfiah: " model kanggo mesin iki ( sing saiki lagi digawe) = argumen model , sing ditemtokake ing konstruktor. maxSpeed ​​​​kanggo mesin iki (sing lagi digawe) = argumen maxSpeed wis ditemtokake ing konstruktor." Iki kedadeyan:
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);
   }

}
Output konsol:
Bugatti Veyron 407
Konstruktor kasil menehi nilai sing dibutuhake. Sampeyan bisa uga wis ngeweruhi sing konstruktor banget padha karo cara biasa! Mangkene: konstruktor minangka cara, mung rada spesifik :) Kaya ing metode, kita ngirim parameter menyang konstruktor. Lan kaya nelpon metode, nelpon konstruktor ora bakal bisa digunakake yen sampeyan ora nemtokake:
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!
   }

}
Sampeyan ndeleng, desainer nindakake apa sing kita coba entuk. Saiki sampeyan ora bisa nggawe mobil tanpa kacepetan utawa tanpa model! Persamaan antarane konstruktor lan metode ora mungkasi ana. Kaya cara, konstruktor bisa kakehan. Bayangake yen sampeyan duwe 2 kucing ing omah. Sampeyan njupuk salah siji saka wong-wong mau minangka anak kucing, lan sampeyan nggawa wong liya saka dalan minangka wong diwasa lan sampeyan ora ngerti persis carane umur. Iki tegese program kita kudu bisa nggawe kucing saka rong jinis - kanthi jeneng lan umur kanggo kucing pisanan, lan mung karo jeneng - kanggo kucing kaloro. Kanggo nindakake iki, kita bakal overload konstruktor:
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");
   }

}
Kanggo konstruktor asli kanthi parameter "jeneng" lan "umur" kita nambahake siji liyane, mung kanthi jeneng. Kita overloaded metode kanthi cara sing padha ing pelajaran sadurunge. Saiki kita bisa kasil nggawe loro versi kucing :) Napa konstruktor dibutuhake?  - 2Apa sampeyan ngelingi ing awal kuliah kita ngomong yen sampeyan wis nggunakake konstruktor, nanging sampeyan mung ora weruh? Iki bener. Kasunyatane, saben kelas ing Jawa duwe konstruktor standar. Ora ana bantahan, nanging murub saben obyek saka sembarang kelas digawe.
public class Cat {

   public static void main(String[] args) {

       Cat barsik = new Cat(); //this is where the default constructor worked
   }
}
Ing kawitan marketing iki ora katon. Ya, kita nggawe obyek lan nggawe, ing ngendi karya desainer? Kanggo ndeleng iki, ayo nulis konstruktor kosong kanggo kelas Kucing nganggo tangan kita dhewe , lan ing njero kita bakal nyithak sawetara frasa menyang konsol. Yen ditampilake, banjur konstruktor wis makarya.
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
   }
}
Output konsol:
Dheweke nggawe kucing!
Punika konfirmasi! Konstruktor standar mesthi ora katon ing kelas sampeyan. Nanging sampeyan kudu ngerti siji fitur liyane. Konstruktor standar ilang saka kelas nalika sampeyan nggawe sawetara konstruktor kanthi argumen. Buktine iki, nyatane, wis kita deleng ing ndhuwur. Ing kode iki:
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!
   }
}
Kita ora bisa nggawe kucing tanpa jeneng lan umur amarga kita nemtokake konstruktor kanggo Cat : string + nomer. Konstruktor standar ilang saka kelas sanalika sawise iki. Mulane, elinga: yen sampeyan butuh sawetara konstruktor ing kelas sampeyan, kalebu sing kosong, sampeyan kudu nggawe kanthi kapisah. Contone, kita nggawe program kanggo klinik Veterinary. Klinik kita pengin nindakake tumindak apik lan mbantu kucing sing ora duwe omah, sing ora ngerti jenenge utawa umure. Banjur kode kita kudu katon kaya iki:
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();
   }
}
Saiki kita wis ditulis kanthi tegas konstruktor standar, kita bisa nggawe kucing saka loro jinis :) Kanggo konstruktor (minangka cara apa wae), urutan argumen penting banget. Ayo ngganti argumen jeneng lan umur ing konstruktor kita.
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!
   }
}
Kesalahan! Konstruktor kasebut kanthi jelas nyatakake yen obyek Cat digawe, kudu diwenehi nomer lan senar, kanthi urutan kasebut. Mulane kode kita ora bisa. Pesthekake elinga iki lan elinga nalika nggawe kelas sampeyan dhewe:
public Cat(String name, int age) {
   this.name = name;
   this.age = age;
}

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Iki rong desainer sing beda banget! Yen kita nyebut jawaban kanggo pitakonan "Napa kita kudu konstruktor?" Ing siji ukara, kita bisa ngomong: supaya obyek tansah ing negara bener. Yen sampeyan nggunakake konstruktor, kabeh variabel sampeyan bakal diinisialisasi kanthi bener, lan ora ana mobil kanthi kacepetan 0 utawa obyek "salah" liyane ing program kasebut. Panggunaan kasebut migunani banget, pisanane, kanggo programmer dhewe. Yen sampeyan miwiti lapangan dhewe, ana risiko dhuwur yen ilang lan nggawe kesalahan. Nanging iki ora bakal kelakon karo konstruktor: yen sampeyan ora pass kabeh bantahan sing dibutuhake utawa nyampur munggah jinis, compiler bakal langsung uncalan kesalahan. Sampeyan kudu kasebut kanthi kapisah yen sampeyan ora kudu nyelehake logika program sampeyan ing konstruktor. Kanggo nindakake iki, sampeyan duwe cara sing bisa digunakake kanggo nggambarake kabeh fungsi sing dibutuhake. Ayo goleki kenapa logika konstruktor minangka ide sing ala:
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);
   }
}
Kita duwe kelas CarFactory sing nggambarake pabrik kanggo ngasilake mobil. Ing konstruktor, kita miwiti kabeh lapangan lan nyelehake logika ing kene: kita nampilake sawetara informasi babagan pabrik menyang konsol. Iku bakal katon sing ana apa-apa salah karo iki, program makarya sampurna. Output konsol:
Pabrik mobil kita jenenge Ford. Didegake 115 taun kepungkur, ing wektu iki wis ngasilake 50.000.000 mobil, rata-rata ngasilake 434.782 mobil saben taun.
Nanging nyatane, kita wis nandur bom wektu. Lan kode kasebut bisa gampang nyebabake kesalahan. Ayo bayangake yen saiki kita ora ngomong babagan Ford, nanging babagan pabrik anyar "Amigo Motors", sing wis ana kurang saka setahun lan wis ngasilake 1000 mobil:
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);
   }
}
Output konsol:
Pabrik mobil kita diarani Amigo Motors Exception ing thread "utama" java.lang.ArithmeticException: / by zero Didegaké 0 taun kepungkur Ing wektu iki, perusahaan iki ngasilake 1000 mobil ing CarFactory.<init>(CarFactory.java:15) ing CarFactory.main(CarFactory.java:23) Proses rampung nganggo kode metu 1</init>
Kita wis teka! Program rampung karo sawetara kesalahan aneh. Sampeyan bakal nyoba kanggo guess apa alesan? Alesané yaiku logika sing kita pasang ing konstruktor. Khusus, ing baris iki:
System.out.println("On average she produces" + (this.carsCount/this.age) + "cars per year");
Ing kene kita nindakake pitungan lan mbagi jumlah mobil sing diprodhuksi miturut umur pabrik. Lan amarga pabrik kita anyar (yaiku, umur 0 taun), asil divisi kanthi 0, sing dilarang ing matematika. Akibaté, program mungkasi kanthi kesalahan. Apa sing kudu kita lakoni? Pindhah kabeh logika menyang cara kapisah lan nelpon, contone, printFactoryInfo () . Sampeyan bisa ngliwati obyek CarFactory minangka parameter . Sampeyan uga bisa nyelehake kabeh logika ing kana, lan ing wektu sing padha - ngolah kesalahan sing bisa ditindakake, kaya kita karo taun nol. Kanggo saben dhewe. Konstruktor dibutuhake kanggo nyetel kahanan obyek kanthi bener. Kanggo logika bisnis kita duwe metode. Sampeyan ora kudu nyampur siji karo liyane.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION