new
, at handa na ang lahat :) Dito ay pag-uusapan natin kung ano ang nangyayari sa loob ng computer at ang Java machine kapag sumulat tayo, halimbawa:
Cat cat = new Cat();
Napag-usapan na namin ito dati, ngunit kung sakaling ipaalala namin sa iyo:
- Una, ang memorya para sa pag-iimbak ng bagay ay inilalaan.
- Susunod, ang Java machine ay lumilikha ng isang sanggunian sa bagay (sa aming kaso ang sanggunian ay Cat cat).
- Sa wakas, ang mga variable ay sinisimulan at ang constructor ay tinatawag (titingnan natin ang prosesong ito nang mas detalyado).
public class Vehicle {
public static int vehicleCounter = 0;
private String description = "Vehicle";
public Vehicle() {
}
public String getDescription() {
return description;
}
}
public class Truck extends Vehicle {
private static int truckCounter = 0;
private int yearOfManufacture;
private String model;
private int maxSpeed;
public Truck(int yearOfManufacture, String model, int maxSpeed) {
this.yearOfManufacture = yearOfManufacture;
this.model = model;
this.maxSpeed = maxSpeed;
Vehicle.vehicleCounter++;
truckCounter++;
}
}
Ang Truck
klase ay isang pagpapatupad ng isang trak na may mga field na kumakatawan sa taon, modelo, at pinakamataas na bilis nito. Ngayon gusto naming lumikha ng isang tulad na bagay:
public class Main {
public static void main(String[] args) throws IOException {
Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
}
}
Para sa Java machine, ang proseso ay magiging ganito:
-
Ang unang bagay na mangyayari ay ang mga static na variable ng
Vehicle
klase ay pinasimulan . Oo, sinabi ko angVehicle
klase, hindiTruck
. Sinisimulan ang mga static na variable bago tawagin ang mga constructor, at magsisimula ito sa parent class. Subukan nating i-verify ito. Itinakda namin angvehicleCounter
patlang saVehicle
klase na katumbas ng 10 at subukang ipakita ito sa parehongVehicle
atTruck
mga konstruktor.public class Vehicle { public static int vehicleCounter = 10; private String description = "Vehicle"; public Vehicle() { System.out.println(vehicleCounter); } public String getDescription() { return description; } } public class Truck extends Vehicle { private static int truckCount = 0; private int yearOfManufacture; private String model; private int maxSpeed; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println(vehicleCounter); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCount++; } }
Sinadya naming ilagay ang println statement sa pinakasimula ng
Truck
constructor upang matiyak na ang mga field ng trak ay hindi pa nasisimulan kapagvehicleCounter
ipinakita.At narito ang resulta:
10 10
-
Pagkatapos masimulan ang mga static na variable ng parent class, ang mga static na variable ng child class ay sinisimulan. Sa aming kaso, ito ang
truckCounter
larangan ngTruck
klase.Gumawa tayo ng isa pang eksperimento kung saan susubukan nating ipakita ang halaga ng
truckCounter
loob ngTruck
constructor bago masimulan ang iba pang mga field:public class Truck extends Vehicle { private static int truckCounter = 10; private int yearOfManufacture; private String model; private int maxSpeed; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println(truckCounter); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; } }
Gaya ng nakikita mo, ang value 10 ay naitalaga na sa aming static na variable kapag
Truck
nagsimula ang constructor. -
Hindi pa oras para sa mga constructor! Nagpapatuloy ang variable initialization. Ang mga di-static na variable ng parent na klase ay pinasimulan sa pangatlo. Tulad ng nakikita mo, ang pamana ay makabuluhang nagpapakumplikado sa proseso ng paglikha ng isang bagay, ngunit wala kang magagawa tungkol dito: Kailangan mo lamang na kabisaduhin ang ilang mga bagay sa programming :)
Bilang isang eksperimento, maaari tayong magtalaga ng ilang paunang halaga sa
description
variable saVehicle
klase, at pagkatapos ay baguhin ito sa constructor.public class Vehicle { public static int vehicleCounter = 10; private String description = "Initial value of the description field"; public Vehicle() { System.out.println(description); description = "Vehicle"; System.out.println(description); } public String getDescription() { return description; } }
Patakbuhin natin ang aming
main()
pamamaraan na lumilikha ng isang trak:public class Main { public static void main(String[] args) throws IOException { Truck truck = new Truck(2017, "Scania S 500 4x2", 220); } }
Nakukuha namin ang sumusunod na resulta:
Initial value of the description field Vehicle
Ito ay nagpapatunay na kapag
Vehicle
nagsimula ang tagabuo angdescription
patlang ay naitalaga na ng isang halaga. -
Sa wakas, oras na para sa mga konstruktor! Mas tiyak, oras na para sa base class constructor. Ito ay tinatawag sa ikaapat na hakbang ng proseso ng paglikha ng bagay.
Medyo madali din itong i-verify. Subukan nating mag-output ng dalawang linya sa console: ang isa sa loob ng
Vehicle
base class constructor, ang pangalawa sa loob ngTruck
constructor. Kailangan nating kumbinsihin na ang linya sa loobVehicle
ay unang ipinapakita:public Vehicle() { System.out.println("Hello from the Vehicle constructor!"); } public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println("Hello from the Truck constructor!"); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; }
Tatakbuhin namin ang aming
main()
pamamaraan at titingnan ang resulta:Hello from the Vehicle constructor! Hello from the Truck constructor!
Magaling. Ibig sabihin hindi tayo nagkakamali :) Let's move on.
-
Ngayon ay oras na para sa pagsisimula ng mga non-static na field ng child class, ibig sabihin, ang aming
Truck
klase. Ang mga field kaagad sa loob ng klase na ginagawang instant ay hindi sinisimulan hanggang sa ikalimang hakbang! Nakakagulat, ngunit totoo :) Muli, gagawa kami ng isang simpleng pagsusuri — tulad ng sa klase ng magulang: magkakaroon kami ng ilang paunang halaga samaxSpeed
variable at saTruck
constructor ay susuriin namin na ang halaga ay itinalaga bago magsimula ang konstruktor:public class Truck extends Vehicle { private static int truckCounter = 10; private int yearOfManufacture; private String model; private int maxSpeed = 150; public Truck(int yearOfManufacture, String model, int maxSpeed) { System.out.println("Initial value of maxSpeed = " + this.maxSpeed); this.yearOfManufacture = yearOfManufacture; this.model = model; this.maxSpeed = maxSpeed; Vehicle.vehicleCounter++; truckCounter++; } }
Output ng console:
Initial value of maxSpeed = 150
Tulad ng nakikita mo, kapag
Truck
nagsimula ang tagabuo,maxSpeed
ay katumbas na ng 150! -
Ang tagabuo ng
Truck
klase ng bata ay tinatawag.At tanging sa puntong ito, ang huli sa lahat, tatawagin ang constructor ng klase na ginagawa natin!
Sa ikaanim na hakbang lamang itatalaga sa mga patlang ang mga halaga na ipinapasa namin bilang mga argumento sa aming trak.
Tulad ng nakikita mo, ang "paggawa" ng isang trak, ibig sabihin, ang proseso ng paglikha ng bagay, ay hindi simple. Ngunit tila nahati namin ito sa pinakamaliit na bahagi :)