ओवरराइडिंग और ओवरलोडिंग के बारे में कुछ सिद्धांतों को समझने के लिए मेरे पास कठिन समय है।
public class Figure{
public void stampa(Figure f){
System.out.println("Figure");
}
}
public class Square extends Figure{
public void stampa(Square q){
System.out.println("Square");
}
}
public class Rectangle extends Square{
public void stampa(Rectangle r){
System.out.println("Rectangle");
}
public void stampa(Square r){
System.out.println("Particular Rectangle");
}
public void stampa(Figure f){
System.out.println("Particular Figure");
}
}
public class Test{
public static void main(String args[]){
Figure f1,f2;
Square q = new Rectangle();
Rectangle r = new Rectangle();
f1 = new Square();
f2 = new Rectangle();
f1.stampa(f2); //Figure
q.stampa(r); //Particular Rectangle
f1.stampa(q); //Figure
q.stampa(f1); //Particular Figure
q.stampa(q); //Particupar Rectangle
}
}
मुझे पता है कि public void stampa(Square q)
ओवरलोडिंग है public void stampa(Figure f)
और इसे ओवरराइड नहीं करना चाहिए।
तथा public void stampa(Rectangle r)
तथा public void stampa(Figure f)
ओवरलोडिंग भी कर रहे हैं public void stampa(Square q)
.
भी public void stampa(Square q)
आयत वर्ग में वर्ग वर्ग में विधि को पछाड़ रहा है।
पहला प्रश्न
यह इस परिणाम के बारे में है: q.stampa(f1); //Particular Figure
मुझे पता है कि संकलन-समय पर q
है एक Square
इसलिए मैं इस विधि को देखूंगा public void stampa(Square q)
में Square
कक्षा। और रन-टाइम पर q
है Rectangle
इसलिए मैंने सोचा कि परिणाम "विशेष चित्र" के बजाय "विशेष आयत" हो सकता है
मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूँ
दूसरा सवाल
यदि इस समय Rectangle
फैली Figure
और कोई और नहीं Square
, मैं निश्चित रूप से संकलन त्रुटि होगी Square q = new Rectangle();
वैरीबेल का क्या होता है q
(वहाँ एक चर के रूप में किया जाएगा Square q
या हमारे पास q नाम के साथ कोई भिन्न नहीं है?) और इसका परिणाम क्या होगा q.stampa(f1);
धन्यवाद और मेरी अंग्रेजी के लिए खेद है और कृपया मुझे सही करें अगर मैं कुछ बिंदु पर गलत हूं।
उत्तर:
जवाब के लिए 3 № 1मुझे पता है कि संकलन-समय पर
q
है एकSquare
इसलिए मैं इस विधि को देखूंगाpublic void stampa(Square q)
वर्ग वर्ग में।
आप भूल रहे हैं Square
शामिल दो विधि: stampa(Square q)
तथा stampa(Figure f)
। उत्तरार्द्ध से विरासत में मिला है Figure
और संकलन समय पर चयनित किया जाता है अधिकांश केवल उचित अधिभार।
और रन-टाइम पर
q
आयत है इसलिए मैंने सोचा कि परिणाम "विशेष चित्र" के बजाय "विशेष आयत" हो सकता है
ओवरलोड को संकलन समय पर चुना जाता है, और रनटाइम पर ओवरराइड किया जाता है। जैसा कि कहा गया, stampa(Figure f)
पहले से ही संकलन समय पर चयनित है। एक बार यह वास्तव में आह्वान किया, रनटाइम देखता है कि q
का एक उदाहरण है Rectangle
और आह्वान को दर्शाता है Rectangle.stampa(Figure f)
.
दूसरे प्रश्न के रूप में, मैं वास्तव में आप क्या पूछ रहा हूँ समझ में नहीं आता है। एक संकलन त्रुटि का अर्थ है कि कोड अमान्य है और कुछ भी नहीं होता है। q.stampa(f1)
कभी नहीं बुलाया जाएगा और एक परिणाम कभी नहीं लौटेगा।
जवाब के लिए 3 № 2
पहला प्रश्न:
q
घोषित प्रकार वर्ग है। f1
"घोषित प्रकार चित्रा है। इसलिए कंपाइलर क्लास स्क्वायर और उसके सुपरक्लास में स्टैम्पा नाम की एक विधि की तलाश करता है, अगर एक चित्र (या चित्रा के सुपरक्लास) को स्वीकार करने वाली विधि मौजूद है। यह एक चित्र पाता है: public void stampa(Figure f)
। संकलन के समय, चर के घोषित प्रकार क्या मायने रखते हैं।
अब, रनटाइम पर, ऑब्जेक्ट द्वारा वास्तविक रनटाइम प्रकार को संदर्भित किया जाता है q
जांच की जाती है: यह एक आयत है। इसलिए रनटाइम एक विधि की तलाश में है public void stampa(Figure f)
यह आयत में, और उसके सभी सुपरक्लेसेस में चित्रा विधि को ओवरराइड करता है। यह बहुरूपता की अनुमति देता है। यह आयत में पाया गया है:
public void stampa(Figure f) {
System.out.println("Particular Figure");
}
दूसरा सवाल:
आपके पास वास्तव में एक संकलन त्रुटि होगी, इसलिएचर क्यू के प्रकार के बारे में तर्क करना "कोई मतलब नहीं है: ऐसा कोई चर नहीं होगा, क्योंकि कोड संकलित नहीं करता है, और वर्ग इस प्रकार संकलक द्वारा उत्पन्न नहीं होता है।