2012-07-22 9 views
23

में ब्रेसिज़ की एक अनिवार्य जोड़ी के साथ एक सिंगल-लाइन लूप निम्न स्निपेट में कोड ठीक काम करता है। यह int के स्थिर क्षेत्र का उपयोग करके बनाए गए ऑब्जेक्ट्स की संख्या की गणना करता है जो cnt है।जावा

public class Main 
{ 
    private static int cnt; 

    public Main() 
    { 
     ++cnt; 
    } 

    public static void main(String[] args) 
    { 
     for (int a=0;a<10;a++) 
     { 
      Main main=new Main(); 
     } 

     /*for (int a=0;a<10;a++) 
      Main main=new Main();*/ 

     System.out.println("Number of objects created : "+cnt+"\n\n"); 
    } 
} 

यह निम्न आउटपुट प्रदर्शित करता है।

Number of objects created : 10 

केवल सवाल यह है कि जब मैं ऊपर for पाश से घुंघराले ब्रेसिज़ की जोड़ी को दूर (टिप्पणी की for पाश देखें), एक संकलन समय त्रुटि

नहीं एक बयान का संकेत जारी किया जाता है है ।

क्यों इस विशेष स्थिति में, ब्रेसिज़ की एक जोड़ी अनिवार्य भले ही पाश केवल एक सिंगल स्टेटमेंट शामिल है?

+4

'मुख्य मुख्य = नया मुख्य();' एक घोषणा है, एक बयान नहीं। – Mysticial

+0

@ मिस्टिकियल: प्रारंभिकरण के साथ एक घोषणा। प्रारंभिक भाग को कथन क्यों नहीं माना जाता है? – Razvan

+0

@Razvan मुझे कोई तकनीकी कारण नहीं दिख रहा है कि यह क्यों नहीं कर सकता। तो यह जावा या सी/सी ++ से एक डिज़ाइन विकल्प प्रतीत होता है (जहां जावा को इसके अधिकांश मूल अर्थशास्त्र विरासत में मिला है)। – Mysticial

उत्तर

28

आप एक चर (इस मामले में main) की घोषणा कब:

Main main = new Main(); 

यह एक बयान के रूप में शामिल नहीं किये जाते, भले ही यह दुष्प्रभाव है। यह एक उचित बयान होने के लिए, तुम सिर्फ

new Main(); 

क्या करना चाहिए तो क्यों

... { 
    Main main = new Main(); 
} 

अनुमति है? { ... } कोड का एक ब्लॉक है, और एक कथन के रूप में गिनती है। इस मामले में main परिवर्तनीय घोषणा के बाद उपयोग किया जा सकता है, लेकिन समापन ब्रेस से पहले। कुछ कंपाइलर्स इस तथ्य को अनदेखा करते हैं कि इसका वास्तव में उपयोग नहीं किया जाता है, अन्य कंपाइलर्स इसके बारे में चेतावनियों को छोड़ देते हैं।

+0

'मुख्य मुख्य = नया मुख्य();' एक बयान के रूप में नहीं गिना जाता है, जावा में इसका आधिकारिक नाम क्या है? एक अभिव्यक्ति? – Orup

+0

इसे एक परिवर्तनीय घोषणा (प्रारंभिकरण के साथ) कहा जाता है। – aioobe

+0

तो एक परिवर्तनीय घोषणा जावा में एक बयान नहीं है? – Orup

3

यह एक नए कथन के साथ एक लाइन ब्लॉक बनाने के लिए समझ में आता है। क्या समझ में नहीं आता है कि एक लाइन ब्लॉक के अंदर एक बनाए गए ऑब्जेक्ट का संदर्भ सहेजना है, क्योंकि आप स्कोप के बाहर से वेरिएबल मुख्य तक नहीं पहुंच सकते हैं।

शायद (बस मेरा अनुमान है) संकलक आपको ब्रैकेट को स्पष्ट रूप से टाइप करने के लिए मजबूर करता है क्योंकि उस संदर्भ में संदर्भ रखने से उम्मीद नहीं होती है, उम्मीद है कि आप बेकार संदर्भ के बारे में जागरूक हो जाएं।

3

for निम्नानुसार परिभाषित किया गया है।

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

ForStatementNoShortIf: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) StatementNoShortIf 

ForInit: 
    StatementExpressionList 
    LocalVariableDeclaration 

ForUpdate: 
    StatementExpressionList 

StatementExpressionList: 
    StatementExpression 
    StatementExpressionList , StatementExpression 

Blocks इस प्रकार परिभाषित कर रहे हैं।

एक ब्लॉक बयान के भीतर स्थानीय परिवर्तनीय घोषणा बयानों का विवरण, स्थानीय वर्ग घोषणाओं, और का अनुक्रम है।इस प्रकार

Block: 
{ BlockStatementsopt } 

BlockStatements: 
    BlockStatement 
    BlockStatements BlockStatement 

BlockStatement: 
    LocalVariableDeclarationStatement 
    ClassDeclaration 
    Statement 

Statements परिभाषित कर रहे हैं। अगर यह एक ब्लॉक के भीतर घोषित नहीं कर रहा है

Statement: 
    StatementWithoutTrailingSubstatement 
    LabeledStatement 
    IfThenStatement 
    IfThenElseStatement 
    WhileStatement 
    ForStatement 

StatementWithoutTrailingSubstatement: 
    Block 
    EmptyStatement 
    ExpressionStatement 
    AssertStatement 
    SwitchStatement 
    DoStatement 
    BreakStatement 
    ContinueStatement 
    ReturnStatement 
    SynchronizedStatement 
    ThrowStatement 
    TryStatement 

StatementNoShortIf: 
    StatementWithoutTrailingSubstatement 
    LabeledStatementNoShortIf 
    IfThenElseStatementNoShortIf 
    WhileStatementNoShortIf 
    ForStatementNoShortIf 

विनिर्देश, LocalVariableDeclarationStatement (ब्लॉक अनुभाग देखें) के अनुसार, अवैध है। इसलिए, निम्नलिखित for लूप एक संकलन-समय त्रुटि रिपोर्ट करता है "कोई कथन" जैसा कि आपने अपने प्रश्न में उल्लेख किया है जब तक कि आप ब्रेसिज़ की एक जोड़ी का उपयोग न करें।

for (int a=0;a<10;a++) 
     Main main=new Main(); 

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

  • कोई संबंधित समस्या नहीं^_^