2015-11-13 12 views
13

मुझे भाषा परिभाषा में कुछ भी नहीं मिला है जो कोटलिन में कक्षा के प्रारंभिकरण को समझाता है।कोटलिन क्लास प्रारंभिक अर्थशास्त्र क्या हैं?

import java.util.Properties 

fun main(args: Array<String>) { 
    val out = MyClass() 
    out.fn() 
} 

class MyClass { 
    private val a = Properties() // 1 

    init { 
     fn() 
    } 

    public fun fn() { 
     println("Fn called. a = $a") 
    } 

    // private val a = Properties() // 2 
} 

इस कार्यक्रम को चलाने का परिणाम इस बात पर निर्भर करता है कि संपत्ति (1) या (2) पर शुरू हुई है या नहीं।

मुझे आश्चर्य है कि घोषणा आदेश भाषा में प्रासंगिक है और इसके पीछे के फैसलों को समझना चाहता हूं। मेरी उम्मीद यह होगी कि कन्स्ट्रक्टर बॉडी के आने से पहले संपत्तियों को शुरू किया जाएगा।

उत्तर

10

मेरी अपेक्षा यह होगी कि गुणक शरीर के आने से पहले गुणों को आरंभ किया जाएगा।

अच्छा, init ब्लॉक constructor नहीं है। यह एक अलग निर्माण है जो आपको वस्तु के प्रारंभिकरण को करने की अनुमति देता है और वे [init ब्लॉक] संपत्ति प्रारंभकर्ताओं के साथ घोषणा आदेश में किए जाते हैं।

कन्स्ट्रक्टर एक अलग जानवर चींटी हैं जो सभी गुणों को शुरू करने के बाद किया जाता है और सभी इनिट ब्लॉक किए जाते हैं। निम्न उदाहरण को देखो:

class A(val value: Int) { 
    constructor(): this(0) {   
     println("Constructor") 
    }  

    init { 
     println("Init block") 
    } 
} 

fun main(args: Array<String>) { 
    val a = A() 
} 

आउटपुट है:

Init block 
Constructor 

आप init ब्लॉक जगह कर सकते हैं जहाँ भी आप चाहते हैं: constructor पहले या उसके बाद; यह हमेशा A के निर्माता (द्वितीयक कन्स्ट्रक्टर, इस उदाहरण में) से पहले किया जाएगा।

+18

यह पूरी तरह से सही नहीं है। 'init' ब्लॉक में कोड होता है जो प्राथमिक कन्स्ट्रक्टर में शामिल होता है। आपके उदाहरण में, उन्हें निष्पादित किया जाता है क्योंकि माध्यमिक कन्स्ट्रक्टर ': (0) 'वाक्यविन्यास का उपयोग करके प्राथमिक कन्स्ट्रक्टर को प्रतिनिधि करता है। यदि कोई माध्यमिक कन्स्ट्रक्टर प्राथमिक कन्स्ट्रक्टर को प्रतिनिधि नहीं देता है, तो उस कन्स्ट्रक्टर का उपयोग करके कक्षा प्रारंभ होने पर 'init' ब्लॉक निष्पादित नहीं किए जाएंगे। – yole

+1

हाय आगा/योल - आपके उत्तरों के लिए धन्यवाद। मुझे शायद यह कहना चाहिए था कि मैं एक कोटलिन एन 00 बी हूं, लेकिन यह शायद मेरे प्रश्न से स्पष्ट है। मुझे लगता है कि आपकी प्रतिक्रियाएं भाषा के साथ परिचितता से आती हैं। जब मैंने कोटलिन https://kotlinlang.org/docs/kotlin-docs.pdf की इस परिभाषा को पढ़ा तो मुझे केवल एक ही संदर्भ में शामिल किया गया है: "प्राथमिक निर्माता में कोई कोड नहीं हो सकता है। आरंभिक कोड प्रारंभकर्ता ब्लॉक में रखा जा सकता है , जो कि init कीवर्ड " प्रारंभिकरण के क्रम के बारे में कुछ भी नहीं कहा गया है। (जो मैं देख सकता हूं) स्पष्टीकरण के लिए –

+1

@Yole धन्यवाद।:) – aga

4

बस शब्दों में कहें: जब कक्षा का एक उदाहरण बनाया जाता है, (लगभग) पहले माता-पिता वर्ग (यदि मौजूद है) के निर्माता को चलाता है, तो प्राथमिक निर्माता।

प्राथमिक निर्माता वर्ग निकाय में ऊपर से नीचे तक घोषित कोड निष्पादित करता है। इसके अलावा नाम एक ही नियम से उपलब्ध हो गया:

class Foo(a: String = "might be first" 
      val b: String = "second" + a) : Boo(a + b + "third"){ 
    var c = a + "fourth" + b 

    init {print("fifth: $c")} 

    val d = "sixth" 
    init {print("seventh: the end of the primary constructor"} 
} 

यदि आपके पास द्वितीयक निर्माता आह्वान है, तो यह (मूल कंस्ट्रक्टर्स लागू के समान) के रूप में यह श्रृंखला में बना है प्राथमिक एक के बाद काम करता है।

+1

नामक कन्स्ट्रक्टर जिसे आप ऑर्डरिंग के बारे में सुनिश्चित करते हैं और" लगभग "और" हो सकता है "को हटा सकते हैं ताकि यह एक निर्णायक उत्तर हो। या @aga से जवाब को स्थगित करें –

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