अगर मुझे यह प्रश्न मुख्य रूप से राय आधारित है, तो मुझे क्षमा करें, लेकिन मुझे लगता है कि यह नहीं है और पसंद के लिए एक अच्छा कारण है। तो, यहां एक उदाहरण है। क्षमा करें, यह वास्तव में लंबे समय से है, लेकिन बहुत ही आसान है:ओवरराइडिंग बनाम ओवरलोडिंग
इंटरफ़ेस:
public interface Shape
{
double area();
}
को लागू वर्ग 1:
import static java.lang.Math.PI;
public class Circle implements Shape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public double area()
{
return PI*radius*radius;
}
}
को लागू वर्ग 2:
public class Square implements Shape
{
private double size;
public Square(double sideLength)
{
size = sideLength;
}
public double area()
{
return size*size;
}
}
चालक:
Shape[] shapes = new Shape[]{new Circle (5.3), new Square (2.4)};
System.out.println(shapes[0].area()); //prints 88.247...
System.out.println(shapes[1].area()); //prints 5.76
यह .area()
से काम करता है Circle
और Square
द्वारा ओवरराइड किया गया है। अब, यहां मेरा प्रश्न वास्तव में शुरू होता है। मान लीजिए कि चालक इन तरीकों है करते हैं:
public static void whatIs(Shape s)
{
System.out.println("Shape");
}
public static void whatIs(Circle s)
{
System.out.println("Circle");
}
public static void whatIs(Square s)
{
System.out.println("Square");
}
अगर हम कहते हैं:
whatIs(shapes[0]); //prints "Shape"
whatIs(shapes[1]); //prints "Shape"
यह इसलिए होता है क्योंकि जावा Shape
रों के रूप में वस्तुओं की व्याख्या और नहीं Circle
और Square
।
if (shapes[0] instanceof Circle)
{
whatIs((Circle) shapes[0]); //prints "Circle"
}
if (shapes[1] instanceof Square)
{
whatIs((Square) shapes[1]); //prints "Square"
}
अब जब हम एक पृष्ठभूमि है मेरे सवाल है: बेशक हम के माध्यम से वांछित परिणाम प्राप्त कर सकते हैं? "आकार"
किन वजहों से संकलक/भाषा डिजाइन ऐसा है कि whatIs(shapes[0]);
प्रिंट होगा करने के लिए योगदान जैसा कि, जावा कंपाइलर संबंधित वस्तुओं के लिए ओवरराइड विधियों के बीच सटीक रूप से अंतर क्यों कर सकता है, लेकिन अधिभारित विधियों को नहीं? विशेष रूप से, अगर केवल तरीकों कि ड्राइवर का उपयोग करने के लिए किया हैं:
public static void whatIs(Circle s)
{
System.out.println("Circle");
}
public static void whatIs(Square s)
{
System.out.println("Square");
}
और हम कॉल करने का प्रयास,
whatIs(shapes[0]);
whatIs(shapes[1]);
हम दो त्रुटियों (Square
के लिए एक और Circle
के लिए एक) मिल जाएगा यह दर्शाता है कि:
- विधि Driver.whatIs (वर्ग) लागू नहीं है
- वास्तविक तर्क आकार विधि मंगलाचरण रूपांतरण
तो, फिर से, अब है कि हम बुनियादी तथ्य, क्यों जावा की तरह एक स्थिति नहीं संभाल कर सकते हैं मिल गया है द्वारा स्क्वायर के लिए नहीं बदला जा सकता इस? जैसा कि, यह दक्षता चिंताओं के कारण किया जाता है, क्या कुछ डिजाइन निर्णयों के कारण यह संभव नहीं है, क्या यह किसी कारण से बुरा व्यवहार है, आदि?
इसके अलावा, अगर किसी के पास शीर्षक के लिए बेहतर विचार है, तो कृपया कोई सुझाव दें या इसे संपादित करें, मुझे पता है कि यह शायद सबसे अच्छा नहीं है, लेकिन कुछ भी बेहतर नहीं सोच सकता है। उन सभी के लिए धन्यवाद जिन्होंने इस पोस्ट के माध्यम से इसे बनाया! –
मैं आपको [जेएलएस अनुभाग 15.2.2] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2) (ओवरलोडिंग) के माध्यम से जाने का सुझाव देता हूं और [जेएलएस अनुभाग 8.4.8.1] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.1) (ओवरराइडिंग) –
दिलचस्प सवाल, और @ रोहितजैन टिप्पणी के लिए धन्यवाद, मुझे उनको भी पढ़ना होगा। –