2012-03-14 29 views
6

मुझे पता है कि मुख्य() को कक्षा में अधिभारित किया जा सकता है जिसमें संकलक हमेशा String[] args के साथ तर्क लेता है जहां से मुख्य विधि के रूप में निष्पादन शुरू होता है। लेकिनक्या हमारे पास इस इंटरफेस को लागू करने वाले वर्गों में मुख्य() के लिए एक इंटरफ़ेस और विभिन्न कार्यान्वयन में एक मुख्य() हो सकता है?

package test; 
interface test 
{ 
    public void main(String args[]); 
    public void display(); 
} 



package test; 
class Testclass1 implements test 
{ 
    public void display() 
    { 
     System.out.println("hello"); 
    } 
    public static void main(String[] args) 
    { 
     test t; 
     t.display(); 
    } 
} 


package temp; 
import test.*; 
abstract class Testclass2 implements test 
{ 
    public static void main(String args[]) 
    { 
     System.out.println("TESTING"); 
    } 
} 

उत्तर

12

नहीं, आप नहीं कर सकते हैं, क्योंकि main को प्रवेश बिंदु के रूप में उपयोग करने के लिए स्थैतिक होना चाहिए, और इंटरफेस स्थिर के उपयोग की अनुमति नहीं देते हैं।

+0

यह एकमात्र उत्तर +1 है। – Lion

+1

और अभी तक और अधिक जवाब हैं। ;) –

-2
इस

एक संकलक त्रुटि है, तो यह संभव ही

main(String args[]) in an interface and implement it in different classes differently? 

उदाहरण के लिए घोषित करने के लिए है। आप एक गैर स्थैतिक इंटरफ़ेस को एक स्थिर विधि

-1

मुझे लगता है कि आप कुछ खो रहे हैं। स्टेटिक विधियां (जैसे Testclass1 और Testclass2 में मुख्य विधि) उपclass विधियों को ओवरराइड नहीं कर सकती हैं।

+0

इंटरफेस 'नहीं हो सकता सब पर static' तरीकों! – Rakesh

+0

मैंने कहा कि यह कहां हो सकता है? चीज़ – Johannes

+0

आप ऐसा नहीं कहा यह या तो नहीं कर सकता! – Rakesh

2

आपके प्रश्न के लिए दो जवाब हैं।

  1. सबसे पहले, आप एक Interface
  2. में static तरीकों हाँ आप main() विधि ओवरलोड कर सकते हैं नहीं हो सकता है, लेकिन जब आप अपने वर्ग का शुभारंभ, केवल public static void main(String args[]){} विधि एक प्रवेश बिंदु के रूप में माना जाएगा।

उदाहरण के लिए

public class Test { 
    public static void main(String[] args) { 
     System.out.println("entry point)"); 
    } 

    public static void main(String arg1) { 
     System.out.println("overload2"); 
    } 

    public static void main(String arg1, String arg2) { 
     System.out.println("overload3"); 
    } 
} 

जब आप ऊपर वर्ग का शुभारंभ, बाहर हो जाएगा "entry point"

+0

+1 के लिए, "* आप एक' Interface' * में 'static' पद्धतियां नहीं हो सकतीं" के बाद से इस इस सवाल का केवल जवाब है। – Lion

+1

आप जावा 8, @Lion में कर सकते हैं –

0

मुझे यकीन है कि नहीं कर रहा हूँ लेकिन आप कई वर्गों में एक से अधिक मुख्य तरीके हो सकते हैं (नहीं एक ही कक्षा)। हम उस कक्षा के नाम से प्रोग्राम शुरू करते हैं जिसका मुख्य तरीका हम चलाना चाहते हैं। तो उसके बाद जेवीएम केवल उस वर्ग में मुख्य विधि की तलाश करेगा। तो कोई समस्या नहीं होनी चाहिए।

मुझे यकीन नहीं है इसलिए कृपया मुझे बताएं कि क्या मैं गलत हूं।

0

आप अपनी स्टार्टअप तंत्र बना सकते हैं, लेकिन मुझे यकीन नहीं है कि आप क्यों चाहेंगे।

public class RunTests { 
    public static void main(String... args) throws ClassNotFoundException { 
     List<Class> classes = new ArrayList<Class>(); 
     try { 
      for (String arg : args) { 
       classes.add(Class.forName(arg)); 
      } 
     } catch (ClassNotFoundException e) { 
      if (classes.isEmpty()) 
       throw e; 
     } 
     String[] remainingArgs = Arrays.asList(args).subList(classes.size(), args.length).toArray(new String[0]); 
     for(Class clazz: classes) { 
      try { 
       Test test = (Test) clazz.newInstance(); 
       test.main(remainingArgs); 
       test.display(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

interface Test { 
    public void main(String... args); 
    public void display(); 
} 

बीटीडब्ल्यू: आपके पास मुख्य() विधि नहीं है, उदा।

class NoMain { 
    static { 
     System.out.println("Hello World"); 
     System.exit(0); 
    } 
} 

संकलित और त्रुटि के बिना चलाता है।

0

आपने टेस्टक्लास 1 में स्थैतिक के रूप में एक मुख्य (स्ट्रिंग [] तर्क) घोषित किया है, लेकिन इंटरफ़ेस में "परीक्षण" यह गैर स्थैतिक और इंटरफ़ेस मुख्य (स्ट्रिंग [] तर्क) स्थिर के रूप में अनुमति नहीं देता है। भले ही आप मुख्य ओवरराइड करते हैं (स्ट्रिंग [] तर्क) टेस्टकल्स 1 में गैर स्थैतिक के रूप में इसकी अनुमति नहीं है, क्योंकि मुख्य (स्ट्रिंग तर्क) पहले से ही टेस्टक्लास 1 में परिभाषित किया गया है। इसलिए आप इंटरफ़ेस में मुख्य (स्ट्रिंग [] तर्क) घोषित नहीं कर सकते हैं। और आपने एक और गलत किया है टी के रूप में इंटरफ़ेस परीक्षण। आप ऐसा नहीं कर सकते हैं।

7

जावा -8 के साथ आप इंटरफेस के अंदर परिभाषित मुख्य विधि हो सकते हैं, नीचे कोड जावा -8 में काम करेगा।

public interface TestInterfaces { 
    public static void main(String[] a){  
     System.out.println("I am a static main method inside Inteface !!"); 
    } 
} 
0

मुख्य(), static.so है हम नहीं कर सकते स्थिर methods.Interfaces ओवरराइड सार तरीकों तरीकों & वे subclasses.So में लागू किया जाएगा, सार तरीकों कभी नहीं static.finally मैंने निष्कर्ष निकाला कि मुख्य() है की अनुमति देता है इंटरफेस में निष्पादित करना संभव नहीं है।

-1

उत्तर: हाँ, हम मुख्य के विभिन्न कार्यान्वयन प्रदान कर सकते हैं() एक इंटरफेस और विधि अधिभावी द्वारा कि इंटरफ़ेस को लागू करने की कक्षाओं में घोषित कर दिया और स्थिर मुख्य विधि को ओवरलोड कर सकते हैं अगर एक अंतरफलक में परिभाषित किया।

जावा 8.

जावा 8 से पहले में इंटरफ़ेस परिवर्तन के बारे में कुछ अधिक जानकारी के लिए, यह अंतरफलक के अंदर तरीकों को परिभाषित करना संभव नहीं था।

लेकिन वहाँ इंटरफेस करने, जहां एक एक अंतरफलक के अंदर डिफ़ॉल्ट और स्थिर विधि परिभाषित कर सकते हैं सम्मान के साथ जावा 8 में किए गए परिवर्तनों कर रहे हैं। इसलिए कोड के नीचे किसी भी मुद्दे के बिना ठीक काम करेगा।

public interface TestInterfaces { 
    public static void main(String[] a){  
     System.out.println("I am a static main method inside Inteface !!"); 
    } 
} 

जानकारी के लिए के बारे में इस सुविधाओं, लिंक नीचे देखें: http://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method