मेरे पास एक ए विधि के साथ एक इंटरफ़ेस है getT()
, abstract B class
विधि के साथ getS()
तथा class C
वह फैलता है B class
कौन कौन से implements A interface
। मैं तरीकों से ओवरराइडिंग कर रहा हूं A
इंटरफ़ेस और B
सुपरक्लास अंदर C
उपवर्ग। फिर में main
विधि मैं तुरंत C
वर्ग टाइपो अगर A
इस तरह: A obj = new C();
मैं "कॉल करने में सक्षम हूं getT()
से obj
, लेकिन "टी कॉल" कर सकते हैं getS()
तरीका। मैं कैसे कॉल कर सकता हूं getS()
से विधि obj
, लेकिन मैं "के प्रकार को बदल नहीं सकता obj
, इसे होना चाहिए A
। यहां कोड है:
इंटरफ़ेस ए:
public interface A {
public String getT();
}
सार वर्ग B:
public abstract class B implements A {
public abstract String getS();
}
उपवर्ग C:
public class C extends B {
@Override
public String getT() {
System.out.println("method getT() from C class");
return null;
}
@Override
public String getS() {
return null;
}
}
और टी वर्ग के अंदर मुख्य विधि:
public class T {
public static void main(String[] args) {
A obj = new C();
obj.getT();
}
}
उत्तर:
उत्तर № 1 के लिए 1प्रकार के संदर्भ चर के साथ A
, आप कॉल नहीं कर सकते getS()
, क्योंकि यह किसी भी प्रकार का हो सकता है जो लागू हो A
, कहते हैं AImplementer
, कि doesn "टी से विस्तार B
। कोई भी A
ऑब्जेक्ट doesn "t जरूरी है एक getS()
तरीका। यह केवल एक होने की गारंटी है getT()
तरीका।
अगर obj
एक प्रकार होना चाहिए A
और आपको कॉल करने की आवश्यकता है getS()
, फिर शामिल करें getS()
की परिभाषा में विधि A
इंटरफेस:
public interface A {
public String getT();
public String getS(); // Add this line.
}
फिर B
अभी भी है A
, और आप कॉल कर सकते हैं getS()
एक पर A
संदर्भ चर।
वैसे, मैं कोई भी नहीं देखता हूं static
आपके कोड में तरीके। स्थैतिक तरीकों को ओवरराइड नहीं किया जा सकता है।
उत्तर № 2 के लिए 1
विधि तक पहुंच प्राप्त करने के लिए आपको बी को ओब्जेक्ट करना होगा।
तो तुम हो सकता है:
((B)obj).getS();
downcasting: http://www.programmerinterview.com/index.php/java-questions/downcasting-in-java/
जवाब के लिए 0 № 3
ओबीज का प्रकार ए है, लेकिन ए हैन "टी मेथड गेट्स () है तो आप मुख्य पद्धति में कॉल नहीं कर सकते हैं। obj को कक्षा B या वर्ग C होना चाहिए।