int

2015-11-08 8 views
9

के लिए शून्य पर प्रारंभ नहीं किए गए क्लास के इंस्टेंस चर के जावा डिफ़ॉल्ट मान यह एक उदाहरण है जो मैं अपने जावा ट्यूटोरियल से काम कर रहा था। मेरे पास टाइम 1 क्लास है जिसमें कोई कन्स्ट्रक्टर नहीं है, और इसलिए मैं इसे डिफ़ॉल्ट मानों के साथ int में प्रारंभ करने की उम्मीद कर रहा था, यह शून्य है।int

public class Time1 { 
    private int hour; // expected to be initialised with zero 
    private int minute; // expected to be initialised with zero 
    private int second; // expected to be initialised with zero 

    public void setTime(int hour, int minute, int second) { 
     if (hour < 0 || hour >= 24 || minute < 0 || minute >= 60 || second < 0 || second >= 60) { 
      throw new IllegalArgumentException("value out of range"); 
     } 
     this.hour = hour; 
     this.minute = minute; 
     this.second = second; 
    } 

    public String toUniversalString() { 
     return String.format("%02d:%02d:%02d", hour, minute, second); 
    } 

    public String toString() { 
     return String.format("%d:%02d:%02d %s", ((hour == 0 || hour == 12) ? 12 : hour % 12), minute, second, (hour < 12 ? "AM" : "PM")); 
    } 
} 

और अब मैं मुख्य वर्ग

public class Time1test { 
    public static void main(String[] args) { 
     Time1 thistime = new Time1(); 
     System.out.println(thistime); 
     thistime.setTime(13, 22, 33); 
     System.out.println(thistime); 
    } 
} 

मैं setTime() विधि का उपयोग कर 00:00:00 वापस जाने के लिए है क्योंकि मैं किसी भी तरीकों इस्तेमाल नहीं किया है उसे पुन: प्रारूपित करने से पहले System.out.println(thistime); उम्मीद कर रहा था है तथापि, मुझे आउटपुट 12:00:00 बजे के रूप में मिल रहा है, यह toString() विधि को कॉल करने के बराबर है। डिफ़ॉल्ट रूप से इस विधि को क्यों बुलाया जा रहा था जब एक नई वस्तु शुरू की जाती है, यहां तक ​​कि बिना बुलाए जाने के भी?

+3

आप '00: 00: 00' की अपेक्षा क्यों कर रहे थे? क्या आप जावा से स्वचालित रूप से 'toUniversalString' को कॉल करने की अपेक्षा करते थे? – user2357112

+2

असल में, जब आप मुद्रित करने के लिए 'ऑब्जेक्ट' पास करते हैं, तो इस तरह: 'System.out.println (ऑब्जेक्ट)', यह वास्तव में केवल 'System.out.println (Object.toString()) ' – Zizouz212

+1

@ user2357112 है, I पता नहीं था कि किस विधि को बुलाया जा रहा है और क्यों/कैसे, और इसलिए यह सवाल है। और धन्यवाद Zizouz212 – scott

उत्तर

8

यदि आप ग्रहण जैसे विचार का उपयोग कर रहे हैं, तो आपने अपनी विधि toString() के पास एक निशान देखा होगा जो overrides java.lang.Object.toString कहता है। यह वह विधि है जिसे डिफ़ॉल्ट रूप से बुलाया जा रहा है जब आप किसी वस्तु को मुद्रित करने का प्रयास कर रहे हैं। ऐसा लगता है कि

* @return a string representation of the object. 
*/ 
public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 

चूंकि आपके पास उसी नाम से विधि के अंदर अपनी परिभाषाएं हैं, तो यह ओवरराइड हो रही है। यदि आप कुछ और करने के लिए अपने स्वयं के toString विधि का नाम बदलने के लिए आप अंतर नोटिस कर सकते हैं और उत्पादन कुछ [email protected] तरह

+0

ठीक है, मैंने यह नहीं देखा। उस पर क्लिक करने से वह दूसरी कक्षा खुलती है, और यह समझ में आता है कि मेरी खुद की कस्टम क्लास 'एएम/पीएम' क्यों दे रही है जबकि डिफ़ॉल्ट व्यक्ति मेमोरी लोकेशन दे रहा है। – scott

6

जब आप अपनी ऑब्जेक्ट के लिए System.out.println(thistime); पर कॉल करते हैं, तो आपकी toString विधि निष्पादित की जाती है, और स्ट्रिंग जो इसे लौटाती है मुद्रित होती है।

आपका toString विधि स्पष्ट रूप से रिटर्न 12 जब hours == 0:

return String.format("%d:%02d:%02d %s", ((hour==0 || hour==12)?12:hour%12),minute, second, (hour<12?"AM":"PM")); 

              ------- 
+0

ईरान धन्यवाद, लेकिन मैंने इस विधि को नहीं बुलाया, तो यह विधि क्यों लागू हुई? – scott

+2

@scott जब आप किसी ऑब्जेक्ट को प्रिंट करने का प्रयास करते हैं तो यह 'toString' कहता है। – Eran

+0

धन्यवाद। मेरे सवाल का जवाब है। :) – scott

4

System.out.println पैरामीटर के रूप में एक स्ट्रिंग की उम्मीद है, तो यह आपके ToString विधि एक स्ट्रिंग में अपने समय 1 वस्तु कन्वर्ट करने के लिए कहता है। आपके पास मौजूद तर्क के कारण, आप "12:00:00 पूर्वाह्न" आउटपुट देख रहे हैं।

आप

System.out.println(time1.toUniversalString()); 

उत्पादन आप उम्मीद कर पाने के लिए कर सकते हैं;

4

मैं System.out.println (thistime) की अपेक्षा कर रहा था; 0012:00 वापस करने के लिए सेटटाइम() विधि का उपयोग करने से पहले क्योंकि मैंने इसे सुधारने के लिए किसी भी तरीके का उपयोग नहीं किया है, हालांकि मुझे आउटपुट 12:00:00 बजे के रूप में मिल रहा है, कॉलिंग टूस्ट्रिंग के बराबर है () तरीका। होने के बावजूद भी यह विधि डिफ़ॉल्ट रूप से बुलाई गई थी जब एक नई ऑब्जेक्ट प्रारंभ की गई थी?

जब आप वस्तु प्रिंट (जो आप System.out.println(thistime) के साथ किया था), उसके toString विधि डिफ़ॉल्ट रूप से कहा जाता है (यहां तक ​​कि स्पष्ट बुला के बिना)। यह इतना सरल है।

+0

यह गलत है। 'PrintStream.println()' 'ऑब्जेक्ट 'के लिए ओवरलोड किया गया है, जहां' String.valueOf() 'स्पष्ट रूप से कहा जाता है। – xehpuk

8

समस्या आपकी toString विधि में है। क्या निम्नलिखित

((hour==0 || hour==12)?12:hour%12) 

है करता है, जब भी समय की मूल्य, या तो 0 या 12, प्रिंट 12 है अन्यथा hour % 12 मुद्रित करें।

जब आप फोन:

System.out.println(thistime); 

प्रिंट परिणाम के रूप में एक ही हो जाएगा:

System.out.println(thistime.toString()); 

तो यही कारण है कि toString विधि शुरू हो जाती है। आप इसे ठीक करने के लिए ((hour == 12) ? 12 : hour % 12) जैसे कुछ लिख सकते हैं।

+0

यह परिवर्तित नहीं है। 'PrintStream.println() '' ऑब्जेक्ट' के लिए ओवरलोड किया गया है, जहां 'String.valueOf() 'कहा जाता है। – xehpuk

0

print विधि अतिभारित और कुछ भी है कि आदिम नहीं है के लिए .toString() कॉल किया जाएगा। प्रिंट विधि आदिम मानों को प्रारूपित कर सकती है लेकिन किसी भी Object सबक्लास के लिए toString() पर कॉल करती है।

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