जवाबों:
में जावा , सभी गैर-स्थिर तरीकों डिफ़ॉल्ट रूप से कर रहे हैं " आभासी काम करता है। " केवल के साथ चिह्नित तरीकों कीवर्ड के अंतिम है, जो ओवरराइड नहीं किया जा सकता है, के साथ साथ निजी तरीकों , जो नहीं ली गई है, कर रहे हैं गैर आभासी ।
हाँ। वास्तव में, जावा में सभी उदाहरण विधियां डिफ़ॉल्ट रूप से आभासी हैं। केवल कुछ विधियाँ आभासी नहीं हैं:
यहाँ कुछ उदाहरण हैं:
"सामान्य" आभासी कार्य
निम्नलिखित उदाहरण दूसरे उत्तर में उल्लिखित विकिपीडिया पृष्ठ के पुराने संस्करण से है।
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.
}
}
जावा में सभी फ़ंक्शन डिफ़ॉल्ट रूप से आभासी हैं।
आपको "अंतिम" कीवर्ड जोड़कर गैर-आभासी कार्यों को लिखने के लिए अपने रास्ते से बाहर जाना होगा।
यह C ++ / C # डिफ़ॉल्ट के विपरीत है। कक्षा के कार्य डिफ़ॉल्ट रूप से गैर-आभासी होते हैं; आप उन्हें "वर्चुअल" संशोधक जोड़कर बनाते हैं।
सभी गैर-निजी इंस्टेंस विधियाँ जावा में डिफ़ॉल्ट रूप से आभासी हैं।
C ++ में, निजी विधियाँ आभासी हो सकती हैं। इसका उपयोग गैर-आभासी-इंटरफ़ेस (एनवीआई) मुहावरे के लिए किया जा सकता है। जावा में, आपको एनवीआई को अधिक सुरक्षित तरीकों को सुरक्षित बनाने की आवश्यकता होगी।
जावा भाषा विशिष्टता से, v3:
8.4.8.1 ओवरराइडिंग (इंस्टेंस मेथड्स द्वारा) क्लास में घोषित किया गया इंस्टेंस मेथड एम 1 एक अन्य इंस्टेंस मेथड को ओवरराइड करता है, एम 2, क्लास ए में घोषित किया गया है यदि निम्न में से सभी सही हैं:
- C, A का उपवर्ग है।
- एम 1 के हस्ताक्षर, एम 2 के हस्ताक्षर का एक उप-भाग (.28.4.2) है।
- या तो * एम 2 सार्वजनिक, संरक्षित या सी के रूप में एक ही पैकेज में डिफ़ॉल्ट पहुंच के साथ घोषित किया गया है, या * एम 1 एक विधि एम 3 को ओवरराइड करता है, एम 1 से एम 3, एम 2 से अलग एम 3, जैसे कि एम 3 एम 2 को ओवरराइड करता है।
जावा में, सभी सार्वजनिक (गैर-निजी) चर और फ़ंक्शन डिफ़ॉल्ट रूप से आभासी हैं । इसके अलावा कीवर्ड फ़ाइनल का उपयोग करने वाले चर और फ़ंक्शंस वर्चुअल नहीं हैं ।