मेरा एक सवाल है। यह कोड XXZ10.0 प्रिंट करने के बजाय YYZ10.0 क्यों प्रिंट करता है? पहला कंस्ट्रक्टर ए (इंट) है, फिर स्टेटमेंट के अंदर यह गलत है, इसलिए 9 + 1 एफ को ए (फ्लोट) कंस्ट्रक्टर में कूदना चाहिए, लेकिन इसके बजाय यह ए (डबल) में जा रहा है।

public class Main {
    public static void main(String[] args) {
        System.out.print(new A(011).fun()[1]);
    }
}

class A{
    double value;
    public A(int value){
        this(value >> 2 == 1 ? value+1.0 : value+1f);
    }
    public A(float value){
        System.out.print("XX");
        this.value = value;
    }
    public A(double value){
        System.out.print("YY");
        this.value = value;
    }
    public Object[] fun(){
        return new Object[]{new Object(), this};
    }
    public String toString(){
        return "Z"+value;
    }
}
-1
Koral293 17 फरवरी 2021, 19:23

2 जवाब

सबसे बढ़िया उत्तर

यदि एक विधि के कई अधिभार हैं, तो जावा संकलन समय पर कॉल करने के लिए चुनता है, न कि रन टाइम पर। इस मामले में, आप कंस्ट्रक्टर को this के माध्यम से कॉल कर रहे हैं। संकलन समय पर, जावा तय करता है कि तीन में से किस कंस्ट्रक्टर को कॉल करना है, और आप देख सकते हैं कि यह वही होगा जो एक double स्वीकार करता है।

जावा को ऐसे कंस्ट्रक्टर को चुनना होता है जो double स्वीकार करता है, न केवल इसलिए कि वह double और float दोनों मामलों को संभाल सकता है, बल्कि इसलिए भी कि कोई float मामला नहीं है। टर्नरी एक्सप्रेशन में केवल एक प्रकार हो सकता है। यह कभी-कभी double और कभी-कभी float नहीं होता है; यह हमेशा double होता है।

इस कथन पर विचार करें:

____ result = value >> 2 == 1 ? value+1.0 : value+1f;

आप रिक्त स्थान में क्या टाइप करेंगे? "कभी-कभी double, कभी-कभी float" लिखने का कोई तरीका नहीं है। यह double होने वाला है।

3
Willis Blackburn 17 फरवरी 2021, 19:42

इस लाइन को बदलें (A(int) कंस्ट्रक्टर में):

this(value >> 2 == 1 ? value+1.0 : value+1f);

इसके लिए:

this(value >> 2 == 1 ? value+1f : value+1f);

इसे उस तरह से सही कंस्ट्रक्टर को कॉल करना चाहिए।

1
BeetMacol 17 फरवरी 2021, 19:30