खोज…


परिचय

जावा और C ++ समान भाषाएँ हैं। यह विषय जावा और सी ++ इंजीनियरों के लिए एक त्वरित संदर्भ गाइड के रूप में कार्य करता है।

टिप्पणियों

अन्य निर्माणों के भीतर परिभाषित कक्षाएं #

एक और वर्ग के भीतर परिभाषित

सी ++

नेस्टेड क्लास [रेफ] (एनक्लोजिंग क्लास के लिए एक संदर्भ की जरूरत है)

class Outer {
   class Inner {
      public:
         Inner(Outer* o) :outer(o) {}

      private:
         Outer*  outer;
   };
};

जावा

[गैर-स्थैतिक] नेस्टेड क्लास (उर्फ इनर क्लास या सदस्य वर्ग)

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

स्टेटिकली एक और वर्ग के भीतर परिभाषित

सी ++

स्टेटिक नेस्टेड क्लास

class Outer {
   class Inner {
      ...
   };
};

जावा

स्टेटिक नेस्टेड क्लास (उर्फ स्टेटिक मेंबर क्लास) [रेफ]

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

एक विधि के भीतर परिभाषित

(जैसे ईवेंट हैंडलिंग)

सी ++

स्थानीय वर्ग [रेफ]

void fun() {
   class Test {
      /* members of Test class */
   };
}

लैंबडा भाव भी देखें

जावा

स्थानीय वर्ग [रेफ]

class Test {
    void f() {
        new Thread(new Runnable() {
            public void run() {
                doSomethingBackgroundish();
            }
        }).start();
    }
}

ओवरराइडिंग बनाम ओवरलोडिंग

निम्नलिखित ओवरराइडिंग बनाम ओवरलोडिंग अंक C ++ और Java दोनों पर लागू होते हैं:

  • एक ओवरराइड विधि का आधार विधि के समान नाम और तर्क होता है।
  • एक अतिभारित पद्धति का एक ही नाम है, लेकिन विभिन्न तर्क और विरासत पर भरोसा नहीं करते हैं।
  • एक ही नाम और तर्कों के साथ दो तरीके लेकिन विभिन्न रिटर्न प्रकार अवैध हैं। "जावा में अलग-अलग रिटर्न प्रकार के साथ ओवरलोडिंग" के बारे में संबंधित स्टैकओवरफ़्लो प्रश्न देखें - प्रश्न 1 ; प्रश्न 2

बहुरूपता

बहुरूपता एक ही विधि कॉल के लिए अलग-अलग प्रतिक्रिया देने के लिए विरासत से संबंधित विभिन्न वर्गों की वस्तुओं की क्षमता है। यहाँ एक उदाहरण है:

  • आधार श्रेणी एक सार पद्धति के रूप में क्षेत्र के साथ
  • दो व्युत्पन्न वर्ग, स्क्वायर और सर्कल, क्षेत्र के तरीकों को लागू करते हैं
  • स्क्वायर और क्षेत्र के आकार के संदर्भ बिंदुओं को लागू किया जाता है

C ++ में, बहुरूपता को आभासी तरीकों से सक्षम किया जाता है। जावा में, तरीके डिफ़ॉल्ट रूप से आभासी हैं।

निर्माण / विनाश का आदेश

निर्माण / विनाश का आदेश

ऑब्जेक्ट क्लीनअप

C ++ में, यह सुनिश्चित करने के लिए एक विध्वंसक को आभासी घोषित करने का एक अच्छा विचार है कि बेस क्लास पॉइंटर को हटा दिया जाए तो उपवर्ग के विध्वंसक को बुलाया जाएगा।

जावा में, एक अंतिम विधि C ++ में एक विध्वंसक के समान है; हालांकि, फाइनल अप्रत्याशित हैं (वे जीसी पर भरोसा करते हैं)। सर्वोत्तम अभ्यास - स्पष्ट रूप से सफाई करने के लिए "करीब" विधि का उपयोग करें।

protected void close() {
    try {
       // do subclass cleanup
    }
    finally {
       isClosed = true;
       super.close();
    }
}

protected void finalize() {
    try {
       if(!isClosed) close();
    }
    finally {
       super.finalize();
    }
}

एब्सट्रैक्ट मेथड्स एंड क्लासेस

संकल्पना सी ++ जावा
सार विधि
बिना कार्यान्वयन के घोषित किया गया
शुद्ध आभासी विधि
virtual void eat(void) = 0;
सार विधि
abstract void draw();
सार वर्ग
तत्काल नहीं किया जा सकता है
त्वरित नहीं किया जा सकता है; कम से कम 1 शुद्ध आभासी विधि है
class AB {public: virtual void f() = 0;};
त्वरित नहीं किया जा सकता है; गैर-सार तरीके हो सकते हैं
abstract class GraphicObject {}
इंटरफेस
कोई उदाहरण फ़ील्ड नहीं
कोई "इंटरफ़ेस" कीवर्ड नहीं है, लेकिन एक सार वर्ग की सुविधाओं के साथ एक जावा इंटरफ़ेस की नकल कर सकता है अमूर्त वर्ग के समान, लेकिन 1) कई विरासत का समर्थन करता है; 2) कोई उदाहरण फ़ील्ड नहीं
interface TestInterface {}

अभिगम्यता संशोधक

संशोधक सी ++ जावा
सार्वजनिक - सभी द्वारा सुलभ कोई विशेष नोट नहीं कोई विशेष नोट नहीं
संरक्षित - उपवर्गों द्वारा सुलभ मित्रों द्वारा भी सुलभ भी एक ही पैकेज के भीतर सुलभ
निजी - सदस्यों द्वारा सुलभ मित्रों द्वारा भी सुलभ कोई विशेष नोट नहीं
चूक कक्षा डिफ़ॉल्ट निजी है; संरचना डिफ़ॉल्ट सार्वजनिक है एक ही पैकेज के भीतर सभी वर्गों द्वारा सुलभ
अन्य मित्र - विरासत के बिना निजी और संरक्षित सदस्यों तक पहुंच प्रदान करने का एक तरीका (नीचे देखें)

C ++ मित्र उदाहरण

class Node {
  private:
    int key;  Node *next;
    // LinkedList::search() can access "key" & "next"
    friend int LinkedList::search();
};

खूंखार हीरे की समस्या

हीरे की समस्या एक अस्पष्टता है जो तब उत्पन्न होती है जब दो वर्ग बी और सी को ए से विरासत में मिलता है, और वर्ग डी को बी और सी दोनों से विरासत में मिला है। D का कौन सा संस्करण विरासत में मिलता है: B का, या C का? ( विकिपीडिया से )

खूंखार हीरे की समस्या

जबकि सी ++ हमेशा हीरे की समस्या के लिए अतिसंवेदनशील रहा है, जावा 8 तक अतिसंवेदनशील था। मूल रूप से, जावा ने कई उत्तराधिकार का समर्थन नहीं किया था, लेकिन डिफ़ॉल्ट इंटरफ़ेस विधियों के आगमन के साथ, जावा वर्ग एक से अधिक कक्षाओं से "कार्यान्वयन" प्राप्त नहीं कर सकते हैं। ।

java.lang.Object क्लास

जावा में सभी वर्ग विरासत में हैं, या तो स्पष्ट रूप से या स्पष्ट रूप से, ऑब्जेक्ट क्लास से। किसी भी जावा संदर्भ को ऑब्जेक्ट प्रकार में डाला जा सकता है।

C ++ में एक तुलनीय "ऑब्जेक्ट" वर्ग नहीं है।

जावा संग्रह और सी ++ कंटेनर

जावा कलेक्शंस C ++ कंटेनर्स के साथ सिम्पटम हैं।

जावा संग्रह फ़्लोचार्ट

सी ++ कंटेनर फ़्लोचार्ट

पूर्णांक प्रकार

बिट्स मिन मैक्स C ++ प्रकार
(LLP64 या LP64 पर)
जावा प्रकार
8 -2 (8-1) = -128 2 (8-1) -1 = 127 चार बाइट
8 0 2 (8) -1 = 255 अचिन्हित वर्ण -
16 -2 (16-1) = -32,768 2 (16-1) -1 = 32,767 कम कम
16 0 (\ u0000) 2 (16) -1 = 65,535 (\ uFFFF) अहस्ताक्षरित छोटा चार (अहस्ताक्षरित)
32 -2 (32-1) = -2.147 बिलियन 2 (32-1) -1 = 2.147 बिलियन पूर्णांक पूर्णांक
32 0 2 (32) -1 = 4.295 बिलियन अहस्ताक्षरित int -
64 -2 (64-1) 2 (16-1) -1 लंबा* लम्बा लम्बा
64 0 2 (16) -1 अहस्ताक्षरित लंबा *
लंबे समय तक अहस्ताक्षरित
-

* Win64 एपीआई केवल 32 बिट है

अधिक सी ++ प्रकार

स्थिर वर्ग के सदस्य

ऑब्जेक्ट स्कोप के विपरीत स्टैटिक सदस्यों के पास वर्ग गुंजाइश है

C ++ उदाहरण

// define in header
class Singleton {
   public:
      static Singleton *getInstance();

   private:
      Singleton() {}
      static Singleton *instance;
};

// initialize in .cpp
Singleton* Singleton::instance = 0;

जावा उदाहरण

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

अन्य निर्माणों के भीतर परिभाषित कक्षाएं

एक और वर्ग के भीतर परिभाषित

सी ++

नेस्टेड क्लास [रेफ] (एनक्लोजिंग क्लास के लिए एक संदर्भ की जरूरत है)

class Outer {
   class Inner {
      public:
         Inner(Outer* o) :outer(o) {}

      private:
         Outer*  outer;
   };
};

जावा

[गैर-स्थैतिक] नेस्टेड क्लास (उर्फ इनर क्लास या सदस्य वर्ग)

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

स्टेटिकली एक और वर्ग के भीतर परिभाषित

सी ++

स्टेटिक नेस्टेड क्लास

class Outer {
   class Inner {
      ...
   };
};

जावा

स्टेटिक नेस्टेड क्लास (उर्फ स्टेटिक मेंबर क्लास) [रेफ]

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

एक विधि के भीतर परिभाषित

(जैसे ईवेंट हैंडलिंग)

सी ++

स्थानीय वर्ग [रेफ]

void fun() {
   class Test {
      /* members of Test class */
   };
}

जावा

स्थानीय वर्ग [रेफ]

class Test {
    void f() {
        new Thread(new Runnable() {
            public void run() {
                doSomethingBackgroundish();
            }
        }).start();
    }
}

पास-दर-मूल्य और पास-दर-संदर्भ

कई लोग तर्क देते हैं कि जावा केवल पास-दर-मूल्य है, लेकिन यह उससे कहीं अधिक बारीक है। पास-दर-मूल्य (उर्फ कॉपी) और पास-दर-संदर्भ (उर्फ उर्फ) के कई स्वादों को देखने के लिए निम्नलिखित सी ++ और जावा उदाहरणों की तुलना करें।

C ++ उदाहरण (पूरा कोड)

  // passes a COPY of the object
  static void passByCopy(PassIt obj) {
     obj.i = 22;  // only a "local" change
  }

  // passes a pointer
  static void passByPointer(PassIt* ptr) {
     ptr->i = 33;
     ptr = 0; // better to use nullptr instead if '0'
  }

  // passes an alias (aka reference)
  static void passByAlias(PassIt& ref) {
     ref.i = 44;
  }

  // This is an old-school way of doing it.
  // Check out std::swap for the best way to do this
  static void swap(PassIt** pptr1, PassIt** pptr2) {
     PassIt* tmp = *pptr1;
     *pptr1 = *pptr2;
     *pptr2 = tmp;
  }

जावा उदाहरण (पूर्ण कोड)

   // passes a copy of the variable
   // NOTE: in java only primitives are pass-by-copy
   public static void passByCopy(int copy) {
      copy = 33;  // only a "local" change
   }

   // No such thing as pointers in Java
   /*
   public static void passByPointer(PassIt *ptr) {
      ptr->i = 33;
      ptr = 0; // better to use nullptr instead if '0'
   }
   */

   // passes an alias (aka reference)
   public static void passByAlias(PassIt ref) {
      ref.i = 44;
   }

   // passes aliases (aka references),
   // but need to do "manual", potentially expensive copies
   public static void swap(PassIt ref1, PassIt ref2) {
      PassIt tmp = new PassIt(ref1);
      ref1.copy(ref2);
      ref2.copy(tmp);
   }

वंशानुक्रम बनाम रचना

C ++ और Java दोनों ऑब्जेक्ट-ओरिएंटेड भाषाएँ हैं, इस प्रकार निम्नलिखित आरेख दोनों पर लागू होता है।

वंशानुक्रम बनाम रचना उदाहरण

आउटकास्ट डाउनकास्टिंग

"डाउनकास्टिंग" का उपयोग करने से सावधान रहें - डाउनकास्टिंग एक बेस क्लास से उपवर्ग (यानी बहुरूपता के विपरीत) में वंशानुक्रम पदानुक्रम को नीचे गिरा रहा है। सामान्य तौर पर, उदाहरण और डाउनकास्टिंग के बजाय बहुरूपता और ओवरराइडिंग का उपयोग करें।

C ++ उदाहरण

// explicit type case required
Child *pChild =  (Child *) &parent;

जावा उदाहरण

if(mySubClass instanceof SubClass) {
   SubClass mySubClass = (SubClass)someBaseClass;
   mySubClass.nonInheritedMethod();
}

एब्सट्रैक्ट मेथड्स एंड क्लासेस

सार विधि

बिना कार्यान्वयन के घोषित किया गया

सी ++

शुद्ध आभासी विधि

virtual void eat(void) = 0;

जावा

सार विधि

abstract void draw();

सार वर्ग

तत्काल नहीं किया जा सकता है

सी ++

त्वरित नहीं किया जा सकता है; कम से कम 1 शुद्ध आभासी विधि है

class AB {public: virtual void f() = 0;};

जावा

त्वरित नहीं किया जा सकता है; गैर-सार तरीके हो सकते हैं

abstract class GraphicObject {}

इंटरफेस

कोई उदाहरण फ़ील्ड नहीं

सी ++

जावा के लिए तुलनीय कुछ भी नहीं

जावा

अमूर्त वर्ग के समान, लेकिन 1) कई विरासत का समर्थन करता है; 2) कोई उदाहरण फ़ील्ड नहीं

interface TestInterface {}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow