2012-02-03 33 views
11

मैंने सीखा है कि जावा फ़ाइल में एकमात्र सार्वजनिक वर्ग में मुख्य विधि भी होनी चाहिए। हालांकि, नीचे आप मुख्य विधि को आंतरिक कक्षा के अंदर देख सकते हैं? स्रोत फ़ाइल में मुख्य विधि परिभाषा के संबंध में नियम क्या है?मुख्य विधि।

public class TestBed { 
    public TestBed() { 
     System.out.println("Test bed c'tor"); 
    } 

    @SuppressWarnings("unused") 
    private static class Tester { 
     public static void main(String[] args) { 
      TestBed tb = new TestBed(); 
      tb.f(); 
     } 
    } 

    void f() { 
     System.out.println("TestBed::f()"); 
    } 
} 
+0

है कि अगर आपको लगता है कि भीतरी वर्ग सार्वजनिक करना काम करना चाहिए। – Thilo

+0

यह काम करता है जैसा यह है। हालांकि, मेरे मामले में, मुझे खोल से लॉन्च करने के लिए '$' चरित्र से बचना पड़ा: '$ जावा टेस्टबैड \ $ परीक्षक – Vlad

+0

@ थिलो - नेस्टेड क्लास को ** ** ** सार्वजनिक होने की आवश्यकता नहीं है। सार्वजनिक होने के नाते जावा के पहले संस्करणों के लिए ही सच था। आजकल जावा निजी वर्गों में विधि खोजने के लिए _smart_ है (विंडोज़ XP पर जावा 5, 6 और 7 के साथ परीक्षण) –

उत्तर

5

आप जावा के साथ एक कक्षा शुरू करने के लिए करना चाहते हैं: तो इस वर्ग के एक होना चाहिए (जावा निर्माता जावा test.MyClass) प्रसिद्ध हस्ताक्षर के साथ मुख्य विधि।

आप जहां भी चाहें उसी हस्ताक्षर के साथ एक मुख्य विधि प्राप्त कर सकते हैं। लेकिन उम्मीद नहीं है कि लॉन्चर इसे पायेगा।

पीएस भाषा का नाम जावा है, जावा नहीं।

आप ऐसा कर सकते हैं:

एक छोटी सी विस्तार है

package test; 

public class Test { 

    /** 
    * @param args the command line arguments 
    */ 
    static public class A { 

     public static void main(String[] args) { 
      System.err.println("hi"); 
     } 
    } 
} 

जावा test.Test $ एक

लेकिन यह है गैर मानक ...

+0

मुझे आश्चर्य है कि यह इस मामले में काम करेगा, क्योंकि मुख्य विधि वाला वर्ग निजी, स्थैतिक और कहीं भी उपयोग नहीं किया जाता है। –

+1

@KurtDuBois - यह काम करता है, लेकिन इसे शुरू करने के लिए आपको सही वर्ग नाम 'टेस्टबैड $ परीक्षक' का उपयोग करना होगा। –

+1

ध्यान दें कि \ * nix shell में चलते समय, आपको शायद '$' से बचाना होगा: 'जावा टेस्ट .स्ट \ $ ए'। –

2

प्रत्येक जावा एप्लिकेशन में एक मुख्य विधि होनी चाहिए। यह एप्लिकेशन में कोड के निष्पादन के लिए शुरुआती बिंदु है। इसकी विधि हस्ताक्षर है:

public static void main(String[] args) 

एक स्थिर भीतरी वर्ग एक वर्ग है कि एक अलग वर्ग की परिभाषा के अंदर परिभाषित और स्थिर किया जा रहा है के रूप में चिह्नित किया गया है।

उदाहरण के लिए, यदि बाहरी वर्ग को टेस्टबैड नाम दिया गया है, तो टेस्टबैड का एक आंतरिक वर्ग जिसे टेस्टर नाम दिया गया है, को टेस्टबैड $ परीक्षक.क्लास में संकलित किया जाएगा। .class फ़ाइलों का पृथक्करण का अर्थ है कि आप पूरक, नेस्टेड कोड को प्राथमिक, बाहरी वर्ग के साथ कसकर जोड़ सकते हैं।

वे एक ही स्रोत फ़ाइल में हैं, और आंतरिक वर्ग वास्तव में बाहरी वर्ग के अंदर है। वह सब और आपको किसी भी प्रकार की तैनाती या रन टाइम लागत का भुगतान नहीं करना पड़ेगा।

स्थैतिक आंतरिक कक्षाओं का उपयोग करके, आप परीक्षणों जैसे क्षमताओं के लिए अपने सिस्टम में अतिरिक्त समर्थन कार्यक्षमता जोड़ सकते हैं, जबकि सामान्य में कोई दंड नहीं लगाना, उत्पादन परिनियोजन करना।

कि TestBed.Tester वर्ग के मुख्य विधि() पर अमल करने के लिए,

% java TestBed$Tester 
+0

पैडेंटिक होने के नाते: प्रति परिभाषा (जेएलएस 8.1.3) एक _inner class_ एक नेस्टेड क्लास है जो ** ** ** घोषित 'स्थिर 'नहीं है! –

4

कोई भी वर्ग जिसमें स्थैतिक विधि हो सकती है, public static void main(String[] args) हो सकती है।

इसमें शामिल हैं:

शीर्ष स्तर के वर्गों (चाहे सार्वजनिक या नहीं), उदा

public class Foo { 
    public static void main(String[] args) { 
     System.out.println("Hello"); 
    } 
} 

और आंतरिक स्थैतिक वर्ग (चाहे सार्वजनिक या नहीं) (आपके उदाहरण की तरह)।

यह शामिल नहीं है:

  • गुमनाम वर्गों
  • भीतरी गैर स्थैतिक कक्षाओं

तो इन दोनों को गैर-कानूनी हैं:

public class Foo { 
    private Object bar = new Object() { 
     public static void main(String[] args) { 
      System.out.println("Hello"); 
     } 
    }; 
} 


public class Foo { 
    private class Bar { 
     public static void main(String[] args) { 
      System.out.println("Hello"); 
     } 
    }; 
} 
+0

पैडेंटिक: _inner कक्षा_ ** ** ** ** एक स्थिर विधि नहीं है - जेएलएस 8.1.3: '[...] आंतरिक कक्षाएं स्थिर प्रारंभकर्ता (§8.7) या सदस्य इंटरफेस घोषित नहीं कर सकती हैं [...]'। प्रति परिभाषा नहीं है, प्रति परिभाषा (जेएलएस 8.1.3 फिर से) एक _inner class_ एक गैर स्थैतिक घोंसला वाली कक्षा है। –

+0

@ करलोसबेबरर आप बिल्कुल सही हैं। मैं 'शब्दावली' शब्द का उपयोग करके 'आंतरिक' शब्द का उपयोग करके अपनी शब्दावली में मैला था। –

+0

आइए कहें कि एक सार्वजनिक वर्ग में मुख्य विधि है और कक्षा में मुख्य विधि के साथ एक स्थिर आंतरिक कक्षा है। जेवीएम किस प्रकार की कक्षा को मुख्य विधि में पाता है और चलाता है? यह दो वर्गों को कैसे हल करता है? – user3705478

-1

इस के रूप में दिलचस्प है कोड संकलित और ग्रहण में चलाएगा, लेकिन बस कमांड लाइन का उपयोग करने से संकलित होगा। जब आप ग्रहण से भागते हैं तो यह आंतरिक मुख्य विधि को आंतरिक कक्षा के भीतर से प्राप्त करेगा और इसे चलाएगा।

लेकिन कमांड लाइन से java TestBed चलाते समय आपको त्रुटि मिलेगी - Exception in thread "main" java.lang.NoSuchMethodError: main जो एक वैध त्रुटि है क्योंकि आपने मुख्य कक्षा में अपनी मुख्य विधि को परिभाषित नहीं किया है।

आप अपनी मुख्य विधि को आंतरिक कक्षा में क्यों परिभाषित करना चाहते हैं? आपकी मुख्य विधि को सार्वजनिक वर्ग में परिभाषित किया जाना चाहिए, यह एक नियम नहीं है लेकिन आम अभ्यास है।

नीचे कोड में मैं बाहरी वर्ग है जो दोनों में ग्रहण & कमांड लाइन से काम करता है में मुख्य विधि स्थानांतरित कर दिया है:

public class TestBed { 
    public TestBed() { 
     System.out.println("Test bed c'tor"); 
    } 

    @SuppressWarnings("unused") 
    private static class Tester { 

    } 

    public static void main(String[] args) { 
     TestBed tb = new TestBed(); 
     tb.f(); 
    } 

    void f() { 
     System.out.println("TestBed::f()"); 
    } 
} 
+0

गलत: कमांड लाइन - 'जावा टेस्टबैड $ परीक्षक' - ठीक काम करता है (विंडोज एक्सपी, जावा 6 और 7) और कक्षा के लिए मुख्य विधि होने की आवश्यकता नहीं है। –

+0

बेशक जावा टेस्टबैड $ टेस्टर ठीक काम करता है, जावा परीक्षक नहीं होगा। "कक्षा के लिए मुख्य विधि होने की कोई आवश्यकता नहीं है" मुझे एहसास हुआ कि इसकी आवश्यकता नहीं है, मैं केवल यह सोच रहा था कि आम अभ्यास क्या है, कम से कम मैंने जो देखा है। मैंने कभी भी मुख्य श्रेणी "अंतिम" या "अमूर्त" घोषित करने की आवश्यकता नहीं देखी है। –

+0

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

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