
"హాయ్, అమిగో!"
"హాయ్, ఎల్లీ!"
"ఈ రోజు మనకు చాలా ఆసక్తికరమైన అంశం ఉంది. ఈ రోజు నేను మీకు సమూహ తరగతుల గురించి చెప్పబోతున్నాను."
"ఒక తరగతిని మరొక తరగతి లోపల ప్రకటించినట్లయితే, అది ఒక సమూహ తరగతి. నాన్-స్టాటిక్ నెస్టెడ్ తరగతులను అంతర్గత తరగతులు అంటారు."
"అంతర్గత తరగతి యొక్క వస్తువులు బాహ్య తరగతి యొక్క వస్తువుల లోపల గూడు కట్టబడి ఉంటాయి మరియు అందువల్ల బాహ్య తరగతి యొక్క వేరియబుల్స్ను యాక్సెస్ చేయగలవు."
public class Car
{
int height = 160;
ArrayList doors = new ArrayList();
public Car
{
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
}
class Door()
{
public int getDoorHeight()
{
return (int)(height * 0.80);
}
}
}
"డోర్ క్లాస్లో getDoorHeight పద్ధతి ఉందని గమనించండి. ఇది కార్ ఆబ్జెక్ట్ యొక్క ఎత్తు వేరియబుల్ని ఉపయోగిస్తుంది మరియు డోర్ యొక్క ఎత్తును అందిస్తుంది."

"ఒక డోర్ ఆబ్జెక్ట్ కార్ ఆబ్జెక్ట్ నుండి స్వతంత్రంగా ఉండదు. అన్నింటికంటే, ఇది కార్ ఆబ్జెక్ట్ యొక్క వేరియబుల్స్ను ఉపయోగిస్తుంది. కంపైలర్ అదృశ్యంగా కన్స్ట్రక్టర్కు మరియు డోర్ క్లాస్కు బాహ్య కార్ ఆబ్జెక్ట్కు సూచనను జోడిస్తుంది, తద్వారా లోపలి డోర్ క్లాస్ యొక్క పద్ధతులు బయటి కార్ క్లాస్ యొక్క వేరియబుల్స్ని యాక్సెస్ చేయవచ్చు మరియు దాని పద్ధతులను కాల్ చేయవచ్చు."
"నెస్టెడ్ ఆబ్జెక్ట్లు. నాకు అర్థమైంది. రేఖాచిత్రాన్ని బట్టి చూస్తే, ఇదంతా చాలా సూటిగా ఉంటుంది."
"అలాగే ఉంది. ఒకట్రెండు సూక్ష్మబేధాలు తప్ప."
"ఇన్నర్ డోర్ క్లాస్లో కార్ ఆబ్జెక్ట్కి సూచన ఉంది, కాబట్టి:"
1) మీరు కార్ క్లాస్లోని స్టాటిక్ మెథడ్లో డోర్ ఆబ్జెక్ట్ని సృష్టించలేరు, ఎందుకంటే స్టాటిక్ మెథడ్స్లో కార్ ఆబ్జెక్ట్కు సంబంధించిన రిఫరెన్స్ ఉండదు, అది డోర్ కన్స్ట్రక్టర్కు పరోక్షంగా పంపబడుతుంది.
సరైన | సరికాదు |
---|---|
|
|
2) డోర్ క్లాస్ స్టాటిక్ వేరియబుల్స్ లేదా మెథడ్స్ను కలిగి ఉండకూడదు.
సరైన | సరికాదు |
---|---|
|
|
"మరియు అన్ని డోర్ ఆబ్జెక్ట్ల ద్వారా భాగస్వామ్యం చేయబడిన వేరియబుల్ నాకు అవసరమైతే ఏమి చేయాలి?"
"మీరు దీన్ని ఎల్లప్పుడూ కార్ క్లాస్లో డిక్లేర్ చేయవచ్చు. తర్వాత అది కార్ ఆబ్జెక్ట్లో ఉన్న అన్ని డోర్ ఆబ్జెక్ట్ల ద్వారా షేర్ చేయబడుతుంది."
3) గమనిక: అంతర్గత తరగతి పబ్లిక్గా ప్రకటించబడితే, దాని ఉదాహరణలు బాహ్య తరగతి వెలుపల సృష్టించబడతాయి, అయితే బాహ్య తరగతికి సంబంధించిన ఒక ఉదాహరణ ముందుగా ఉండాలి:
Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();
4) మరియు నేను దాదాపు మరచిపోయిన మరో వ్యాఖ్య.
"మనకు రెండు సమూహ వస్తువులు ఉన్నందున, అంతర్గత వస్తువు యొక్క పద్ధతులు 'ఇది' అని పిలువబడే రెండు సూచనలకు ప్రాప్యతను కలిగి ఉంటాయి:"
public class Car
{
int width, height;
public class Door
{
int width, height;
public void setHeight(int height)
{
this.height = height;
}
public int getHeight()
{
if (height != 0)
return this.height;
else
return (int)(Car.this.height * 0.8);
}
}
"నేను ఉద్దేశపూర్వకంగా తరగతులలో అదే పేరుతో వేరియబుల్స్ ప్రకటించాను."
"అవుటర్ క్లాస్ నుండి వేరియబుల్ దాచబడినప్పుడు దాన్ని యాక్సెస్ చేయడానికి లేదా ఇన్నర్ క్లాస్ లోపల 'ఇది'ని యాక్సెస్ చేయడానికి, 'YourClassName.this' అని వ్రాయండి:"
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this
"కాబట్టి, మనం అంతర్గత తరగతి పద్ధతిలో 'ఇది' అని వ్రాస్తే, 'ఇది' అంతర్గత తరగతిని సూచిస్తుందా?"
"అవును ఖచ్చితంగా."
"అమిగో, అంతర్గత తరగతుల గురించి మీరు ఏమనుకుంటున్నారు?"
"అవి చాలా ఆసక్తికరంగా ఉన్నాయి. అవి చాలా కష్టంగా ఉన్నాయని నేను చెప్పను."
"చాలా పరిమితులు ఉన్నాయి, కానీ ఆ పరిమితులు ఎక్కడ నుండి వచ్చాయి మరియు అవి ఎందుకు ఉన్నాయి అని మీరు వివరించిన తర్వాత అవి చాలా తార్కికంగా కనిపిస్తాయి."
"ప్లస్, నేను రెండు నెలలుగా టాస్క్లలో నెస్టెడ్ క్లాస్లు రాస్తున్నాను, కానీ నేను నిజంగా ఏమి వ్రాస్తున్నానో ఇప్పుడే గ్రహించాను."
"గొప్ప పాఠానికి ధన్యవాదాలు, ఎల్లీ."
"మీకు నచ్చినందుకు నేను సంతోషిస్తున్నాను, అమిగో."
GO TO FULL VERSION