উত্তর:
ইন জাভা , সমস্ত অ-স্ট্যাটিক পদ্ধতি ডিফল্টভাবে এমন " ভার্চুয়াল ফাংশন। " শুধু দিয়ে চিহ্নিত পদ্ধতি শব্দ চূড়ান্ত , যা উপেক্ষিত হতে পারে না, সহ ব্যক্তিগত পদ্ধতি , যা উত্তরাধিকারসূত্রে করা হয় না, হয় অ ভার্চুয়াল ।
হ্যাঁ. আসলে জাভাতে সমস্ত উদাহরণ পদ্ধতি ডিফল্টরূপে ভার্চুয়াল। কেবলমাত্র কয়েকটি পদ্ধতি ভার্চুয়াল নয়:
এখানে কিছু উদাহরন:
"সাধারণ" ভার্চুয়াল ফাংশন
নীচের উদাহরণটি অন্য উত্তরে উল্লিখিত উইকিপিডিয়া পৃষ্ঠার একটি পুরানো সংস্করণ ।
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.
}
}
জাভাতে সমস্ত ফাংশন ডিফল্টরূপে ভার্চুয়াল।
"চূড়ান্ত" কীওয়ার্ড যুক্ত করে আপনাকে নন-ভার্চুয়াল ফাংশনগুলি লিখতে হবে।
এটি সি ++ / সি # ডিফল্টের বিপরীত। ক্লাস ফাংশনগুলি ডিফল্টরূপে অ-ভার্চুয়াল হয়; আপনি "ভার্চুয়াল" সংশোধক যুক্ত করে এগুলি তৈরি করেন।
সমস্ত বেসরকারী উদাহরণ পদ্ধতি জাভাতে ডিফল্টরূপে ভার্চুয়াল।
সি ++ এ, ব্যক্তিগত পদ্ধতিগুলি ভার্চুয়াল হতে পারে। এটি নন-ভার্চুয়াল-ইন্টারফেস (এনভিআই) আইডিয়ামের জন্য ব্যবহার করা যেতে পারে। জাভাতে, আপনাকে এনভিআই ওভারাইডেবল পদ্ধতিগুলি সুরক্ষিত করা দরকার।
জাভা ভাষার উল্লেখ থেকে, v3:
8.4.8.1 (তাত্ক্ষণিক পদ্ধতি দ্বারা) ওভাররাইডিং একটি ক্লাস সিতে ঘোষিত একটি উদাহরণ পদ্ধতি এম 1 অন্য শ্রেণির পদ্ধতি এম 2 কে ওভাররাইড করে, ক্লাস এ-তে ঘোষিত যদি নীচের সমস্ত সত্য হয়:
- সি হ'ল এ-এর একটি সাবক্লাস is
- এম 1 এর স্বাক্ষর হ'ল এম 2 এর স্বাক্ষরের একটি সাবজিগেইন (§8.4.2)।
- হয় * এম 2 টি সি হিসাবে একই প্যাকেজে সর্বজনীন, সুরক্ষিত বা ডিফল্ট অ্যাক্সেসের সাথে ঘোষিত হয়, বা * m1 কোনও পদ্ধতি এম 3, এম 3 থেকে পৃথক এম 3, এম 2 থেকে এম 2 পৃথক, যেমন এম 3 এমআরটিকে ওভাররাইড করে।
জাভাতে, সমস্ত পাবলিক (বেসরকারী) ভেরিয়েবল এবং ফাংশনগুলি ডিফল্টরূপে ভার্চুয়াল । চূড়ান্ত কীওয়ার্ড ব্যবহার করে ভেরিয়েবল এবং ফাংশনগুলি ভার্চুয়াল নয় ।