ক্লাস ভেরিয়েবলের বিষয়ে আপ-কাস্টিং এবং ডাউন-কাস্টিংয়ের মধ্যে পার্থক্য কী


138

শ্রেণি ভেরিয়েবলের বিষয়ে আপ-কাস্টিং এবং ডাউন-কাস্টিংয়ের মধ্যে পার্থক্য কী?

উদাহরণস্বরূপ নিম্নলিখিত প্রোগ্রাম শ্রেণিতে অ্যানিমালটিতে কেবলমাত্র একটি পদ্ধতি রয়েছে তবে কুকুর শ্রেণিতে দুটি পদ্ধতি রয়েছে তবে আমরা কীভাবে কুকুরের ভেরিয়েবলটিকে অ্যানিম্যাল ভেরিয়েবলে ফেলেছি।

যদি কাস্টিং করা হয়ে থাকে তবে আমরা কীভাবে কুকুরটিকে অ্যানিমাল ভেরিয়েবলের সাথে অন্য একটি পদ্ধতি বলতে পারি।

class Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}


class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class UseAnimlas 
{
    public static void main (String [] args) 
    {
        Dog d = new Dog();      
        Animal a = (Animal)d;
        d.callme();
        a.callme();
        ((Dog) a).callme2();
    }
}

Dogএকটি Animal। আপনি নির্দিষ্ট ওভারলোডেড পদ্ধতিটি ব্যবহার না করতে চাইলে বেশিরভাগ বার আপকাস্টিং অপ্রয়োজনীয়। callmeউভয় Animalএবং বিদ্যমান Dogcallme2কেবলমাত্র বিদ্যমান Dog, যা আপনি নিক্ষেপ aকরতে Dogএটি কাজ করা হয়।
ব্রায়ান

আপনার কোড এর আউটপুট কি?
মালভিন্দার সিং

মজার বিষয় হ'ল, সেই ড। কলমে 'কুকুরের কলমে' ফেরত দিয়েছে যদিও ডিটিকে পশুর হাতে ছড়িয়ে দেওয়া হয়েছিল !!
Chris311

4
@ Chris311 'd' এবং 'a' উভয়ই একই অবজেক্টের দিকে নির্দেশ করেছেন ... যা একটি কুকুর, তবে রানটাইমের সময় ডাউন কমে গেলে 'ক' কেবলমাত্র কুকুর নির্দিষ্ট পদ্ধতিতে অ্যাক্সেস পায়। প্রকৃত: প্রাণী a = (প্রাণী) d; অপ্রয়োজনীয়, আপনার কেবল অ্যানিমাল দরকার a = d; যেমন আপনি উপড়ে বেড়াচ্ছেন
মার্ক কেইন

উত্তর:


223

আপকাস্টিং একটি সুপার টাইপে কাস্টিং হচ্ছে, অন্যদিকে ডাউনকাস্টিং একটি সাব টাইপে কাস্ট করছে। আপকাস্টিং সর্বদা অনুমোদিত, তবে ডাউনকাস্টিংয়ে একটি টাইপ চেক জড়িত এবং এটি নিক্ষেপ করতে পারে ClassCastException

আপনার ক্ষেত্রে, একটি থেকে একটি ঢালাই Dogএকটি থেকে Animalকারণ একটি, একটি upCast হয় Dogহয়-একটি Animal। সাধারণভাবে, যখনই দুটি শ্রেণীর মধ্যে সম্পর্ক রয়েছে তখনই আপনি আপকাস্ট করতে পারেন।

ডাউন কাস্টিং কিছু হবে:

Animal animal = new Dog();
Dog castedDog = (Dog) animal;

আপনি কি মূলত করছেন কম্পাইলার কহন আপনি কি জানেন যে কি বস্তুর রানটাইম ধরনের সত্যিই হয়। সংকলক রূপান্তরটির অনুমতি দেবে, তবে রূপান্তরটি অর্থবোধ করে কিনা তা নিশ্চিত করতে একটি রানটাইম স্যানিটি পরীক্ষা করে inোকান। এই ক্ষেত্রে, ঢালাই সম্ভব কারণ রানটাইম এ animalআসলে একটি হয় Dogএমনকি যদিও স্ট্যাটিক টাইপ animalহয় Animal

তবে আপনি যদি এটি করতে থাকেন তবে:

Animal animal = new Animal();
Dog notADog = (Dog) animal;

আপনি একটি পাবেন ClassCastException। কারণটির animalরানটাইম টাইপ হ'ল কারণ Animal, এবং তাই যখন আপনি রানটাইমকে castালাই সঞ্চালনের জন্য বলবেন তখন এটি animalসত্যিই একটি নয় Dogএবং তাই একটি নিক্ষেপ করে ClassCastException

একটি সুপারক্লাসের পদ্ধতিটি কল করতে আপনি করতে পারেন super.method()বা আপকাস্ট সম্পাদন করে।

সাবক্লাসের পদ্ধতিতে কল করতে আপনাকে একটি ডাউনকাস্ট করতে হবে। উপরে প্রদর্শিত হিসাবে, আপনি সাধারণত এটি করে ঝুঁকিপূর্ণ ClassCastException; তবে, instanceofকাস্ট করার আগে আপনি অপারেটরটি অবজেক্টের রানটাইম ধরণের পরীক্ষা করতে ব্যবহার করতে পারেন , যা আপনাকে রোধ করতে দেয় ClassCastException:

Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) {
    // Guaranteed to succeed, barring classloader shenanigans
    Dog castedDog = (Dog) animal;
}

সঠিক ডাউনকাস্টিং কি ClassCastExceptionনা তা নিশ্চিত করে ? প্রথম ক্ষেত্রে মত?
মালভিন্দর সিং 5

@ এসএমএস "সঠিক" বলতে কী বোঝ?
awksp

2
@awksp এটি একটি দুর্দান্ত এবং স্পষ্ট উত্তর। কাস্টিং সম্পর্কে আমার যা জানা দরকার তা খুব সুন্দর করে তোলে।
গৌতম হনভনারা

নিশ্চয়ই আপনি এমন ক্লাস করেননি যেখানে প্রাণী কুকুরের উদাহরণ? তাহলে আপনি কেন এটি পরীক্ষা করছেন?
বারলপ

62

ডাউন কাস্টিং এবং আপ-কাস্টিং নিম্নরূপ ছিল:
এখানে চিত্র বর্ণনা লিখুন

উপকাস্টিং : যখন আমরা একটি সাব ক্লাসকে সুপার ক্লাসে কাস্ট করতে চাই, আমরা আপকাস্টিং (বা প্রশস্তকরণ) ব্যবহার করি। এটি স্বয়ংক্রিয়ভাবে ঘটে, স্পষ্টভাবে কিছু করার দরকার নেই।

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

Dog d = new Dog();
Animal a = (Animal) d; //Explicitly you have done upcasting. Actually no need, we can directly type cast like Animal a = d; compiler now treat Dog as Animal but still it is Dog even after upcasting
d.callme();
a.callme(); // It calls Dog's method even though we use Animal reference.
((Dog) a).callme2(); // Downcasting: Compiler does know Animal it is, In order to use Dog methods, we have to do typecast explicitly.
// Internally if it is not a Dog object it throws ClassCastException

সুতরাং, পদ্ধতিটির পিতামাতাকে কল করতে আপকাস্টিং করার কোনও উপায় নেই?
করলিহনস

32

আপকাস্টিং এবং ডাউনকাস্টিং জাভা-র গুরুত্বপূর্ণ অঙ্গ, যা আমাদেরকে সরল বাক্য গঠন ব্যবহার করে জটিল প্রোগ্রামগুলি তৈরি করতে দেয় এবং পলিমারফিজম বা বিভিন্ন বস্তুর গোষ্ঠীকরণের মতো দুর্দান্ত সুবিধা দেয়। জাভা একটি সাবক্লাস টাইপের একটি অবজেক্টকে যে কোনও সুপারক্লাস টাইপের একটি অবজেক্ট হিসাবে বিবেচনা করার অনুমতি দেয়। একে বলা হয় আপকাস্টিং। আপকাস্টিংটি স্বয়ংক্রিয়ভাবে সম্পন্ন হয়, যখন ডাউনক্রাস্টিং অবশ্যই ম্যানুয়ালি প্রোগ্রামার দ্বারা করা উচিত এবং কেন আমি কেন তা ব্যাখ্যা করার জন্য আমার সেরাটা দিতে যাচ্ছি।

আপকাস্টিং এবং ডাউনকাস্টিং একে অপর থেকে আদিম কাস্টিংয়ের মতো নয়, এবং আমি বিশ্বাস করি যে প্রোগ্রামার কাস্টিং অবজেক্টগুলি শিখতে শুরু করার পরে এটি প্রচুর বিভ্রান্তি সৃষ্টি করে।

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

আপনি নীচের উদাহরণটি দেখতে পারেন কীভাবে getType();বস্তুর (কুকুর, পোষা প্রাণী, পুলিশ কুকুর) ধরণ অনুযায়ী কাজ করে।

ধরুন আপনার কাছে তিনটি কুকুর রয়েছে

  1. কুকুর - এটি সুপার ক্লাস।

  2. পোষা কুকুর - পোষা কুকুর কুকুর প্রসারিত।

  3. পুলিশ কুকুর - পুলিশ কুকুর পোষা কুকুর প্রসারিত।

    public class Dog{ 
       public String getType () {
          System.out.println("NormalDog");
          return "NormalDog";
       }
     }
    
    /**
     * Pet Dog has an extra method dogName()
     */   
    public class PetDog extends Dog{ 
       public String getType () {
          System.out.println("PetDog");
          return "PetDog";
       }
       public String dogName () {
          System.out.println("I don't have Name !!");
          return "NO Name";
       }
     }
    
    /**
     * Police Dog has an extra method secretId()
     */
    public class PoliceDog extends PetDog{
    
     public String secretId() {
        System.out.println("ID");
        return "ID";
     }
    
     public String getType () {
         System.out.println("I am a Police Dog");
         return "Police Dog";
     }
    }
    

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

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

public static void main (String[] args) {
      /**
       * Creating the different objects with super class Reference
       */
     Dog obj1 = new Dog();
`         /**
           *  Object of Pet Dog is created with Dog Reference since                
           *  Upcasting is done automatically for us we don't have to worry about it 
           *  
           */
     Dog obj2 = new PetDog();
`         /**
           *  Object of Police Dog is created with Dog Reference since                
           *  Upcasting is done automatically for us we don't have to worry       
           *  about it here even though we are extending PoliceDog with PetDog 
           *  since PetDog is extending Dog Java automatically upcast for us 
           */
      Dog obj3 = new PoliceDog();
}



 obj1.getType();

ছাপে Normal Dog

  obj2.getType();

ছাপে Pet Dog

 obj3.getType();

ছাপে Police Dog

ডাউন কাস্টিংটি ম্যানুয়ালি প্রোগ্রামার দ্বারা করা দরকার

যখন আপনি যে secretID();পদ্ধতিটির উপর obj3ভিত্তি করে PoliceDog objectকিন্তু বর্ণক্রমের Dogএকটি উচ্চ বর্গ যা উল্লেখ করা হয় তখন এটি ত্রুটি ছুঁড়ে দেয় কারণ পদ্ধতিটিতে obj3অ্যাক্সেস নেই secretId()এই পদ্ধতিটি চালিত করার জন্য আপনাকে ডাউন কাস্ট করতে হবে যা ম্যানুয়ালি অ্যাজ 3 করে PoliceDog

  ( (PoliceDog)obj3).secretID();

যা প্রিন্ট করে ID

ক্লাসে dogName();পদ্ধতিটি অনুরোধ করার জন্য একই পদ্ধতিতে PetDogআপনাকে ডাউনকাস্ট obj2করতে হবে PetDogযেহেতু আপত্তি 2 তে রেফারেন্স করা হয়েছে Dogএবং dogName();পদ্ধতিটিতে অ্যাক্সেস নেই

  ( (PetDog)obj2).dogName();

কেন এমনটি হয়, সেই উজানটি স্বয়ংক্রিয় হয়, তবে ডাউনকাস্টিংটি ম্যানুয়াল হওয়া উচিত? ঠিক আছে, আপনি দেখুন, উজান কখনও ব্যর্থ হতে পারে না। কিন্তু আপনি যদি বিভিন্ন কুকুর একটি গ্রুপ আছে এবং তাদের সবাইকে ধরণ করার জন্য একটি থেকে downCast করতে চাই, তারপর সেখানে একটি সুযোগ, এই কুকুর কিছু ধরনের আসলে অর্থাৎ, যে PetDog, PoliceDogএবং প্রক্রিয়া, ব্যর্থ ছুঁড়ে ClassCastException

এই কারণেই যদি আপনি নিজের বস্তুগুলিকে সুপার ক্লাসের ধরণ হিসাবে উল্লেখ করে থাকেন তবে আপনাকে নিজের বস্তুগুলিকে ম্যানুয়ালি ডাউনকাস্ট করতে হবে ।

দ্রষ্টব্য: এখানে রেফারেন্স দেওয়ার অর্থ আপনি আপনার প্রকল্পগুলির মেমরিের ঠিকানা পরিবর্তন করছেন না যখন আপনি এটি ডাউনসেক্ট করেন এটি এখনও অবিরত থাকে আপনি কেবল তাদেরকে এই ক্ষেত্রে নির্দিষ্ট ধরণের গ্রুপিং করছেন are Dog


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

কেন না? এটি হ'ল ঠিক কী ঘটে আপনি উদাহরণ দিতে পারেন যেখানে এটি কাজ করবে না?
নাগরজুনা ইয়েলসিটি

1
কেন না? এটিই ঘটেছিল যা সঠিকভাবে ঘটে .. আপনি একটি উদাহরণ দিতে পারেন যেখানে বক্তব্যটি 'পলিমারফিজম পদ্ধতি কলের সময় স্বয়ংক্রিয়ভাবে ডাউনকাস্ট ব্যবহার করে।' ব্যর্থ হবে বা সত্য হবে না?
নাগরজুনা ইয়েলসিটি

এটা আপনার বিতর্ক। এটি প্রমাণ করার জন্য এটি আপনার উপর নির্ভর করে। অবজেক্ট কোডে ডাউনকাস্টটি কোথায় ঘটে তা দেখান। 'কেন নয়' কেন এই প্রশ্নের উত্তর কারণ এটি প্রয়োজনীয় নয়। ভিটিবেল পদ্ধতিটি প্রেরণের যত্ন নেয় এবং ভেরিয়েবল ইতিমধ্যে পুরো বস্তুকে নির্দেশ করে।
লার্নের মারকুইস

1
'আমার জ্ঞান অনুসারে আমার বক্তব্য সত্য এবং এটি প্রতিটি ক্ষেত্রেই ধারণ করে' প্রমাণ নয়। এটা নিছক দৃ is়তা। আমি আপনাকে আপনার বক্তব্য প্রমাণ করতে বলছি । আপনি এটা করছেন না। বাস্তবে আপনি কেবল নিজেকে পুনরাবৃত্তি করছেন। এবং আমি ইতিমধ্যে বেশ কয়েকটি খ্যাতি সরবরাহ করেছি। আমি একটি সিদ্ধান্ত পদ্ধতি প্রদান করেছি। যদি আপনি কোনও মেথড কলের জন্য অবজেক্ট কোডটিতে একটি ডাউনকাস্ট খুঁজে পেতে পারেন তবে আপনি সঠিক এবং আমি ভুল wrong বিজ্ঞান এভাবেই করা হয়। এটা কর. এবং দাবী করা যে আমি 'সাহসের সাথে ডকুমেন্টের উপর নির্ভরশীল' বলছি এটি একটি স্পষ্টত ভুল উপস্থাপনা। এটা করবেন না।
লার্নের মারকুইস

12

আমি জানি এই প্রশ্নটি বেশ দীর্ঘ সময় আগে জিজ্ঞাসা করা হয়েছিল তবে এই প্রশ্নের নতুন ব্যবহারকারীদের জন্য। অনুগ্রহ করে এই নিবন্ধটি পড়ুন যেখানে আপসকাস্টিং, ডাউনকাস্টিং এবং ইনস্ট্যান্স অফ অপারেটরের সম্পূর্ণ বিবরণ রয়েছে

  • ম্যানুয়ালি উত্সাহিত করার দরকার নেই, এটি নিজে থেকেই ঘটে:

    Mammal m = (Mammal)new Cat(); সমান Mammal m = new Cat();

  • তবে ডাউন কাস্টিং সর্বদা ম্যানুয়ালি করতে হবে:

    Cat c1 = new Cat();      
    Animal a = c1;      //automatic upcasting to Animal
    Cat c2 = (Cat) a;    //manual downcasting back to a Cat

কেন এমনটি হয়, সেই উজানটি স্বয়ংক্রিয় হয়, তবে ডাউনকাস্টিংটি ম্যানুয়াল হওয়া উচিত? ঠিক আছে, আপনি দেখুন, উজান কখনও ব্যর্থ হতে পারে না। তবে যদি আপনার কাছে বিভিন্ন প্রাণীর একটি গ্রুপ থাকে এবং সেগুলি একটি বিড়ালের কাছে ফেলে দিতে চান, তবে একটি সুযোগ আছে যে এই প্রাণীগুলির মধ্যে কিছু আসলে কুকুর, এবং প্রক্রিয়া ব্যর্থ হয়, ক্লাসকাস্ট এক্সেকশন ছুঁড়ে ফেলে। এখানেই "ইনসেন্টফ" নামে একটি দরকারী বৈশিষ্ট্য প্রবর্তন করা উচিত , যা কোনও পরীক্ষায় কোনও শ্রেণীর উদাহরণ থাকলে পরীক্ষা করে।

 Cat c1 = new Cat();         
    Animal a = c1;       //upcasting to Animal
    if(a instanceof Cat){ // testing if the Animal is a Cat
        System.out.println("It's a Cat! Now i can safely downcast it to a Cat, without a fear of failure.");        
        Cat c2 = (Cat)a;
    }

আরও তথ্যের জন্য এই নিবন্ধটি পড়ুন দয়া করে


শুভ পয়েন্ট: স্তন্যপায়ী m = (স্তন্যপায়ী) নতুন ক্যাট (); সমপরিমাণ এম = নতুন ক্যাট () এর সমান;
Catbuilts

6

উজানের জন্য এই পদ্ধতিটি আরও ভাল করে দেখুন, এটি বোঝা সহজ:

/* upcasting problem */
class Animal
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}

class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class Useanimlas 
{
    public static void main (String [] args) 
    {
        Animal animal = new Animal ();
        Dog dog = new Dog();
        Animal ref;
        ref = animal;
        ref.callme();
        ref = dog;
        ref.callme();
    }
}

এবং শেষ লাইনে এটি হতে পারে: ((কুকুর) রেফ) .ক্যালমে 2 (); // ডাউন কাস্টিং / সংকীর্ণকরণ এবং কলমে 2 () কুকুর শ্রেণির পদ্ধতি অ্যাক্সেসের জন্য।
udarH3

6

সম্ভবত এই টেবিল সাহায্য করে। callme()শ্রেণি Parentবা শ্রেণির পদ্ধতি কল করা Child। নীতি হিসাবে:

আপকাস্টিং -> লুকানো

ডাউনলোড -> প্রকাশ করা

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

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

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


4

1.- আপকাস্টিং।

একটি উজানদারীর কাজ করে আপনি কোনও ধরণের ট্যাগ সংজ্ঞায়িত করেন যা একটি উপ-টাইপের কোনও অবজেক্টের দিকে নির্দেশ করে (যদি আপনি আরও স্বাচ্ছন্দ্য বোধ করেন তবে টাইপ এবং সাব টাইপটিকে শ্রেণি এবং সাবক্লাস বলা যেতে পারে ...)।

Animal animalCat = new Cat();

এর অর্থ কী যে এই জাতীয় ট্যাগ, অ্যানিম্যালজ্যাট, কেবলমাত্র টাইপ অ্যানিমাল এর কার্যকারিতা (পদ্ধতিগুলি) রাখবে, কারণ আমরা এটিকে টাইপ অ্যানিমাল হিসাবে ঘোষণা করেছি, টাইপ ক্যাট হিসাবে নয়।

আমাদের "প্রাকৃতিক / অন্তর্নিহিত / স্বয়ংক্রিয়" উপায়ে এটি করার অনুমতি দেওয়া হয়েছে সংকলন-সময়ে বা রান-টাইমে, মূলত কারণ বিড়াল তার কিছু কার্যকারিতা অ্যানিমাল থেকে প্রাপ্ত করে; উদাহরণস্বরূপ, সরান ()। (কমপক্ষে, বিড়াল একটি প্রাণী, তাই না?)

2.- ডাউন কাস্টিং।

তবে, আমাদের ধরণের অ্যানিমাল ট্যাগ থেকে ক্যাট এর কার্যকারিতা পাওয়ার দরকার থাকলে কী হবে?

যেহেতু আমরা একটি বিড়াল বস্তুর দিকে ইশারা করে প্রাণীজগ ট্যাগ তৈরি করেছি, আমাদের অ্যানিমেটিক ট্যাগ থেকে কিছু স্মার্ট সুন্দর পদ্ধতিতে আমাদের ক্যাট অবজেক্ট পদ্ধতিগুলি কল করার একটি উপায় প্রয়োজন।

এই জাতীয় পদ্ধতিটিকে আমরা ডাউনকাস্টিং বলি এবং আমরা এটি কেবল রান-টাইমে করতে পারি।

কিছু কোডের জন্য সময়:

public class Animal {
    public String move() {
        return "Going to somewhere";
    }
}

public class Cat extends Animal{
    public String makeNoise() {
        return "Meow!";
    }   
}

public class Test {

    public static void main(String[] args) {
        
    //1.- Upcasting 
    //  __Type_____tag________object
        Animal animalCat = new Cat();
    //Some animal movement
        System.out.println(animalCat.move());
        //prints "Going to somewhere"
        
    //2.- Downcasting   
    //Now you wanna make some Animal noise.
        //First of all: type Animal hasn't any makeNoise() functionality.
        //But Cat can do it!. I wanna be an Animal Cat now!!
        
        //___________________Downcast__tag_____ Cat's method
        String animalNoise = ( (Cat) animalCat ).makeNoise();
        
        System.out.println(animalNoise);
        //Prints "Meow!", as cats usually done.
        
    //3.- An Animal may be a Cat, but a Dog or a Rhinoceros too.
        //All of them have their own noises and own functionalities.
        //Uncomment below and read the error in the console:
        
    //  __Type_____tag________object
        //Cat catAnimal = new Animal();
        
    }

}

2

পিতামাতা: গাড়ী
শিশু: ফিগো
গাড়ি সি 1 = নতুন ফিগো ();

=====
Upcasting: -
পদ্ধতি: অবজেক্ট C1 ক্লাস পদ্ধতি পড়ুন পাবেন (Figo - পদ্ধতি ওভাররাইড করা যেতে আবশ্যক) কারণ শ্রেণী "Figo" সঙ্গে "নতুন" নির্দিষ্ট করা হয়েছে।
ইনস্ট্যান্স ভেরিয়েবল: অবজেক্ট সি 1 ঘোষণাপত্রের ক্লাসের ("গাড়ি") এর উদাহরণ পরিবর্তনশীলকে উল্লেখ করবে।

যখন ডিক্লারেশন ক্লাসটি প্যারেন্ট হয় এবং অবজেক্টটি সন্তানের তৈরি হয় তবে অন্তর্নিহিত কাস্টিং ঘটে যা হয় "আপকাস্টিং"।

======
ডাউন কাস্টিং: -
ফিগো এফ 1 = (ফিগো) সি 1; //
পদ্ধতি: অবজেক্ট এফ 1 ক্লাস "ফিগো" দিয়ে প্রাথমিক বস্তু সি 1 তৈরি হওয়ার সাথে ক্লাসের মেথড (ফিগো) উল্লেখ করবে। তবে একবার ডাউন কাস্টিং হয়ে গেলে, পদ্ধতিগুলি যা কেবল "ফিগো" শ্রেণিতে উপস্থিত থাকে সেগুলিও ভেরিয়েবল এফ 1 দ্বারা উল্লেখ করা যেতে পারে।
ইনস্ট্যান্স ভেরিয়েবল: অবজেক্ট এফ 1 অ্যাক্সেস সি 1 এর ডিক্লারেশন ক্লাসের উদাহরণ ভেরিয়েবলকে উল্লেখ করবে না (সি 1 এর জন্য ডিক্লেয়ারেশন ক্লাস সিএআর) তবে ডাউন কাস্টিংয়ের সাথে এটি ফিগো শ্রেণীর উদাহরণ ভেরিয়েবলগুলি উল্লেখ করবে।

======
ব্যবহার করুন: যখন অবজেক্টটি চাইল্ড ক্লাসের হয় এবং ডিক্লেয়ারেশন ক্লাসটি পিতামাতা হয় এবং শিশু শ্রেণি তার নিজস্ব বর্গের ইনস্ট্যান্স ভেরিয়েবল অ্যাক্সেস করতে চায় এবং প্যারেন্ট ক্লাসের নয় তখন এটি "ডাউনকাস্টিং" দিয়ে করা যেতে পারে।


1

আপকাস্টিং এর অর্থ বস্তুটিকে একটি সুপার টাইপে কাস্ট করা, যখন ডাউনকাস্টিংয়ের অর্থ একটি সাব টাইপে কাস্টিং।

জাভাতে, আপকাস্টিংটি প্রয়োজনীয় নয় কারণ এটি স্বয়ংক্রিয়ভাবে হয়ে যায়। এবং এটি সাধারণত অন্তর্ভুক্ত castালাই হিসাবে উল্লেখ করা হয়। এটি অন্যের কাছে পরিষ্কার করার জন্য আপনি এটি নির্দিষ্ট করতে পারেন।

এইভাবে, লেখা

Animal a = (Animal)d;

অথবা

Animal a = d;

ঠিক একই পয়েন্ট বাড়ে এবং উভয় ক্ষেত্রেই callme()থেকে কার্যকর করা হবে Dog

ডাউন কাস্টিং এর পরিবর্তে প্রয়োজনীয় কারণ আপনি অ্যানিমাল aঅবজেক্ট হিসাবে সংজ্ঞায়িত করেছেন। বর্তমানে আপনি জানেন যে এটি একটি Dog, তবে জাভা এর কোনও গ্যারান্টি নেই। আসলে রানটাইমের সময় এটি আলাদা হতে পারে এবং জাভা একটি নিক্ষেপ করবে ClassCastException, এমনটি কি ঘটবে। অবশ্যই এটি আপনার খুব নমুনা উদাহরণের ক্ষেত্রে নয়। আপনি নিক্ষেপ না চান তাহলে aকরতে Animal, Java এমনকি আবেদন কম্পাইল করতে পারে না কারণ Animalপদ্ধতি নেই callme2()

আপনার উদাহরণে আপনি কোড পৌঁছতে পারে না callme()এর Animalথেকে UseAnimlas(কারণ Dogসেটি মুছে) যদি না পদ্ধতি হিসাবে ফলো হবে:

class Dog extends Animal 
{ 
    public void callme()
    {
        super.callme();
        System.out.println("In callme of Dog");
    }
    ... 
} 

0

আমরা ডাউনকাস্টিংয়ের জন্য বস্তু তৈরি করতে পারি। এই ধরণের মধ্যে। : বেস ক্লাসের পদ্ধতিগুলি কল করা

Animal a=new Dog();
a.callme();
((Dog)a).callme2();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.