क्या आप जावा में वर्चुअल फ़ंक्शंस / तरीके लिख सकते हैं?


165

क्या जावा में वर्चुअल तरीके लिखना संभव है , जैसा कि C ++ में कोई करेगा?

या, क्या एक उचित जावा दृष्टिकोण है जिसे आप लागू कर सकते हैं जो समान व्यवहार पैदा करता है? क्या मुझे कुछ उदाहरण मिल सकते हैं?

जवाबों:


305

से विकिपीडिया

में जावा , सभी गैर-स्थिर तरीकों डिफ़ॉल्ट रूप से कर रहे हैं " आभासी काम करता है। " केवल के साथ चिह्नित तरीकों कीवर्ड के अंतिम है, जो ओवरराइड नहीं किया जा सकता है, के साथ साथ निजी तरीकों , जो नहीं ली गई है, कर रहे हैं गैर आभासी



मैं wonded यदि यह वास्तव में सच है, क्योंकि मैं क्या पढ़ा है, जावा में, गतिशील विधि प्रेषण केवल वस्तु विधि पर कहा जाता है के लिए होता है के लिए - के रूप में समझाया यहाँ तो उदाहरण के लिए C आभासी कार्यों समझा ++ यहां जावा के लिए मान्य नहीं है।
ब्रोकोली

@QuaziIrfan यह जावा और C # के बीच अंतर है।
श्रीकांत करुमनघाट

101

क्या आप जावा में वर्चुअल फ़ंक्शंस लिख सकते हैं?

हाँ। वास्तव में, जावा में सभी उदाहरण विधियां डिफ़ॉल्ट रूप से आभासी हैं। केवल कुछ विधियाँ आभासी नहीं हैं:

  • क्लास मेथड (क्योंकि आमतौर पर प्रत्येक इंस्टेंस अपने विशिष्ट तरीकों के बारे में एक पॉइंटर को पॉइंटर की तरह जानकारी रखता है, लेकिन यहां कोई इंस्टेंस उपलब्ध नहीं है)।
  • निजी उदाहरण विधियाँ (क्योंकि कोई अन्य वर्ग विधि तक नहीं पहुँच सकता है, कॉलिंग उदाहरण में हमेशा परिभाषित करने वाले वर्ग का प्रकार होता है और इसलिए इसे संकलित रूप से संकलन समय पर जाना जाता है)।

यहाँ कुछ उदाहरण हैं:

"सामान्य" आभासी कार्य

निम्नलिखित उदाहरण दूसरे उत्तर में उल्लिखित विकिपीडिया पृष्ठ के पुराने संस्करण से है।

import java.util.*;

public class Animal 
{
   public void eat() 
   { 
      System.out.println("I eat like a generic Animal."); 
   }

   public static void main(String[] args) 
   {
      List<Animal> animals = new LinkedList<Animal>();

      animals.add(new Animal());
      animals.add(new Fish());
      animals.add(new Goldfish());
      animals.add(new OtherAnimal());

      for (Animal currentAnimal : animals) 
      {
         currentAnimal.eat();
      }
   }
}

class Fish extends Animal 
{
   @Override
   public void eat() 
   { 
      System.out.println("I eat like a fish!"); 
   }
}

class Goldfish extends Fish 
{
   @Override
   public void eat() 
   { 
      System.out.println("I eat like a goldfish!"); 
   }
}

class OtherAnimal extends Animal {}

आउटपुट:

मैं जेनेरिक एनिमल की तरह खाता हूं।
मैं मछली की तरह खाता हूं!
मैं एक सुनहरी मछली की तरह खाता हूँ!
मैं जेनेरिक एनिमल की तरह खाता हूं।

इंटरफेस के साथ आभासी कार्यों के साथ उदाहरण

जावा इंटरफ़ेस विधियाँ सभी आभासी हैं। उन्हें आभासी होना चाहिए क्योंकि वे विधि कार्यान्वयन प्रदान करने के लिए कार्यान्वयन कक्षाओं पर भरोसा करते हैं। निष्पादित करने के लिए कोड केवल रन समय पर चुना जाएगा।

उदाहरण के लिए:

interface Bicycle {         //the function applyBrakes() is virtual because
    void applyBrakes();     //functions in interfaces are designed to be 
}                           //overridden.

class ACMEBicycle implements Bicycle {
    public void applyBrakes(){               //Here we implement applyBrakes()
       System.out.println("Brakes applied"); //function
    }
}

अमूर्त वर्गों के साथ आभासी कार्यों के साथ उदाहरण।

इंटरफेस के समान ही एब्सट्रैक्ट क्लास में वर्चुअल तरीके होने चाहिए क्योंकि वे फैली हुई कक्षाओं के कार्यान्वयन पर निर्भर करते हैं। उदाहरण के लिए:

abstract class Dog {                   
    final void bark() {               //bark() is not virtual because it is 
        System.out.println("woof");   //final and if you tried to override it
    }                                 //you would get a compile time error.

    abstract void jump();             //jump() is a "pure" virtual function 
}                                     
class MyDog extends Dog{
    void jump(){
        System.out.println("boing");    //here jump() is being overridden
    }                                  
}
public class Runner {
    public static void main(String[] args) {
        Dog dog = new MyDog();       // Create a MyDog and assign to plain Dog variable
        dog.jump();                  // calling the virtual function.
                                     // MyDog.jump() will be executed 
                                     // although the variable is just a plain Dog.
    }
}

1
यह सबसे पूर्ण उत्तर हो गया है। यह वर्चुअल फ़ंक्शन को कार्यान्वित करने के 2 तरीके प्रदान करता है क्योंकि जावा में कीवर्ड नहीं है। धन्यवाद।
क्रिस्टोफर बाल्स

विकिपीडिया उद्धरण से बहुत बेहतर उत्तर। सी ++ से आ रहा है और मेरे जावा अध्ययनों के साथ आलसी होने के कारण, मैं जो देख रहा था वह अमूर्त था।
डेविड

@ डेविड यह उत्तर कैसे बेहतर है? विकिपीडिया उद्धरण पूर्ण, संक्षिप्त और सही है। यह उत्तर, इसके विपरीत, कमरे में हाथी का उल्लेख करने में विफल रहता है: डिफ़ॉल्ट रूप से जावा में सभी फ़ंक्शन (विकिपीडिया लेख में सूचीबद्ध अपवादों के साथ) आभासी हैं। आभासी कार्यों के लिए न तो अमूर्त वर्ग और न ही इंटरफेस आवश्यक है, इसलिए यह केवल भ्रामक शोर जोड़ रहा है। और फिर इस "महान संचार कौशल और अंतर्निहित सिद्धांतों की गहरी महारत की आवश्यकता है" ... जीज़। यह एक आत्म-गलत कथन है: कोई भी ऐसा नहीं था जो इसके साथ मूल्यवान डिस्क स्थान को बर्बाद कर देगा।
पीटर -

विकिपीडिया पोस्ट इस उत्तर से हीन और कम विशिष्ट है क्योंकि यह केवल जावा के बजाय किसी भी भाषा में आभासी कार्यों की अवधारणा के बारे में है। विकिपीडिया पृष्ठ में दिया गया उदाहरण C में लिखा गया है, और यह एक अधूरा है, और यह अधिक भ्रामक है। सभी फ़ंक्शंस के वर्चुअल होने के बारे में विस्तार से, और यह कि आपको एब्सट्रैक्ट क्लासेस या इंटरफेस की ज़रूरत नहीं है, ताकि वर्चुअल फ़ंक्शंस का शोर हो। मैंने कभी नहीं कहा कि वे आवश्यक हैं, आपने इसे गलत बताया। मैं आपके अंतिम बिंदु को नहीं समझ रहा हूँ, क्या आप चाहते हैं कि मैं इस प्रश्न को हटा दूं क्योंकि आपको यह पसंद नहीं है?
एरिक लेसचिंस्की

1
यहां कुछ साल देर से लेकिन शानदार जवाब
टॉम ओ।

55

जावा में सभी फ़ंक्शन डिफ़ॉल्ट रूप से आभासी हैं।

आपको "अंतिम" कीवर्ड जोड़कर गैर-आभासी कार्यों को लिखने के लिए अपने रास्ते से बाहर जाना होगा।

यह C ++ / C # डिफ़ॉल्ट के विपरीत है। कक्षा के कार्य डिफ़ॉल्ट रूप से गैर-आभासी होते हैं; आप उन्हें "वर्चुअल" संशोधक जोड़कर बनाते हैं।


4
क्लॉस के उत्तर में बताए गए निजी कार्य भी गैर-आभासी हैं।
डॉन लैरिंक्स

9

सभी गैर-निजी इंस्टेंस विधियाँ जावा में डिफ़ॉल्ट रूप से आभासी हैं।

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

जावा भाषा विशिष्टता से, v3:

8.4.8.1 ओवरराइडिंग (इंस्टेंस मेथड्स द्वारा) क्लास में घोषित किया गया इंस्टेंस मेथड एम 1 एक अन्य इंस्टेंस मेथड को ओवरराइड करता है, एम 2, क्लास ए में घोषित किया गया है यदि निम्न में से सभी सही हैं:

  1. C, A का उपवर्ग है।
  2. एम 1 के हस्ताक्षर, एम 2 के हस्ताक्षर का एक उप-भाग (.28.4.2) है।
  3. या तो * एम 2 सार्वजनिक, संरक्षित या सी के रूप में एक ही पैकेज में डिफ़ॉल्ट पहुंच के साथ घोषित किया गया है, या * एम 1 एक विधि एम 3 को ओवरराइड करता है, एम 1 से एम 3, एम 2 से अलग एम 3, जैसे कि एम 3 एम 2 को ओवरराइड करता है।

4

हां, आप जावा में वर्चुअल "फ़ंक्शंस" लिख सकते हैं।


1

जावा में, सभी सार्वजनिक (गैर-निजी) चर और फ़ंक्शन डिफ़ॉल्ट रूप से आभासी हैं । इसके अलावा कीवर्ड फ़ाइनल का उपयोग करने वाले चर और फ़ंक्शंस वर्चुअल नहीं हैं ।


"आभासी चर" से आपका क्या मतलब है?
नवविवाहित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.