2015-10-18 7 views
5

इस उदाहरण में जावा वेबसाइट के ट्यूटोरियल page पर। दो इंटरफेस एक ही डिफ़ॉल्ट विधि startEngine() परिभाषित करते हैं। एक वर्ग FlyingCar दोनों इंटरफेस लागू करता है और स्पष्ट संघर्ष के कारण startEngine() को ओवरराइड करना होगा।इस जावा उदाहरण में "सुपर" कीवर्ड के बारे में उलझन में

public interface OperateCar { 
    // ... 
    default public int startEngine(EncryptedKey key) { 
     // Implementation 
    } 
} 
public interface FlyCar { 
    // ... 
    default public int startEngine(EncryptedKey key) { 
     // Implementation 
    } 
} 

public class FlyingCar implements OperateCar, FlyCar { 
    // ... 
    public int startEngine(EncryptedKey key) { 
     FlyCar.super.startEngine(key); 
     OperateCar.super.startEngine(key); 
    } 
} 

मुझे समझ नहीं आता क्यों, FlyingCar से, superOperateCar और FlyCar इंटरफेस में startEngine() के दोनों संस्करणों के लिए किया जाता रहा है। जैसा कि मैं इसे समझता हूं, startEngine() किसी भी सुपर क्लास में परिभाषित नहीं किया गया था, इसलिए इसे एक में निवासी के रूप में संदर्भित नहीं किया जाना चाहिए। मैं भी super और दो इंटरफेस के बीच किसी भी रिश्ते FlyingCar

+4

' सुपर 'अपने आप से सुपरक्लास का मतलब है। जावा 8 में 'FlyCar.super' नया है, और इंटरफ़ेस' FlyCar' में कार्यान्वयन का मतलब है। – immibis

+1

देखें http://stackoverflow.com/questions/19976487/explicitly-calling-a-default-method-in-java – Eran

+1

उदाहरण कोड को निकालने के बजाय आप उस ट्यूटोरियल को क्यों नहीं पढ़ते? – Holger

उत्तर

5

में लागू के रूप में मैं इसे समझ के रूप में नहीं देखते हैं, startEngine() किसी भी सुपर वर्ग में परिभाषित नहीं किया गया था, इसलिए एक के निवासी के रूप में संदर्भित नहीं किया जाना चाहिए।

हां इसे परिभाषित किया गया था। यह उदाहरण के लिए डिफ़ॉल्ट कार्यान्वयन दिया गया है:

public interface OperateCar { 
    // ... 
    default public int startEngine(EncryptedKey key) { 
     // Implementation 
    } 
} 

OperateCar.super.startEngine(key) डिफ़ॉल्ट कार्यान्वयन पर अमल होगा।

अगर कोई डिफ़ॉल्ट कार्यान्वयन, बस एक अंतरफलक विधि थी, तो बयान कोई मतलब नहीं होगा, के रूप में इंटरफ़ेस एक कार्यान्वयन, इस तरह शामिल नहीं होगा:

public interface OperateCar { 
    // ... 
    int startEngine(EncryptedKey key); 
} 

मैं भी सुपर और दो इंटरफेस के बीच किसी भी रिश्ते FlyingCar में लागू नहीं दिख रहा है

सुनिश्चित नहीं हैं कि मैं समझता हूँ कि क्या तुम पूछ रहे हो super पैरेंट इंटरफ़ेस में कार्यान्वयन को कॉल करने का एक तरीका है। super के बिना, इसे व्यक्त करने का कोई और तरीका नहीं है।

+0

मुझे पता है कि एक डिफ़ॉल्ट कार्यान्वयन है, लेकिन क्या आपका मतलब है कि यह एक डिफ़ॉल्ट वर्ग (सुपर) मानता है जिस पर यह डिफ़ॉल्ट कार्यान्वयन किया गया था? यह उस तरह तार्किक भावना बनाता है। और यदि कोई डिफ़ॉल्ट सुपर क्लास है, तो अब मैं दो इंटरफेस और 'सुपर' के बीच संबंध देख सकता हूं। –

+2

@okeyxyz: "डिफ़ॉल्ट सुपर क्लास" जैसी कोई चीज़ नहीं है और यह स्पष्ट नहीं है कि आप ऐसा क्यों सोचते हैं। 'InterfaceName.super' एक कार्यान्वयन वर्ग से एक गैर-अमूर्त इंटरफ़ेस विधि को कॉल करने के लिए वाक्यविन्यास है। बस। ऐसा लगता है * क्योंकि जावा भाषा डिजाइनरों ने ऐसा कहा *। इन गैर-अमूर्त इंटरफ़ेस विधियों को 'डिफ़ॉल्ट' विधियां कहा जाता है, क्योंकि उन्हें उस कीवर्ड को गैर-सारणी के रूप में चिह्नित करने की आवश्यकता होती है। यह पिछले भाषा संस्करणों के साथ संगत रहने के लिए है जहां 'सार' का अर्थ है, भले ही निर्दिष्ट नहीं किया गया * और * क्योंकि जावा भाषा डिजाइनरों ने ऐसा कहा था। – Holger

5

जब आपके पास एकाधिक इंटरफेस लागू करने वाली कक्षा होती है, और उन इंटरफेस में समान विधि हस्ताक्षर के साथ विधियां होती हैं (उदाहरण के लिए आपकी स्टार्टइंजिन विधि)।

आदेश पता करने के लिए कौन सी विधि आप की बात कर रहे है, तो आप कार्य करें:

yourInterface.super.method(); 

आप इस link जो भी अपने प्रश्न के पते पर एक नज़र ले जा सकते हैं।

तो, आप भी ऐसा कर सकता है:

public class FlyingCar implements FlyCar, OperateCar{ 
    public int startEngine(EncryptedKey key) { 
     return FlyCar.super.startEngine(key); 
    } 
} 

या इस:

public class FlyingCar implements FlyCar, OperateCar{ 
    public int startEngine(EncryptedKey key) { 
     return Operate.super.startEngine(key); 
    } 
} 

किसी भी तरह से, आप, आप किसी भी इंटरफ़ेस से विधि बुला रहे हैं निर्दिष्ट करने के लिए है, तो आप बस बुला रहे हैं इंटरफ़ेस से विधि।

हालांकि, यह विशेष स्थिति किसी कारण के लिए एक उदाहरण है।

public int startEngine(EncryptedKey key) { 
    // Custom implemenation... 
} 

कौन सा भी मान्य है: क्या अधिक होने की संभावना हो जाएगा कि आप कुछ इस तरह कर रही हो जाएगा। हालांकि, यह विस्तार है कि यदि आप एक विधि एक समान हस्ताक्षर है, वह भी एक स्थिति आप एक ही माता पिता के इंटरफेस है कि विधि की घोषणा होनी ही चाहिए हो सकता है है के साथ दो इंटरफेस है, और दो बच्चे इंटरफेस है:

public interface Car { 
    // ... 
    default public int startEngine(EncryptedKey key) { 
     // Default implementation 
}; 
} 

public interface FlyCar extends Car { 
    // Methods unique to FlyCar 
} 

public interface OperateCar extends Car { 
    // methods unique to OperateCar 
} 
+4

** Reamrks: ** ध्यान दें कि *** डिफ़ॉल्ट *** संशोधक केवल जावा 8 में उपलब्ध है। – user3437460

संबंधित मुद्दे