ওভাররাইডিং বনাম লুকানো জাভা - বিভ্রান্ত


88

জাভাতে লুকিয়ে থাকা থেকে ওভাররাইড করা কীভাবে আলাদা তার বিষয়ে আমি বিভ্রান্ত। এগুলি কীভাবে আলাদা হয় সে সম্পর্কে আরও বিশদ কী কেউ দিতে পারেন? আমি জাভা টিউটোরিয়াল পড়েছি কিন্তু নমুনা কোডটি এখনও আমাকে বিভ্রান্ত করেছে।

আরও স্পষ্ট করে বলতে গেলে, আমি ওভাররাইডিং ভালভাবে বুঝতে পারি। আমার ইস্যুটি হ'ল আমি দেখি না যে লুকানো কীভাবে অন্যরকম, অন্যটি ক্লাস স্তরে থাকা অবস্থায় একটি উদাহরণের স্তরে রয়েছে।

জাভা টিউটোরিয়াল কোডটি দেখছেন:

public class Animal {
    public static void testClassMethod() {
        System.out.println("Class" + " method in Animal.");
    }
    public void testInstanceMethod() {
        System.out.println("Instance " + " method in Animal.");
    }
}

তারপরে আমাদের একটি সাবক্লাস রয়েছে Cat:

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The class method" + " in Cat.");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method" + " in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

তখন তারা বলে:

এই প্রোগ্রামটি থেকে আউটপুট নিম্নরূপ:

পশুর মধ্যে ক্লাস পদ্ধতি।

বিড়ালের উদাহরণ পদ্ধতি।

আমার কাছে যে, আসলে একটি বর্গ পদ্ধতি কলিং testClassMethod()থেকে সরাসরি Animalবর্গ executes পদ্ধতি Animalবর্গ বেশ স্পষ্ট, কিছুই বিশেষ নেই। তারপরে তারা এটিকে testInstanceMethod()একটি রেফারেন্স থেকে কল করে myCat, তাই আবারও স্পষ্টতই স্পষ্ট হয় যে পরে কার্যকর করা পদ্ধতিটি উদাহরণটির মধ্যে একটি Cat

আমি যা দেখছি, কল আড়াল করা ঠিক ওভাররাইডের মতো আচরণ করে, তবে কেন এই পার্থক্যটি তৈরি করবেন? যদি আমি উপরের ক্লাসগুলি ব্যবহার করে এই কোডটি চালিত করি:

Cat.testClassMethod();

আমি পাব: বিড়ালের ক্লাস পদ্ধতি method তবে আমি যদি testClassMethod()ক্যাট থেকে এটি সরিয়ে ফেলি , তবে আমি পাব: পশুর মধ্যে ক্লাস পদ্ধতি।

যা আমাকে দেখায় যে একটি স্থিতিশীল পদ্ধতি, পিতামাতার মতো একই স্বাক্ষর সহ, একটি সাবক্লাসে প্রায় অনেকটা ওভাররাইড করে।

আশা করি আমি আমার কোথায় পরিষ্কার করছি যেখানে আমি বিভ্রান্ত হয়ে পড়েছি এবং কেউ কিছু আলোকপাত করতে পারে। অগ্রিম ধন্যবাদ!


উত্তর:


103

ওভাররাইডিং মূলত দেরীতে বাইন্ডিং সমর্থন করে। সুতরাং, কোন পদ্ধতিটি ডাকা হবে তা রান সময়ে নির্ধারিত। এটি অ স্থির পদ্ধতির জন্য।

লুকানো অন্যান্য সমস্ত সদস্যের জন্য (স্থিতিশীল পদ্ধতি, উদাহরণস্বরূপ সদস্য, স্থির সদস্য)। এটি প্রাথমিক বাঁধাইয়ের উপর ভিত্তি করে। আরও স্পষ্টভাবে, যে পদ্ধতি বা সদস্যকে ডাকা বা ব্যবহৃত হবে তা সংকলনের সময় সিদ্ধান্ত নেওয়া হয়।

আপনার উদাহরণস্বরূপ, প্রথম কলটি Animal.testClassMethod()কোনও staticপদ্ধতিতে কল call সুতরাং এটি নিশ্চিত যে কোন পদ্ধতিটি কল হতে চলেছে।

দ্বিতীয় কলটিতে, myAnimal.testInstanceMethod()আপনি একটি অ স্থিত পদ্ধতি কল করে। এটাকেই আপনি রান-টাইম পলিমারফিজম বলে। কোন পদ্ধতিটি কল করা হবে তা রান সময় পর্যন্ত স্থির হয় না।

আরও স্পষ্টতার জন্য, ওভাররাইডিং বনাম লুকানো পড়ুন


4
দ্রুত উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ, এটি এটি স্পষ্ট করে! আমি লক্ষ্য করেছি যে জাভাআরঞ্চ উদাহরণে তারা পরিবর্তনশীলকে ক্লাস পদ্ধতিটি কল করতে সরাসরি ক্লাস ব্যবহারের পরিবর্তে ব্যবহার করেছে যা এটি বুঝতে সহজ করে তোলে। আমি জাভা টিউটোরিয়াল তারা বর্গ ব্যবহৃত সরাসরি কারণ একটি দৃষ্টান্ত ব্যবহার ডাকতে একটি স্ট্যাটিক পদ্ধতি সম্ভবত ভাল অভ্যাস নয়, কিন্তু তারা ব্যবহৃত থাকা উচিত ) myAnimal.testClassMethod ( পরিবর্তে Animal.testClassMethod ()
লস্টলিঙ্কপ্রে

এটি উদাহরণের পরিবর্তে কথায় সঠিকভাবে লিখতে সক্ষম হওয়ার জন্য +1! :)
নটহাগো

@ কাজেকগে গ্যারা কি ওভারলোডিং এবং লুকানোর মধ্যে পার্থক্য রয়েছে?
gstackoverflow

4
আমি অবশ্যই উত্তরটি সহ একমত, তবে কীভাবে private methods? তারা হতে পারে না overriddenযেহেতু সাবক্লাসগুলি তাদের অস্তিত্ব সম্পর্কে জানে না ... সুতরাং তারা hiddenপরিবর্তে হতে পারে ।
পাসচালিস

দুর্দান্ত উত্তর! যদিও আপনি সম্পূর্ণতার স্বার্থে কোডরঞ্চে উদাহরণ যোগ করতে পারেন :)
শুভম মিত্তাল

19

স্থিতিশীল পদ্ধতিগুলি লুকানো থাকে, অ স্থিতিশীল পদ্ধতিগুলি ওভাররেড হয়। কলগুলি "কিছু ()" বনাম "এই.সোমথিং ()" যোগ্য না হলে পার্থক্যটি উল্লেখযোগ্য।

আমি সত্যিই এটি শব্দগুলিকে কমিয়ে দেবো বলে মনে হয় না, সুতরাং এখানে একটি উদাহরণ দেওয়া আছে:

public class Animal {

    public static void something() {
        System.out.println("animal.something");
    }

    public void eat() {
        System.out.println("animal.eat");
    }

    public Animal() {
        // This will always call Animal.something(), since it can't be overriden, because it is static.
        something();
        // This will call the eat() defined in overriding classes.
        eat();
    }

}


public class Dog extends Animal {

    public static void something() {
        // This method merely hides Animal.something(), making it uncallable, but does not override it, or alter calls to it in any way.
        System.out.println("dog.something");
    }

    public void eat() {
        // This method overrides eat(), and will affect calls to eat()
        System.out.println("dog.eat");
    }

    public Dog() {
        super();
    }

    public static void main(String[] args) {
        new Dog();
    }

}

আউটপুট:

animal.something
dog.eat

4
ঠিক আছে, তারপরে যদি আমি `কুকুরকে হস্কি বলি = নতুন কুকুর (); এবং কল husky.Animal();এটি মুদ্রণ করবে animal.something বা dog.something ? আমি তার অনুমান বলা ভুল ** যে ** এই সবসময় Animal.something () কল হবে
অমরনাথ হরিশ

@ অমরনাথারিশ আপনি করতে পারবেন না .Animal(), মনে রাখবেন Animal()একজন নির্মাতা ।
Dude156

এবং যে কেউ হতাশ জন্য আরও ব্যাখ্যা হিসাবে, কারণ something()এর মধ্যে Animal() সবসময় কল প্রাণীর something()কারণ একটি স্ট্যাটিক পদ্ধতি একটি কল সময় সঙ্কলন বদলে রান টাইমে সমাধান করা হয়। এর অর্থ স্থিতিশীল পদ্ধতি কলটি Animal()সর্বদা স্পষ্টভাবে কল করে Animal.something()। আপনি যদি এটির বিষয়ে চিন্তা করেন তবে এটি বেশ স্বজ্ঞাগত: কলটি className.staticMethodName()একই শ্রেণিতে না থাকলে স্ট্যাটিক পদ্ধতিতে কল অবশ্যই একটি শ্রেণীর নাম (যেমন ) দ্বারা করা উচিত ।
ডিউড 156

14

এটি ওভাররাইড এবং লুকানোর মধ্যে পার্থক্য,

  1. অভিভাবক শ্রেণি এবং শিশু শ্রেণিতে উভয় পদ্ধতিই যদি একটি উদাহরণ পদ্ধতি হয় তবে এটিকে ওভাররাইড বলে।
  2. অভিভাবক শ্রেণি এবং শিশু শ্রেণিতে উভয় পদ্ধতিই যদি স্থির পদ্ধতি হয় তবে এটিকে লুকোচুরি বলা হয়।
  3. একটি পদ্ধতি পিতামাতায় এবং সন্তানের উদাহরণ হিসাবে স্থির হতে পারে। এবং ভিসা বিপরীতে।

এখানে চিত্র বর্ণনা লিখুন


4
আপনি সেই টেবিলটি টিউটোরিয়াল থেকে সরাসরি কেটে পেস্ট করেছিলেন ওপ বলেন যে তাকে বুঝতে সাহায্য করেনি।
উলফ্যাসেল

সারণীটি এটি খুব স্পষ্ট করে তোলে, উদাহরণগুলিতে সমস্ত ক্ষেত্রে বিবেচনা করা হয়নি।
tutak

3

যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে উত্তরটি হ'ল "আপনি ইতিমধ্যে ওভাররাইড করছেন"।

"যা আমাকে দেখায় যে একটি স্থিতিশীল পদ্ধতি, পিতামাতার মতো একই নাম সহ, একটি সাবক্লাসে বেশ কিছুটা ওভাররাইড করে।"

আপনি যদি একটি সুপারক্লাসে একটি পদ্ধতির মতো একই নাম সহ একটি সাবক্লাসে কোনও পদ্ধতি লিখেন তবে এটি সুপারক্লাসের পদ্ধতিটিকে ওভাররাইড করবে। @ ওভাররাইড টীকা কোনও পদ্ধতির ওভাররাইডের প্রয়োজন হয় না। তবে এটি আপনার কোডটিকে আরও পঠনযোগ্য করে তোলে এবং সংকলকটিকে আপনি যে কোনও পদ্ধতিকে আসলে ওভাররাইড করছেন (তা উদাহরণস্বরূপ সাবক্লাস পদ্ধতিটি ভুল বানান করেন নি) তা পরীক্ষা করতে বাধ্য করে।


4
এই উত্তরটি ওভাররাইডিং / গোপনীয়তার ক্ষেত্রে উদাহরণ বনাম স্থিতিশীল পদ্ধতিগুলিতে সম্বোধন করতে ব্যর্থ।
পল বেলোরা

3

ওভাররাইডিং কেবল উদাহরণ পদ্ধতি দ্বারা ঘটে। যখন রেফারেন্স ভেরিয়েবলের প্রকারটি এনিমাল এবং অবজেক্টটি ক্যাট হয় তখন ক্যাট থেকে উদাহরণ পদ্ধতিটি কল করা হয় (এটি ওভাররাইডিং হয়) is একই একাট অবজেক্টের জন্য অ্যানিমাল শ্রেণির পদ্ধতি ব্যবহার করা হয়।

public static void main(String[] args) {
    Animal acat = new Cat();
    acat.testInstanceMethod();
    acat.testClassMethod();

}

আউটপুট হল:

The instance method in Cat.
Class method in Animal.

2
public class First {

    public void Overriding(int i) {  /* will be overridden in class Second */ }

    public static void Hiding(int i) {  /* will be hidden in class Second
                                           because it's static */ }
}


public class Second extends First {

    public void Overriding(int i) {  /* overridden here */  }

    public static void Hiding(int i) {  /* hides method in class First
                                           because it's static */ } 
}

মুখস্ত করার নিয়মটি সহজ: বর্ধিত শ্রেণীর কোনও পদ্ধতি স্থির অকার্যকরতে পরিবর্তন করতে পারে না এবং অকার্যকর স্থিতিতে পরিবর্তন করতে পারে না। এটি সংকলন-ত্রুটির কারণ হবে।

তবে যদি এটির void Nameপরিবর্তিত হয় তবে void Nameএটি ওভাররাইডিং।

এবং যদি এটির static Nameপরিবর্তিত হয় তবে static Nameএটি লুকিয়ে রয়েছে। (সাবক্লাসের স্থির পদ্ধতি পাশাপাশি সুপারক্লাসের একটিও বলা যেতে পারে, পদ্ধতিটি কল করতে ব্যবহৃত রেফারেন্সের উপর নির্ভর করে।)


1

এই কোড স্নিপেটে আমি আড়াল করার পদ্ধতি এবং ওভাররাইড পদ্ধতিগুলির মধ্যে পার্থক্য দেখাতে 'স্ট্যাটিক' পরিবর্তে 'ব্যক্তিগত' অ্যাক্সেস মডিফায়ার ব্যবহার করি।

class Animal {
// Use 'static' or 'private' access modifiers to see how method hiding work.
private void testInstancePrivateMethod(String source) {
    System.out.println("\tAnimal: instance Private method calling from "+source);
}
public void testInstanceMethodUsingPrivateMethodInside() {
    System.out.println("\tAnimal: instance Public method with using of Private method.");
    testInstancePrivateMethod( Animal.class.getSimpleName() );
}

// Use default, 'protected' or 'public' access modifiers to see  how method overriding work.
protected void testInstanceProtectedMethod(String source) {
    System.out.println("\tAnimal: instance Protected method calling from "+source);
}
public void testInstanceMethodUsingProtectedMethodInside() {
    System.out.println("\tAnimal: instance Public method with using of Protected method.");
    testInstanceProtectedMethod( Animal.class.getSimpleName() );
  } 
}  


public class Cat extends Animal {
private void testInstancePrivateMethod(String source) {
    System.out.println("Cat: instance Private method calling from " + source );
}
public void testInstanceMethodUsingPrivateMethodInside() {
    System.out.println("Cat: instance Public method with using of Private method.");
    testInstancePrivateMethod( Cat.class.getSimpleName());
    System.out.println("Cat: and calling parent after:");
    super.testInstanceMethodUsingPrivateMethodInside();
}

protected void testInstanceProtectedMethod(String source) {
    System.out.println("Cat: instance Protected method calling from "+ source );
}
public void testInstanceMethodUsingProtectedMethodInside() {
    System.out.println("Cat: instance Public method with using of Protected method.");
    testInstanceProtectedMethod(Cat.class.getSimpleName());
    System.out.println("Cat: and calling parent after:");
    super.testInstanceMethodUsingProtectedMethodInside();
}

public static void main(String[] args) {
    Cat myCat = new Cat();
    System.out.println("----- Method hiding -------");
    myCat.testInstanceMethodUsingPrivateMethodInside();
    System.out.println("\n----- Method overriding -------");
    myCat.testInstanceMethodUsingProtectedMethodInside();
}
}

আউটপুট:

----- Method hiding -------
Cat: instance Public method with using of Private method.
Cat: instance Private method calling from Cat
Cat: and calling parent after:
   Animal: instance Public method with using of Private method.
   Animal: instance Private method calling from Animal

----- Method overriding -------
Cat: instance Public method with using of Protected method.
Cat: instance Protected method calling from Cat
Cat: and calling parent after:
   Animal: instance Public method with using of Protected method.
Cat: instance Protected method calling from Animal

কেন এটি উপস্থাপনা পেলেন না কেন বিস্মিত হন ... অনেক প্রশংসিত উত্তর।
অমরনাথ হরিশ

0

আমার সাম্প্রতিক জাভা অধ্যয়নের উপর ভিত্তি করে

  • পদ্ধতি ওভাররাইডিং , যখন সাবক্লাসে সাবক্লাসে একই স্বাক্ষর সহ একই পদ্ধতি থাকে।
  • পদ্ধতি লুকানো , যখন সাবক্লাসে একই পদ্ধতির নাম থাকে তবে আলাদা পরামিতি থাকে। এই ক্ষেত্রে, আপনি প্যারেন্ট পদ্ধতিটি ওভাররাইড করছেন না, তবে এটি গোপন করছেন।

ওসিপি জাভা 7 বই, পৃষ্ঠা 70-71 থেকে উদাহরণ:

public class Point {
  private int xPos, yPos;
  public Point(int x, int y) {
        xPos = x;
        yPos = y;
  }

  public boolean equals(Point other){
  .... sexy code here ...... 
  }

  public static void main(String []args) {
   Point p1 = new Point(10, 20);
   Point p2 = new Point(50, 100);
   Point p3 = new Point(10, 20);
   System.out.println("p1 equals p2 is " + p1.equals(p2));
   System.out.println("p1 equals p3 is " + p1.equals(p3));
   //point's class equals method get invoked
  }
}

তবে আমরা যদি নিম্নলিখিতটি লিখি:

  public static void main(String []args) {
   Object p1 = new Point(10, 20);
   Object p2 = new Point(50, 100);
   Object p3 = new Point(10, 20);
   System.out.println("p1 equals p2 is " + p1.equals(p2));
   System.out.println("p1 equals p3 is " + p1.equals(p3));
   //Object's class equals method get invoked
  }

দ্বিতীয় প্রধানতে আমরা অবজেক্ট ক্লাসটিকে স্ট্যাটিক টাইপ হিসাবে ব্যবহার করি, সুতরাং আমরা যখন পয়েন্ট অবজেক্টে সমান পদ্ধতিটি কল করি তখন এটি পয়েন্ট ক্লাসটি প্যারামিটার হিসাবে উপস্থিত হওয়ার জন্য অপেক্ষা করে তবে অবজেক্ট আসবে। সুতরাং অবজেক্ট ক্লাসটি রান করার সমান পদ্ধতি, কারণ আমাদের সেখানে সমান (অবজেক্ট ও) আছে। এক্ষেত্রে পয়েন্টের শ্রেণি সমানভাবে ওভাররাইডের সমান হয় না তবে অবজেক্ট শ্রেণির সমান পদ্ধতিটি লুকায়


0
public class Parent {

  public static void show(){
    System.out.println("Parent");
  }
}

public class Child extends Parent{

  public static void show(){
    System.out.println("Child");
  }
}

public class Main {

public static void main(String[] args) {
    Parent parent=new Child();
    parent.show(); // it will call parent show method
  }
}

// We can call static method by reference ( as shown above) or by using class name (Parent.show())

0

লিঙ্কযুক্ত জাভা টিউটোরিয়াল পৃষ্ঠা ওভাররাইডিং এবং লুকানোর ধারণাটি ব্যাখ্যা করে

একই স্বাক্ষর সহ একটি সাবক্লাসে একটি উদাহরণ পদ্ধতি (নাম, সমেত সংখ্যা এবং এর পরামিতিগুলির ধরণ) এবং সুপারক্লাসে একটি উদাহরণ পদ্ধতি হিসাবে রিটার্ন টাইপ সুপারক্লাসের পদ্ধতিকে ওভাররাইড করে।

যদি একটি সাবক্লাস সুপারক্লাসে স্থির পদ্ধতি হিসাবে একই স্বাক্ষর সহ একটি স্ট্যাটিক পদ্ধতি সংজ্ঞায়িত করে, তবে সাবক্লাসের পদ্ধতিটি সুপারক্লাসের মধ্যে একটিটি আড়াল করে।

একটি স্থিতিশীল পদ্ধতি লুকিয়ে রাখার এবং একটি উদাহরণ পদ্ধতির ওভাররাইডের মধ্যে পার্থক্যটির গুরুত্বপূর্ণ জড়িত রয়েছে:

  1. ওভাররাইড হওয়া উদাহরণ পদ্ধতির সংস্করণটি যা অনুরোধ করা হয় তা হ'ল সাবক্লাসের মধ্যে একটি।
  2. আমন্ত্রিত হয়ে যায় এমন লুকানো স্থির পদ্ধতির সংস্করণটি সুপারক্লাস বা সাবক্লাস থেকে আহ্বান করা হয়েছে কিনা তার উপর নির্ভর করে।

আপনার উদাহরণে ফিরে আসছি:

Animal myAnimal = myCat;

 /* invokes static method on Animal, expected. */
 Animal.testClassMethod(); 

 /* invokes child class instance method (non-static - it's overriding) */
 myAnimal.testInstanceMethod();

উপরের বিবৃতিটি এখনও লুকানো দেখায় না।

বিভিন্ন আউটপুট পেতে এখন নীচের মত কোডটি পরিবর্তন করুন:

  Animal myAnimal = myCat;
  
  /* Even though myAnimal is Cat, Animal class method is invoked instead of Cat method*/
  myAnimal.testClassMethod();
  
  /* invokes child class instance method (non-static - it's overriding) */
  myAnimal.testInstanceMethod();

আমি নিজেকে লুকানোর শব্দের অর্থ বোঝার চেষ্টা করছি। কী লুকিয়ে আছে? অভিভাবক শ্রেণীর স্থির পদ্ধতিটি কি লুকানো থাকার কারণে (অন্তত প্রত্যাশিত) এটি চাওয়া হয়? বা চাইল্ড ক্লাসে স্থির পদ্ধতিটি কি লুকানো আছে, কারণ এটি চাওয়া হয় না?
বৃশ্চিক

0

উপরের তালিকাভুক্ত উদাহরণগুলি ছাড়াও, লুকানো এবং ওভাররাইডের মধ্যে পার্থক্য পরিষ্কার করার জন্য এখানে একটি ছোট নমুনা কোড রয়েছে:

public class Parent {

    // to be hidden (static)
    public static String toBeHidden() {
        return "Parent";
    }

    // to be overridden (non-static)
    public String toBeOverridden() {
        return "Parent";
    }

    public void printParent() {
        System.out.println("to be hidden: " + toBeHidden());
        System.out.println("to be overridden: " + toBeOverridden());
    }
}

public class Child extends Parent {

    public static String toBeHidden() {
        return "Child";
    }

    public String toBeOverridden() {
        return "Child";
    }

    public void printChild() {
        System.out.println("to be hidden: " + toBeHidden());
        System.out.println("to be overridden: " + toBeOverridden());
    }
}

public class Main {

    public static void main(String[] args) {
        Child child = new Child();
        child.printParent();
        child.printChild();
    }
}

কল child.printParent()আউটপুট:
লুকানো হবে: মূল
ওভাররাইড করা যেতে হবে: শিশু

কল child.printChild()আউটপুট:
লুকানো করা: শিশু
ওভাররাইড করা যেতে হবে: শিশু

উপরের আউটপুটগুলি (যেমন বিশেষত গা bold় চিহ্নযুক্ত আউটপুট) থেকে তীক্ষ্ণ দেখতে পাচ্ছে, পদ্ধতি লুকানো ওভাররাইড থেকে আলাদা আচরণ করে।

জাভা কেবল পদ্ধতিগুলির জন্য লুকিয়ে রাখা ও ওভাররাইড উভয়কেই অনুমতি দেয়। একই নিয়মটি ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য নয়। ওভাররাইডিং ভেরিয়েবলগুলি অনুমোদিত নয়, সুতরাং ভেরিয়েবলগুলি কেবল আড়াল করা যায় (স্ট্যাটিক বা অ-স্থিতিশীল ভেরিয়েবলের মধ্যে কোনও পার্থক্য নেই)। নীচের উদাহরণটি দেখায় যে পদ্ধতিটি getName()কীভাবে ওভাররেড হয় এবং ভেরিয়েবলটি nameলুকিয়ে থাকে:

public class Main {

    public static void main(String[] args) {
        Parent p = new Child();
        System.out.println(p.name); // prints Parent (since hiding)
        System.out.println(p.getName()); // prints Child (since overriding)
    }
}

class Parent {
    String name = "Parent";

    String getName() {
        return name;
    }
}

class Child extends Parent {
    String name = "Child";

    String getName() {
        return name;
    }
}

0

রানটাইম সময়ে একটি ওভাররাইড পদ্ধতির চাইল্ড সংস্করণ সর্বদা একটি উদাহরণের জন্য কার্যকর করা হয় পিতা-মাতা বা শিশু শ্রেণির পদ্ধতিতে পদ্ধতি কলটি ডিফিডে আছে কিনা regard এই পদ্ধতিতে, প্যারেন্টক্লাসনেম.মোথড () সিনট্যাক্সটি ব্যবহার করে প্যারেন্ট পদ্ধতিটিতে স্পষ্ট কল প্রেরণ না করা প্যারেন্ট পদ্ধতিটি কখনই ব্যবহার করা হয় না। বিকল্পভাবে, রানটাইমের সময় কোনও লুকানো পদ্ধতির পিতা-মাতার সংস্করণ সর্বদা কার্যকর করা হয় যদি পদ্ধতিটিতে কলটি প্যারেন্ট ক্লাসে সংজ্ঞায়িত করা হয়।


0

মেথড ওভাররাইডে , মেথড রেজোলিউশন জেভিএম দ্বারা রানটাইম অবজেক্টের ভিত্তিতে করা হয়। মেথড লুকানোর ক্ষেত্রে, পদ্ধতি সমাধান রেফারেন্সের ভিত্তিতে সংকলক দ্বারা সম্পন্ন করা হয়। এইভাবে,

কোডটি যদি লেখা হত তবে,

public static void main(String[] args) {
        Animal myCat = new Cat();        
        myCat.testClassMethod();        
    }

আউটপুট নীচের হিসাবে হবে:
পশু মধ্যে বর্গ পদ্ধতি।


0

এটিকে লুকোচুরি বলা হয় কারণ সংকলক সুপার ক্লাস পদ্ধতি প্রয়োগকরণকে গোপন করে, যখন সাবক্লাসে একই স্ট্যাটিক পদ্ধতি থাকে।

সংকলকটির ওভাররাইড পদ্ধতিগুলির জন্য কোনও সীমাবদ্ধ দৃশ্যমানতা নেই এবং এটি কেবল রানটাইম চলাকালীন সময়ে সিদ্ধান্ত নেওয়া হয় যে কোনটি ব্যবহৃত হয়।


0

এই ওভাররাইডিং এবং লুকানোর মধ্যে পার্থক্য:

প্রাণী a = নতুন বিড়াল ();

a.testClassMethod () পদ্ধতিটি আড়াল করার উদাহরণ হিসাবে পিতামাত্ত শ্রেণিতে পদ্ধতিটি কল করবে। কল করার পদ্ধতিটি রেফারেন্স ভেরিয়েবলের ধরণের মাধ্যমে নির্ধারিত হয় এবং সংকলনের সময় সিদ্ধান্ত নেওয়া হয়।

a.testInstanceMethod () শিশু শ্রেণিতে পদ্ধতিটি কল করবে কারণ এটি পদ্ধতিকে ওভাররাইড করার উদাহরণ। কল করার পদ্ধতিটি অবজেক্ট দ্বারা নির্ধারিত হয় যা রানটাইম সময়ে পদ্ধতিটি কল করতে ব্যবহৃত হয়।


0

আমি মনে করি এটি এখনও পুরোপুরি ব্যাখ্যা করা হয়নি। দয়া করে নীচের উদাহরণটি দেখুন।

class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}


public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Animal myCat = new Cat();
        Cat myCat2 = new Cat();
        myCat.testClassMethod();
        myCat2.testClassMethod();
        
        
        myCat.testInstanceMethod();
        myCat2.testInstanceMethod();
    }
}

ফলাফলটি নিম্নরূপ হবে।

The static method in Animal
The static method in Cat
The instance method in Cat
The instance method in Cat

-1

স্থির পদ্ধতি কীভাবে জাভাতে লুকিয়ে রয়েছে? বিড়াল ক্লাস প্রসারিত হয় অ্যানিম্যাল ক্লাসে। সুতরাং বিড়াল শ্রেণিতে উভয় স্থিতিশীল পদ্ধতি থাকবে (মানে শিশু শ্রেণীর স্থিতিশীল পদ্ধতি এবং প্যারেন্ট ক্লাসের স্ট্যাটিক পদ্ধতি) তবে কীভাবে জেভিএম প্যারেন্ট স্ট্যাটিক পদ্ধতি লুকিয়ে রাখে? এটি হিপ এবং স্ট্যাকের মধ্যে কীভাবে व्यवहार করছে?


এটি কোনও উত্তর নয়। এটি জিজ্ঞাসা করা প্রশ্নের এক্সটেনশন। এটি নিজেই একটি পৃথক প্রশ্ন বা প্রশ্নে মন্তব্যের একটি অংশ হতে পারে।
শ্রী 9911
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.