/ ओवरलोडिंग और ओवरराइडिंग के साथ जावा विधि चयन - जावा, ओवरलोडिंग, ओवरराइड, डायनामिक-बाइंडिंग, स्टेटिक-बाइंडिंग

अधिक ओवरलोडिंग और ओवरराइडिंग के साथ जावा विधि चयन-जावा, ओवरलोडिंग, अवहेलना, गतिशील-बाध्यकारी, स्थैतिक-बाइंडिंग

ओवरराइडिंग और ओवरलोडिंग के बारे में कुछ सिद्धांतों को समझने के लिए मेरे पास कठिन समय है।

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");
}

दूसरा सवाल:

आपके पास वास्तव में एक संकलन त्रुटि होगी, इसलिएचर क्यू के प्रकार के बारे में तर्क करना "कोई मतलब नहीं है: ऐसा कोई चर नहीं होगा, क्योंकि कोड संकलित नहीं करता है, और वर्ग इस प्रकार संकलक द्वारा उत्पन्न नहीं होता है।