मैं अपने सिर दौर पाने के लिए जावा का चयन करता है जो विधि निष्पादित किया जाता है कोशिश कर रहा हूँ:जावा ओवरलोडिंग विधि चयन
//Example 1 prints Square:add(Figure)
Figure fs = new Square();
fs.add(fs);
//Example 2 prints Square:add(Figure)
Rectangle rs = new Square();
rs.add(fs);
//Example 3 prints Rectangle:add(Rectangle). Expected Square:add(Square)
rs.add(new Square());
//Example 4 prints Rectangle:add(Rectangle). Expected Square:add(Figure)
Square ss = new Square();
ss.add(rs);
class Figure
{
public void add(Figure f){ System.out.println("Figure:add(Figure)"); }
}
class Rectangle extends Figure
{
@Override
public void add(Figure f){ System.out.println("Rectangle:add(Figure)"); }
public void add(Rectangle r){ System.out.println("Rectangle:add(Rectangle)"); }
}
class Square extends Rectangle
{
@Override
public void add(Figure f){ System.out.println("Square:add(Figure)"); }
public void add(Square s){ System.out.println("Square:add(Square)"); }
}
मैं here क्या सीखा है
- विधि हस्ताक्षर के आधार पर निर्धारित हो जाता है संकलित समय डेटा प्रकार
- वास्तविक विधि लागू वस्तु जिस विधि को विधि कहा जाता है उस गतिशील प्रकार पर निर्भर करता है।
उस आधार पर, पहले दो कॉल का परिणाम अपेक्षा के अनुरूप है। हालांकि, मैं उदाहरण 3 और 4 के परिणाम को समझ नहीं पा रहा हूं।
ऐसा लगता है कि यह java language specification में निर्दिष्ट है, लेकिन मुझे यह समझ में नहीं आता है।
इस असाइनमेंट प्रश्न के लेखक के रूप में मैं पुष्टि कर सकता हूं कि प्रदान किए गए उत्तर सही हैं। – Dominik