new
, మరియు ప్రతిదీ సిద్ధంగా ఉంది :) ఇక్కడ మనం వ్రాసేటప్పుడు కంప్యూటర్ మరియు జావా మెషీన్ లోపల ఏమి జరుగుతుందో గురించి మాట్లాడుతాము, ఉదాహరణకు:
Cat cat = new Cat();
మేము దీని గురించి ఇంతకు ముందే మాట్లాడాము, అయితే మేము మీకు గుర్తు చేస్తాము:
- మొదట, వస్తువును నిల్వ చేయడానికి మెమరీ కేటాయించబడుతుంది.
- తరువాత, జావా మెషీన్ వస్తువుకు సూచనను సృష్టిస్తుంది (మా విషయంలో రిఫరెన్స్ క్యాట్ క్యాట్).
- చివరగా, వేరియబుల్స్ ప్రారంభించబడ్డాయి మరియు కన్స్ట్రక్టర్ అంటారు (మేము ఈ ప్రక్రియను మరింత వివరంగా చూడబోతున్నాము).
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++;
}
}
తరగతి Truck
అనేది దాని సంవత్సరం, మోడల్ మరియు గరిష్ట వేగాన్ని సూచించే ఫీల్డ్లతో కూడిన ట్రక్కు యొక్క అమలు. ఇప్పుడు మనం అటువంటి వస్తువును సృష్టించాలనుకుంటున్నాము:
public class Main {
public static void main(String[] args) throws IOException {
Truck truck = new Truck(2017, "Scania S 500 4x2", 220);
}
}
జావా యంత్రానికి, ప్రక్రియ ఇలా కనిపిస్తుంది:
-
మొదటి విషయం ఏమిటంటే క్లాస్ యొక్క స్టాటిక్ వేరియబుల్స్
Vehicle
ప్రారంభించబడ్డాయి . అవును, నేనుVehicle
క్లాస్ చెప్పాను, కాదుTruck
. కన్స్ట్రక్టర్లను పిలవడానికి ముందు స్టాటిక్ వేరియబుల్స్ ప్రారంభించబడతాయి మరియు ఇది పేరెంట్ క్లాస్లో ప్రారంభమవుతుంది. దీన్ని ధృవీకరించడానికి ప్రయత్నిద్దాం. మేముvehicleCounter
ఫీల్డ్ను క్లాస్లో 10కి సమానంగా సెట్ చేసాము మరియు దానిని మరియు కన్స్ట్రక్టర్లలోVehicle
ప్రదర్శించడానికి ప్రయత్నిస్తాము .Vehicle
Truck
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++; } }
ప్రదర్శించబడినప్పుడు
Truck
ట్రక్కు ఫీల్డ్లు ఇంకా ప్రారంభించబడలేదని నిర్ధారించుకోవడానికి మేము ఉద్దేశపూర్వకంగా ప్రింట్ఎల్ఎన్ స్టేట్మెంట్ను కన్స్ట్రక్టర్ ప్రారంభంలో ఉంచాము .vehicleCounter
మరియు ఇక్కడ ఫలితం ఉంది:
10 10
-
పేరెంట్ క్లాస్ యొక్క స్టాటిక్ వేరియబుల్స్ ప్రారంభించబడిన తర్వాత, చైల్డ్ క్లాస్ యొక్క స్టాటిక్ వేరియబుల్స్ ప్రారంభించబడతాయి. మా విషయంలో, ఇది తరగతి
truckCounter
యొక్క ఫీల్డ్Truck
.ఇతర ఫీల్డ్లను ప్రారంభించే ముందు కన్స్ట్రక్టర్
truckCounter
లోపల విలువను ప్రదర్శించడానికి ప్రయత్నించే మరొక ప్రయోగాన్ని చేద్దాం :Truck
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++; } }
మీరు చూడగలిగినట్లుగా, కన్స్ట్రక్టర్ ప్రారంభించినప్పుడు విలువ 10 ఇప్పటికే మా స్టాటిక్ వేరియబుల్కు కేటాయించబడింది
Truck
. -
నిర్మాణకర్తలకు ఇది ఇంకా సమయం కాదు! వేరియబుల్ ప్రారంభీకరణ కొనసాగుతుంది. పేరెంట్ క్లాస్ యొక్క నాన్-స్టాటిక్ వేరియబుల్స్ మూడవదిగా ప్రారంభించబడ్డాయి. మీరు చూడగలిగినట్లుగా, వారసత్వం ఒక వస్తువును సృష్టించే ప్రక్రియను గణనీయంగా క్లిష్టతరం చేస్తుంది, కానీ దాని గురించి మీరు ఏమీ చేయలేరు: మీరు ప్రోగ్రామింగ్లో కొన్ని విషయాలను గుర్తుంచుకోవాలి :)
description
ఒక ప్రయోగంగా, మేము తరగతిలోని వేరియబుల్కు కొంత ప్రారంభ విలువను కేటాయించవచ్చుVehicle
, ఆపై దానిని కన్స్ట్రక్టర్లో మార్చవచ్చు.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; } }
main()
ట్రక్కును సృష్టించే మా పద్ధతిని అమలు చేద్దాం :public class Main { public static void main(String[] args) throws IOException { Truck truck = new Truck(2017, "Scania S 500 4x2", 220); } }
మేము ఈ క్రింది ఫలితాన్ని పొందుతాము:
Initial value of the description field Vehicle
Vehicle
కన్స్ట్రక్టర్ ప్రారంభించినప్పుడుdescription
ఫీల్డ్కు ఇప్పటికే విలువ కేటాయించబడిందని ఇది రుజువు చేస్తుంది . -
చివరగా, ఇది నిర్మాణకర్తలకు సమయం! మరింత ఖచ్చితంగా, ఇది బేస్ క్లాస్ కన్స్ట్రక్టర్ కోసం సమయం. ఇది వస్తువు సృష్టి ప్రక్రియ యొక్క నాల్గవ దశలో ప్రారంభించబడింది.
ఇది ధృవీకరించడం కూడా చాలా సులభం. కన్సోల్కి రెండు లైన్లను అవుట్పుట్ చేయడానికి ప్రయత్నిద్దాం: ఒకటి
Vehicle
బేస్ క్లాస్ కన్స్ట్రక్టర్ లోపల, రెండవదిTruck
కన్స్ట్రక్టర్ లోపల.Vehicle
లోపల ఉన్న పంక్తి ముందుగా ప్రదర్శించబడుతుందని మేము నిర్ధారించుకోవాలి :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++; }
మేము మా పద్ధతిని అమలు చేస్తాము
main()
మరియు ఫలితాన్ని చూస్తాము:Hello from the Vehicle constructor! Hello from the Truck constructor!
అద్భుతమైన. అంటే మనం తప్పు పట్టడం లేదు :) ఇక ముందుకు వెళదాం.
-
ఇప్పుడు చైల్డ్ క్లాస్ అంటే మా క్లాస్ యొక్క నాన్-స్టాటిక్ ఫీల్డ్లను ప్రారంభించే సమయం వచ్చింది
Truck
. తక్షణమే తరగతిలోని ఫీల్డ్లు ఐదవ దశ వరకు ప్రారంభించబడవు! ఆశ్చర్యంగా ఉంది, కానీ నిజం :) మళ్ళీ, మేము సాధారణ తనిఖీ చేస్తాము — పేరెంట్ క్లాస్ మాదిరిగానే: మేము వేరియబుల్కు కొంత ప్రారంభ విలువను చేస్తాముmaxSpeed
మరియుTruck
కన్స్ట్రక్టర్ ప్రారంభించే ముందు విలువ కేటాయించబడిందో లేదో కన్స్ట్రక్టర్లో తనిఖీ చేస్తాము: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++; } }
కన్సోల్ అవుట్పుట్:
Initial value of maxSpeed = 150
మీరు చూడగలిగినట్లుగా, కన్స్ట్రక్టర్
Truck
ప్రారంభించినప్పుడు,maxSpeed
ఇప్పటికే 150కి సమానం! -
చైల్డ్ క్లాస్ యొక్క కన్స్ట్రక్టర్
Truck
అంటారు.మరియు ఈ సమయంలో మాత్రమే, అన్నింటికంటే చివరిగా, మేము ఇన్స్టాంటియేట్ చేస్తున్న క్లాస్ యొక్క కన్స్ట్రక్టర్ని పిలుస్తాము!
ఆరవ దశలో మాత్రమే ఫీల్డ్లు మన ట్రక్కుకు వాదనలుగా మనం పాస్ చేసే విలువలు కేటాయించబడతాయి.
మీరు చూడగలిగినట్లుగా, ఒక ట్రక్కును "నిర్మించడం", అనగా ఆబ్జెక్ట్ సృష్టి ప్రక్రియ సులభం కాదు. కానీ మేము దానిని చిన్న భాగాలుగా విభజించినట్లు అనిపిస్తుంది :)
GO TO FULL VERSION