CodeGym /Blog Jawa /Acak /Konstruktor Jawa
John Squirrels
tingkat
San Francisco

Konstruktor Jawa

Diterbitake ing grup
Hi! Dina iki kita bakal nimbang topik sing penting banget babagan obyek kita. Tanpa exaggeration, kita bisa ngomong sampeyan bakal nggunakake topik iki ing urip nyata saben dina! Kita ngomong babagan Konstruktor Jawa. Iki bisa uga pisanan sampeyan krungu istilah iki, nanging sampeyan wis nggunakake konstruktor. Sampeyan mung ora éling :) Kita gawe uwong yakin dhéwé iki mengko.

Apa konstruktor ing donya lan apa sing dibutuhake?

Ayo dipikirake 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 = 378;

   }
}
Kita nggawe mobil kita, lan nyetel model lan kacepetan maksimum. Nanging obyek Mobil ora bakal duwe 2 lapangan ing proyek nyata. Contone, bisa uga ana 16 lapangan!

public class Car {

   String model;// model
   int maxSpeed;// maximum speed
   int wheels;// wheel width
   double engineVolume;// engine volume
   String color;// color
   int productionYear;// production year
   String ownerFirstName;// first name of owner
   String ownerLastName;// last name of owner
   long price;// price
   boolean isNew;// flag indicating whether car is new
   int seatsInTheCar;// number of seats in the car
   String cabinMaterial;// interior material
   boolean insurance;// flag indicating whether car is insured
   String manufacturerCountry;// manufacturer country
   int trunkVolume;// size of the trunk
   int accelerationTo100km;// how long it takes to accelerate 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.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

   }

}
Kita wis nggawe obyek Mobil anyar . Ana siji masalah: kita duwe 16 lapangan, nanging kita mung miwiti 12 ! Deleng kode saiki lan coba goleki kolom sing kita kelalen! Ora gampang, ya? Ing kahanan iki, programer bisa gampang nggawe kesalahan lan gagal kanggo miwiti sawetara lapangan. Akibaté, program bakal tumindak salah:

public class Car {

   String model;// model
   int maxSpeed;// maximum speed
   int wheels;// wheel width
   double engineVolume;// engine volume
   String color;// color
   int productionYear;// production year
   String ownerFirstName;// first name of owner
   String ownerLastName;// last name of owner
   long price;// price
   boolean isNew;// flag indicating whether car is new
   int seatsInTheCar;// number of seats in the car
   String cabinMaterial;// interior material
   boolean insurance;// flag indicating whether car is insured
   String manufacturerCountry;// manufacturer country
   int trunkVolume;// size of the trunk
   int accelerationTo100km;// how long it takes to accelerate 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.productionYear = 2016;
       bugatti.insurance = true;
       bugatti.price = 2000000;
       bugatti.isNew = false;
       bugatti.seatsInTheCar = 2;
       bugatti.maxSpeed = 378;
       bugatti.model = "Bugatti Veyron";

       System.out.println("Model: Bugatti Veyron. Engine volume: " + bugatti.engineVolume + ". Trunk volume: " + bugatti.trunkVolume + ". Cabin material: " + bugatti.cabinMaterial +
       ". Wheel width: " + bugatti.wheels + ". Purchased in 2018 by Mr. " + bugatti.ownerLastName);

   }

}
Output konsol: Model: Bugatti Veyron. Volume mesin: 6.3. Volume bagasi: 0. Bahan kabin: null. Jembar wheel: 0. Dituku ing 2018 dening Pak null panuku Panjenengan, sing nyerah $ 2 yuta kanggo mobil, temenan ora seneng disebut " Pak null "! Nanging kanthi serius, ing ngisor iki program kita nggawe obyek kanthi salah: mobil kanthi jembar roda 0 (yaiku ora ana roda), bagasi sing ilang, kabin sing digawe saka bahan sing ora dingerteni, lan sing paling penting, pemilik sing ora ditemtokake. . Sampeyan mung bisa mbayangno carane kesalahan kuwi bisa "mati" nalika program lagi mlaku! Kita kudu ngindhari kahanan kaya ngono. Kita kudu mbatesi program kita: nalika nggawe Mobil anyarobyek, kita pengin lapangan, kayata model lan kacepetan maksimum, tansah ditemtokake. Yen ora, kita pengin nyegah nggawe obyek kasebut. Konstruktor nangani tugas iki kanthi gampang. Dheweke entuk jeneng amarga ana alesan. Konstruktor nggawe jinis "kerangka" kelas sing saben obyek anyar kudu cocog. Kanggo penak, ayo bali menyang versi sing luwih gampang saka kelas Mobil kanthi rong lapangan. Ngelingi syarat kita, konstruktor kelas Mobil bakal katon kaya iki:

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

// And creating an object now looks like this:

public static void main(String[] args) {
   Car bugatti = new Car("Bugatti Veyron", 378);
}
Elinga carane konstruktor diumumake. Iku padha karo cara biasa, nanging ora duwe jinis bali. Kajaba iku, konstruktor nemtokake jeneng kelas ( Mobil ) diwiwiti kanthi huruf gedhe. Kajaba iku, konstruktor digunakake karo tembung kunci sing anyar kanggo sampeyan: iki . Tembung kunci iki kanggo nuduhake obyek tartamtu. Kode ing konstruktor

public Car(String model, int maxSpeed) {
   this.model = model;
   this.maxSpeed = maxSpeed;
}
bisa diinterpretasikake meh verbatim: " Model kanggo mobil iki (sing kita nggawe saiki) yaiku argumen model sing diterusake menyang konstruktor. konstruktor." Lan iki mung 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", 378);
       System.out.println(bugatti.model);
       System.out.println(bugatti.maxSpeed);
   }

}
Output konsol: Bugatti Veyron 378 Konstruktor kanthi bener nemtokake nilai sing dibutuhake. Sampeyan bisa uga wis ngeweruhi sing konstruktor banget padha karo cara biasa! Mangkono uga. A konstruktor tenan cara, nanging karo fitur tartamtu :) Kaya karo cara, kita liwati bantahan kanggo konstruktor kita. Lan kaya nelpon metode, nelpon konstruktor ora bakal bisa digunakake kajaba sampeyan 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 bisa ndeleng manawa konstruktor ngrampungake apa sing diupayakake. Saiki sampeyan ora bisa nggawe mobil tanpa kacepetan utawa model! Persamaan antarane konstruktor lan metode ora rampung ing kene. Kaya cara, konstruktor bisa kakehan. Bayangake sampeyan duwe 2 kucing pet ing omah. Sampeyan entuk salah siji saka wong-wong mau minangka anak kucing. Nanging sing nomer loro sing dijupuk saka dalan nalika wis thukul, lan sampeyan ora ngerti persis umure. Ing kasus iki, kita pengin program kita bisa nggawe rong jinis kucing: sing duwe jeneng lan umur (kanggo kucing pisanan), lan sing mung duwe jeneng (kanggo kucing kapindho). Kanggo iki, kita bakal kakehan 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 smudge = new Cat("Smudge", 5);
       Cat streetCatNamedBob = new Cat("Bob");
   }

}
Saliyane konstruktor asli kanthi parameter "jeneng" lan "umur", kita nambahake siji maneh kanthi mung parameter jeneng. Kanthi cara sing padha karo metode overloaded ing pelajaran sadurunge. Saiki kita bisa nggawe loro jinis kucing :)
Napa kita butuh konstruktor?  - 2
Elinga yen ing wiwitan pawulangan kita ujar manawa sampeyan wis nggunakake konstruktor tanpa sadhar? We tegese apa kita ngandika. Kasunyatane yaiku saben kelas ing Jawa duwe apa sing diarani konstruktor standar. Ora njupuk bantahan, nanging dijaluk saben sampeyan nggawe obyek saka kelas apa wae.

public class Cat {

   public static void main(String[] args) {

       Cat smudge = new Cat(); // The default constructor is invoked here
   }
}
Sepisanan, ora katon. Kita nggawe obyek, dadi apa? Ing endi konstruktor nindakake apa wae ing kene? Kanggo ndeleng, ayo nulis konstruktor kosong kanggo kelas Cat . Kita bakal nampilake sawetara frasa ing njero. Yen tembung kasebut ditampilake, mula konstruktor kasebut diarani.

public class Cat {

   public Cat() {
       System.out.println("A cat has been created!");
   }

   public static void main(String[] args) {

       Cat smudge = new Cat(); // The default constructor is invoked here
   }
}
Output konsol: Kucing wis digawe! Ana konfirmasi! Konstruktor standar mesthi ora katon ing kelas sampeyan. Nanging sampeyan kudu ngerti siji liyane babagan iki. Konstruktor standar diilangi saka kelas yen sampeyan nggawe konstruktor kanthi argumen. Nyatane, kita wis ndeleng bukti ing ndhuwur. Ana 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 smudge = new Cat(); //Error!
   }
}
Kita ora bisa nggawe Kucing tanpa jeneng lan umur, amarga kita ngumumake konstruktor Cat kanthi parameter string lan int . Iki nyebabake konstruktor standar langsung ilang saka kelas. Dadi manawa kanggo elinga yen sampeyan butuh sawetara konstruktor ing kelas sampeyan, kalebu konstruktor tanpa argumentasi, sampeyan kudu ngumumake kanthi kapisah. Contone, umpamane kita nggawe program kanggo klinik veteriner. Klinik kita pengin nindakake tumindak apik lan mbantu anak kucing sing ora duwe omah sing jenenge lan umure ora dingerteni. Banjur kode kita kudu katon kaya iki:

public class Cat {

   String name;
   int age;

   // For cats with owners
   public Cat(String name, int age) {
       this.name = name;
       this.age = age;
   }

   // For street cats
   public Cat() {
   }

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5);
       Cat streetCat = new Cat();
   }
}
Saiki kita wis nulis konstruktor standar sing eksplisit, kita bisa nggawe loro jinis kucing :) Kaya cara apa wae, urutan argumen sing diterusake menyang konstruktor 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 smudge = new Cat("Smudge", 10); // Error!
   }
}
Kesalahan! Konstruktor kasebut kanthi jelas nyatakake yen obyek Cat digawe, kudu diwenehi nomer lan senar, ing urutan iki. Dadi, kode kita ora bisa digunakake. Pesthekake elinga iki lan elinga nalika ngumumake 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 loro konstruktor babar blas beda! Yen kita padha kanggo nyebut ing ukara siji jawaban kanggo pitakonan "Apa aku kudu konstruktor a?", Kita bisa ngomong, "Kanggo mesthekake yen obyek tansah duwe negara bener". Nalika sampeyan nggunakake konstruktor, kabeh variabel sampeyan bakal diinisialisasi kanthi bener. Program sampeyan ora bakal duwe mobil kanthi kacepetan 0 utawa obyek "ora sah" liyane. Keuntungan utama yaiku kanggo programmer. Yen sampeyan miwiti lapangan kanthi manual (sawise nggawe obyek), ana risiko gedhe yen sampeyan bakal kesasar lan ngenalake bug. Nanging iki ora bakal kedadeyan karo konstruktor: yen sampeyan gagal ngliwati kabeh argumen sing dibutuhake utawa sampeyan ngliwati jinis argumen sing salah, kompiler bakal langsung ndhaptar kesalahan. Kita uga kudu ujar kanthi kapisah yen sampeyan ora kudu nyelehake program sampeyan ' s logika nang konstruktor a. Iki kanggo metode apa. Metode ing ngendi sampeyan kudu nemtokake kabeh fungsi sing dibutuhake. Ayo ndeleng kenapa nambah logika menyang 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("It was founded " + this.age + " years ago" );
   System.out.println("Since that time, it has produced " + this.carsCount +  " cars");
   System.out.println("On average, it 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 mobil. Ing konstruktor, kita miwiti kabeh lapangan lan kalebu sawetara logika: kita nampilake sawetara informasi babagan pabrik. Kayane ora ana sing ala babagan iki. Program kerjane apik. Output konsol: Pabrik mobil kita diarani Ford Didegaké 115 taun kepungkur Wiwit wektu iku, wis ngasilake 50000000 mobil Rata-rata, ngasilake 434782 mobil saben taun Nanging kita wis nggawe tambang sing ditundha wektu. Lan kode kaya iki bisa gampang nyebabake kesalahan. Upamane saiki kita ora ngomong babagan Ford, nanging babagan pabrik anyar sing diarani "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 factor is called " + this.name);
   System.out.println("It was founded " + this.age + " years ago" );
   System.out.println("Since that time, it has produced " + this.carsCount +  " cars");
   System.out.println("On average, it 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: / dening nul Didegaké 0 taun kepungkur Wiwit wektu iku, wis ngasilake 1000 mobil ing CarFactory. (CarFactory.java:15) ing CarFactory.main(CarFactory.java:23) Proses rampung nganggo kode metu 1 Boom! Program kasebut rampung karo sawetara kesalahan sing ora bisa dingerteni. Sampeyan bisa nyoba kanggo guess sabab? Masalah kasebut ana ing logika sing dilebokake ing konstruktor. Luwih khusus, baris iki:

System.out.println("On average, it produces " + (this.carsCount/this.age) + " cars per year");
Ing kene sampeyan nindakake pitungan lan mbagi jumlah mobil sing diprodhuksi miturut umur pabrik. Lan amarga pabrik kita anyar (yaiku 0 taun), kita dibagi 0, sing ora bisa ditindakake ing matematika. Akibate, program mungkasi kanthi kesalahan.

Apa sing kudu kita lakoni?

Sijine kabeh logika ing cara sing kapisah. Ayo diarani printFactoryInfo() . Sampeyan bisa ngirim obyek CarFactory minangka argumen. Sampeyan bisa sijine kabeh logika ana, lan bebarengan nangani kesalahan potensial (kaya kita nglibatno nul taun). Kanggo saben dhewe. Konstruktor dibutuhake kanggo nyetel status obyek sing bener. Kita duwe cara kanggo logika bisnis. Aja nyampur siji karo liyane. Kanggo nguatake apa sing sampeyan sinau, disaranake sampeyan nonton video pelajaran saka Kursus Jawa
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION