హాయ్! ఈ రోజు మనం ఆబ్జెక్ట్ ఓరియెంటెడ్ ప్రోగ్రామింగ్ (OOP) యొక్క ఒక సూత్రాన్ని నిశితంగా పరిశీలిస్తాము: వారసత్వం. మేము తరగతుల మధ్య ఇతర రకాల సంబంధాలను కూడా అధ్యయనం చేస్తాము: కంపోజిషన్ మరియు అగ్రిగేషన్.
ఈ అంశం కష్టం కాదు: మీరు ఇప్పటికే గత పాఠాలలో అనేక సార్లు వారసత్వం మరియు వారసత్వ ఉదాహరణలను ఎదుర్కొన్నారు. ఈ రోజు, ప్రధాన విషయం ఏమిటంటే, మీ జ్ఞానాన్ని బలోపేతం చేయడం, వారసత్వం యొక్క యంత్రాంగాన్ని మరింత వివరంగా పరిశీలించడం మరియు మరోసారి కొన్ని ఉదాహరణల ద్వారా అమలు చేయడం. :) సరే, వెళ్దాం!
మేము రెండు డజన్ల కార్ క్లాస్లను కలిగి ఉన్నప్పుడు, డూప్లికేట్ కోడ్ మొత్తం నిజంగా తీవ్రంగా మారుతుంది. సాధారణ ఫీల్డ్లు మరియు పద్ధతులను (దీనిని "స్టేట్స్" మరియు "బిహేవియర్స్" అని కూడా పిలుస్తారు) పేరెంట్ క్లాస్కి తరలించడం వల్ల మనం చాలా సమయం మరియు స్థలాన్ని ఆదా చేయవచ్చు. కొన్ని రకాల ప్రత్యేక లక్షణాలు లేదా ఇతర కార్ టైప్లకు లేని పద్ధతులను కలిగి ఉంటే, పెద్ద విషయం ఏమీ లేదు. మీరు వారిని ఎల్లప్పుడూ డిసెండెంట్ క్లాస్లో, అందరి నుండి వేరుగా సృష్టించవచ్చు.
ఫీల్డ్ల విషయంలో కూడా ఇదే వర్తిస్తుంది: పిల్లల తరగతికి ప్రత్యేకమైన లక్షణాలు ఉంటే, మేము ఈ ఫీల్డ్లను చైల్డ్ క్లాస్ లోపల ప్రశాంతంగా ప్రకటించి, చింతించడాన్ని ఆపివేస్తాము. :) కోడ్ని తిరిగి ఉపయోగించగల సామర్థ్యం వారసత్వం యొక్క ప్రధాన ప్రయోజనం. ప్రోగ్రామర్లకు, అదనపు కోడ్ రాయకుండా ఉండటం చాలా ముఖ్యం. మీ పనిలో మీరు దీన్ని పదేపదే చూస్తారు. దయచేసి మరొక ముఖ్యమైన విషయం గుర్తుంచుకోండి: జావాకు బహుళ వారసత్వం లేదు. ప్రతి తరగతి ఒక తరగతిని మాత్రమే వారసత్వంగా పొందుతుంది. మేము భవిష్యత్ పాఠాలలో దీనికి గల కారణాల గురించి మరింత మాట్లాడుతాము. ప్రస్తుతానికి, గుర్తుంచుకోండి. మార్గం ద్వారా, ఇది జావాను కొన్ని ఇతర OOP భాషల నుండి భిన్నంగా చేస్తుంది. ఉదాహరణకు, C++ బహుళ వారసత్వానికి మద్దతు ఇస్తుంది. వారసత్వంతో ప్రతిదీ ఎక్కువ లేదా తక్కువ స్పష్టంగా ఉంటుంది. ముందుకు వెళ్దాం.

జావాలో వారసత్వం మరియు దాని ప్రయోజనాలు
మీకు ఖచ్చితంగా గుర్తున్నట్లుగా, వారసత్వం అనేది ఇప్పటికే ఉన్న తరగతి (పేరెంట్ క్లాస్) ఆధారంగా కొత్త తరగతిని వివరించడానికి మిమ్మల్ని అనుమతించే ఒక మెకానిజం. అలా చేయడం ద్వారా, కొత్త తరగతి మాతృ తరగతి యొక్క లక్షణాలు మరియు కార్యాచరణను తీసుకుంటుంది. మునుపటి పాఠాలలో ఇచ్చిన వారసత్వం యొక్క ఉదాహరణను గుర్తుచేసుకుందాం:
public class Car {
private String model;
private int maxSpeed;
private int yearOfManufacture;
public Car(String model, int maxSpeed, int yearOfManufacture) {
this.model = model;
this.maxSpeed = maxSpeed;
this.yearOfManufacture = yearOfManufacture;
}
public void gas() {
// Gas
}
public void brake() {
// Brake
}
}
public class Truck extends Car {
public Truck(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
public class Sedan extends Car {
public Sedan(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
మేము వివిధ రకాల కార్లతో పని చేసే నిర్దిష్ట ప్రోగ్రామ్ని కలిగి ఉన్నాము. మీరు కారు ప్రియులు కాకపోయినా, ప్రపంచంలో అనేక రకాల కార్లు ఉన్నాయని మీకు తెలిసి ఉండవచ్చు. :) దీని ప్రకారం, మేము కార్ల యొక్క సాధారణ లక్షణాలను అనే సాధారణ పేరెంట్ క్లాస్గా విభజిస్తాము Car
. కాబట్టి వాటి రకంతో సంబంధం లేకుండా అన్ని కార్లకు సాధారణం ఏమిటి? ప్రతి కారుకు ఒక సంవత్సరం తయారీ, మోడల్ పేరు మరియు గరిష్ట వేగం ఉంటుంది. model
మేము ఈ లక్షణాలను , maxSpeed
, మరియు ఫీల్డ్లలో ఉంచాము yearOfManufacture
. ప్రవర్తన విషయానికొస్తే, ఏదైనా కారు వేగవంతం మరియు వేగాన్ని తగ్గించగలదు. :) మేము ఈ ప్రవర్తనను gas()
మరియుbrake()
పద్ధతులు. ఇది మనకు ఎలాంటి ప్రయోజనాలను ఇస్తుంది? అన్నింటిలో మొదటిది, ఇది కోడ్ మొత్తాన్ని తగ్గిస్తుంది. వాస్తవానికి, మేము పేరెంట్ క్లాస్ లేకుండా చేయవచ్చు. కానీ ప్రతి కారు తప్పనిసరిగా వేగవంతం మరియు వేగాన్ని తగ్గించగలగాలి కాబట్టి, మేము , , , మరియు తరగతులు మరియు ప్రతి ఇతర కార్ క్లాస్లో పద్ధతులను సృష్టించాలి gas()
మరియు చేయాలి. మనం ఎంత అదనపు కోడ్ వ్రాయవలసి ఉంటుందో ఊహించండి. మరియు , , మరియు ఫీల్డ్ల గురించి మర్చిపోవద్దు : మనం పేరెంట్ క్లాస్ని తొలగిస్తే, మేము వాటిని ప్రతి కార్ క్లాస్లో సృష్టించాలి! brake()
Truck
Sedan
F1Car
SportsCar
model
maxSpeed
yearOfManufacture

public class F1Car extends Car {
public void pitStop() {
// Only race cars make pit stops
}
public static void main(String[] args) {
F1Car formula1Car = new F1Car();
formula1Car.gas();
formula1Car.pitStop();
formula1Car.brake();
}
}
ఉదాహరణగా ఫార్ములా వన్ రేస్ కార్లను చూద్దాం. వారి "బంధువులు" కాకుండా, వారు ప్రత్యేకమైన ప్రవర్తనను కలిగి ఉంటారు - వారు ఎప్పటికప్పుడు పిట్ స్టాప్ తీసుకుంటారు. ఇది మాకు ఇబ్బంది కలిగించదు. మాతృ తరగతిలోని సాధారణ ప్రవర్తనను మేము ఇప్పటికే వివరించాము Car
మరియు సంతతి తరగతుల నిర్దిష్ట ప్రవర్తనను ఆ తరగతులకు జోడించవచ్చు. 
కంపోజిషన్ మరియు అగ్రిగేషన్
తరగతులు మరియు వస్తువులను ఒకదానితో ఒకటి అనుసంధానించవచ్చు. వారసత్వం అనేది "ఇస్-ఎ" సంబంధాన్ని వివరిస్తుంది. సింహం ఒక జంతువు. అటువంటి సంబంధం వారసత్వాన్ని ఉపయోగించి సులభంగా వ్యక్తీకరించబడుతుంది, ఇక్కడAnimal
పేరెంట్ క్లాస్ మరియు Lion
బిడ్డ. అయితే, అన్ని సంబంధాలు ఈ విధంగా వివరించబడలేదు. ఉదాహరణకు, కీబోర్డ్ ఖచ్చితంగా కంప్యూటర్కు సంబంధించినది, కానీ అది కంప్యూటర్ కాదు . చేతులు ఏదో ఒక వ్యక్తికి సంబంధించినవి, కానీ అవి ఒక వ్యక్తి కాదు. ఈ సందర్భాలలో, మనకు మరొక రకమైన సంబంధం ఉంది: "is-a" కాదు, కానీ "has-a". చేయి ఒక వ్యక్తి కాదు, ఒక వ్యక్తిలో భాగం. కీబోర్డ్ అనేది కంప్యూటర్ కాదు, ఇది కంప్యూటర్లో భాగం. సంవిధానం మరియు సముదాయాన్ని ఉపయోగించి కోడ్లో కలిగి-సంబంధాన్ని వివరించవచ్చు. వ్యత్యాసం సంబంధం యొక్క "కఠినత" లో ఉంది. ఒక సాధారణ ఉదాహరణ ఇద్దాం: మాకు ఒక Car
తరగతి ఉంది. ప్రతి కారులో ఇంజన్ ఉంటుంది. అదనంగా, ప్రతి కారులో ప్రయాణీకులు ఉంటారు. Engine engine
మరియు ఫీల్డ్ల మధ్య ప్రాథమిక తేడా ఏమిటి Passenger[] passengers
? A
ప్రయాణీకుడు కారులో కూర్చున్నాడు అంటే ప్రయాణీకులు B
మరియు C
కారులో లేరని అర్థం కాదు. ఒక కారు బహుళ ప్రయాణీకులకు అనుగుణంగా ఉంటుంది. అంతేకాదు, ప్రయాణీకులందరూ కారు నుండి దిగితే, అది సజావుగా పనిచేస్తుంది. Car
తరగతి మరియు శ్రేణి మధ్య సంబంధం Passenger[] passengers
తక్కువ కఠినంగా ఉంటుంది. దానిని అగ్రిగేషన్ అంటారు . ఇది అగ్రిగేషన్కు మరొక మంచి ఉదాహరణను అందిస్తుంది. మనకు Student
క్లాస్ మరియు ఎ ఉన్నాయి అనుకుందాంStudentGroup
తరగతి. ఒక విద్యార్థి బహుళ విద్యార్థి సంస్థలలో చేరవచ్చు: ఫిజిక్స్ క్లబ్, స్టార్ వార్స్ ఫ్యాన్ క్లబ్ మరియు/లేదా స్టూడెంట్ కామెడీ క్లబ్. కంపోజిషన్ అనేది ఒక కఠినమైన సంబంధం. కూర్పును ఉపయోగిస్తున్నప్పుడు, ఒక వస్తువు కొంత వస్తువులో భాగం మరియు అదే రకమైన మరొక వస్తువుకు చెందినది కాదు. సరళమైన ఉదాహరణ కారు ఇంజిన్. ఇంజిన్ కారులో భాగం మరియు మరొక కారులో భాగం కాకూడదు. మీరు చూడగలిగినట్లుగా, వారి సంబంధం Car
మరియు మధ్య సంబంధం కంటే చాలా కఠినమైనది Passengers
. 
GO TO FULL VERSION