abstraction in java



ওভারলোডিং বনাম ওভারলোডিং বনাম Polymorphism (14)

polymorphism কি?

জাভা tutorial থেকে

পলিমারফিজমের অভিধান সংজ্ঞা জীববিজ্ঞানের একটি নীতি নির্দেশ করে, যার মধ্যে একটি জীব বা প্রজাতির বিভিন্ন রূপ বা স্তর থাকতে পারে। এই নীতিটি জাভা ভাষা মত বস্তু ভিত্তিক প্রোগ্রামিং এবং ভাষা প্রয়োগ করা যেতে পারে। একটি শ্রেণির উপশ্রেণীগুলি তাদের নিজস্ব অনন্য আচরণ সংজ্ঞায়িত করতে পারে এবং পিতামাতার ক্লাসের একই কার্যকারিতা ভাগ করে নিতে পারে।

উদাহরণ এবং সংজ্ঞা বিবেচনা করে, overriding উত্তর গ্রহণ করা উচিত।

আপনার দ্বিতীয় প্রশ্নের বিষয়ে:

যদি আপনার একটি বিমূর্ত বেস ক্লাস ছিল যা কোনও বাস্তবায়ন না করে একটি পদ্ধতি সংজ্ঞায়িত করে, এবং আপনি উপ-শ্রেণিতে যে পদ্ধতিটি সংজ্ঞায়িত করেছিলেন, তা কি এখনও উচ্চারণ করা হচ্ছে?

এটা overriding বলা উচিত।

Overriding বিভিন্ন ধরনের বুঝতে এই উদাহরণে একটি চেহারা আছে।

  1. বেজ ক্লাসটি কোনও বাস্তবায়ন সরবরাহ করে না এবং উপ-শ্রেণিকে সম্পূর্ণ পদ্ধতিতে ওভাররাইড করতে হয় - (বিমূর্ত)
  2. বেস ক্লাস ডিফল্ট বাস্তবায়ন প্রদান করে এবং সাব-ক্লাস আচরণ পরিবর্তন করতে পারে
  3. সাব-ক্লাসটি super.methodName() কে প্রথম বিবৃতি হিসাবে কল করে বেস ক্লাস বাস্তবায়নে এক্সটেনশান যোগ করে
  4. বেস বর্গটি আলগোরিদিম (টেমপ্লেট পদ্ধতি) এবং সাব-ক্লাসের গঠনকে সংজ্ঞায়িত করে আলগোরিদিমের একটি অংশকে ওভাররাইড করবে

টুকিটাকি সংকেতলিপি:

import java.util.HashMap;

abstract class Game implements Runnable{

    protected boolean runGame = true;
    protected Player player1 = null;
    protected Player player2 = null;
    protected Player currentPlayer = null;

    public Game(){
        player1 = new Player("Player 1");
        player2 = new Player("Player 2");
        currentPlayer = player1;
        initializeGame();
    }

    /* Type 1: Let subclass define own implementation. Base class defines abstract method to force
        sub-classes to define implementation    
    */

    protected abstract void initializeGame();

    /* Type 2: Sub-class can change the behaviour. If not, base class behaviour is applicable */
    protected void logTimeBetweenMoves(Player player){
        System.out.println("Base class: Move Duration: player.PlayerActTime - player.MoveShownTime");
    }

    /* Type 3: Base class provides implementation. Sub-class can enhance base class implementation by calling
        super.methodName() in first line of the child class method and specific implementation later */
    protected void logGameStatistics(){
        System.out.println("Base class: logGameStatistics:");
    }
    /* Type 4: Template method: Structure of base class can't be changed but sub-class can some part of behaviour */
    protected void runGame() throws Exception{
        System.out.println("Base class: Defining the flow for Game:");  
        while ( runGame) {
            /*
            1. Set current player
            2. Get Player Move
            */
            validatePlayerMove(currentPlayer);  
            logTimeBetweenMoves(currentPlayer);
            Thread.sleep(500);
            setNextPlayer();
        }
        logGameStatistics();
    }
    /* sub-part of the template method, which define child class behaviour */
    protected abstract void validatePlayerMove(Player p);

    protected void setRunGame(boolean status){
        this.runGame = status;
    }
    public void setCurrentPlayer(Player p){
        this.currentPlayer = p;
    }
    public void setNextPlayer(){
        if ( currentPlayer == player1) {
            currentPlayer = player2;
        }else{
            currentPlayer = player1;
        }
    }
    public void run(){
        try{
            runGame();
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

class Player{
    String name;
    Player(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

/* Concrete Game implementation  */
class Chess extends Game{
    public Chess(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized Chess game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate Chess move:"+p.getName());
    }
    protected void logGameStatistics(){
        super.logGameStatistics();
        System.out.println("Child class: Add Chess specific logGameStatistics:");
    }
}
class TicTacToe extends Game{
    public TicTacToe(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized TicTacToe game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate TicTacToe move:"+p.getName());
    }
}

public class Polymorphism{
    public static void main(String args[]){
        try{

            Game game = new Chess();
            Thread t1 = new Thread(game);
            t1.start();
            Thread.sleep(1000);
            game.setRunGame(false);
            Thread.sleep(1000);

            game = new TicTacToe();
            Thread t2 = new Thread(game);
            t2.start();
            Thread.sleep(1000);
            game.setRunGame(false);

        }catch(Exception err){
            err.printStackTrace();
        }       
    }
}

আউটপুট:

Child class: Initialized Chess game
Base class: Defining the flow for Game:
Child class: Validate Chess move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate Chess move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:
Child class: Add Chess specific logGameStatistics:
Child class: Initialized TicTacToe game
Base class: Defining the flow for Game:
Child class: Validate TicTacToe move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate TicTacToe move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:

https://ffff65535.com

জাভা ক্ষেত্রে, যখন কেউ জিজ্ঞেস করে:

polymorphism কি?

ওভারলোডিং বা overriding একটি গ্রহণযোগ্য উত্তর হতে হবে?

আমি এটা চেয়ে একটু বেশি আছে মনে হয়।

যদি আপনার একটি বিমূর্ত বেস ক্লাস ছিল যা কোনও বাস্তবায়ন না করে একটি পদ্ধতি সংজ্ঞায়িত করে, এবং আপনি উপ-শ্রেণিতে যে পদ্ধতিটি সংজ্ঞায়িত করেছিলেন, তা কি এখনও উচ্চারণ করা হচ্ছে?

আমি overloading নিশ্চিত করার জন্য সঠিক উত্তর মনে হয় না।


আপনি সঠিক যে overloading উত্তর হয় না।

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


আমি আপনার ধারণা ধারণা মিশ্রিত হয় মনে হয়। পলিমারফিজম একটি বস্তুর চালানোর সময় ভিন্নভাবে আচরণ করার ক্ষমতা। এই অর্জনের জন্য, আপনার দুটি প্রয়োজনীয়তা প্রয়োজন:

  1. শেষ বাঁধাই
  2. উত্তরাধিকার।

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

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

তাই উত্তর জাভা সম্পর্কে overloading ব্যবহার যখন কথা হয়। যেহেতু এটি অন্য কোনও ভাষায় ভিন্ন হতে পারে যেমন এটি সি ++ তে ঘটে


উভয় overriding এবং overloading polymorphism অর্জন করতে ব্যবহৃত হয়।

আপনি একটি শ্রেণীতে একটি পদ্ধতি থাকতে পারে যা এক বা একাধিক উপশ্রেণীতে ওভাররাইড করা হয়। কোন বস্তুটি তাত্ক্ষণিকভাবে ব্যবহৃত হয় তার উপর নির্ভর করে পদ্ধতিটি বিভিন্ন জিনিস করে।

    abstract class Beverage {
       boolean isAcceptableTemperature();
    }

    class Coffee extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature > 70;
       }
    }

    class Wine extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature < 10;
       }
    }

আপনি এমন একটি পদ্ধতিও থাকতে পারে যা আর্গুমেন্টগুলির দুটি বা তার বেশি সেটের সাথে ওভারলোড করা হয়। পদ্ধতি প্রকারের (গুলি) প্রকার (গুলি) পাসের উপর ভিত্তি করে বিভিন্ন জিনিস করে।

    class Server {
        public void pour (Coffee liquid) {
            new Cup().fillToTopWith(liquid);
        }

        public void pour (Wine liquid) {
            new WineGlass().fillHalfwayWith(liquid);
        }

        public void pour (Lemonade liquid, boolean ice) {
            Glass glass = new Glass();
            if (ice) {
                glass.fillToTopWith(new Ice());
            }
            glass.fillToTopWith(liquid);
        }
    }

ওভারলোডিং যখন আপনি একই নামের সাথে 2 টি পদ্ধতি সংজ্ঞায়িত করেন তবে বিভিন্ন পরামিতি

ওভার্রাইডিং যেখানে আপনি বেস ক্লাসের আচরণটি একটি সাব্ল্যাশে একই নামের সাথে একটি ফাংশনের মাধ্যমে পরিবর্তন করেন।

সুতরাং পলিমারফিজম ওভার্রাইডিং সম্পর্কিত কিন্তু প্রকৃতপক্ষে ওভারলোডিং সম্পর্কিত নয়।

তবে কেউ আমাকে "পলিমারফিজম কি?" প্রশ্নের জন্য "overriding" এর একটি সহজ উত্তর দিয়েছেন। আমি আরো ব্যাখ্যা জন্য জিজ্ঞাসা করবে।


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


পলিমারফিজম প্রকাশ করার সর্বাধিক উপায় একটি বিমূর্ত বেস বর্গ (বা ইন্টারফেস)

public abstract class Human{
   ...
   public abstract void goPee();
}

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

তাই আমরা বিমূর্ত শ্রেণী ব্যবহার করে বাস্তবায়ন বিলম্বিত।

public class Male extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Stand Up");
    }
}

এবং

public class Female extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Sit Down");
    }
}

এখন আমরা একটি পূর্ণ রুম বলতে পারবো মানুষের পূর্ণ পূর্ণিমা যেতে।

public static void main(String[] args){
    ArrayList<Human> group = new ArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    // ... add more...

    // tell the class to take a pee break
    for (Human person : group) person.goPee();
}

এই চলমান হবে ফলন:

Stand Up
Sit Down
...

পলিমারফিজম মানে একাধিক ফর্ম, একই বস্তু প্রয়োজন অনুযায়ী বিভিন্ন অপারেশন সম্পাদন।

Polymorphism দুটি উপায় ব্যবহার করে অর্জন করা যেতে পারে, যারা হয়

  1. পদ্ধতি overriding
  2. পদ্ধতি ওভারলোডিং

মেথড ওভারলোডিং মানে একই পদ্ধতিতে একই শ্রেণীতে দুই বা ততোধিক পদ্ধতি লেখা, তবে পাসিং প্যারামিটারগুলি ভিন্ন।

মেথড ওভার্রাইডিং মানে আমরা বিভিন্ন ক্লাসের পদ্ধতিগুলির নাম ব্যবহার করি, যার অর্থ শিশু শ্রেণীতে পিতা-মাতা শ্রেণী পদ্ধতি ব্যবহার করা হয়।

পলিমারফিজম অর্জন করতে জাভাতে একটি সুপার ক্লাস রেফারেন্স ভেরিয়েবল সাব ক্লাস অবজেক্ট ধরে রাখতে পারে।

পলিমারফিজম অর্জনের জন্য প্রত্যেক বিকাশকারীকে একই পদ্ধতির নাম অবশ্যই প্রকল্পে ব্যবহার করতে হবে।


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


বিশেষ করে overloading বা overriding বলার পুরো ছবি দিতে না। পলিমারফিজমটি কেবলমাত্র তার বস্তুর উপর ভিত্তি করে তার আচরণের দক্ষতার জন্য একটি বস্তুর ক্ষমতা।

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

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


শব্দটি ওভারলোডিং একই নাম দিয়ে কিছু একাধিক সংস্করণ ধারণ করে, সাধারণত বিভিন্ন পরামিতি তালিকা সহ পদ্ধতি

public int DoSomething(int objectId) { ... }
public int DoSomething(string objectName) { ... }

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

আপনি আপনার প্রশ্নের বর্ণনা হিসাবে, overriding সাধারণত polymorphism বোঝায়


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

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

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


পলিমারফিজম একটি বস্তুর একাধিক বাস্তবায়ন বা আপনি একটি বস্তুর একাধিক ফর্ম বলতে পারে। বলুন আপনার শ্রেণীটি Animalsবিমূর্ত বেস ক্লাস হিসাবে আছে এবং এটি একটি পদ্ধতি রয়েছে movement()যা পশুটিকে সরানোর উপায়টিকে সংজ্ঞায়িত করে। এখন বাস্তবে আমাদের বিভিন্ন ধরণের প্রাণী রয়েছে এবং তারা ভিন্নভাবে পাশাপাশি তাদের মধ্যে কয়েকটি পা, অন্যের সাথে 4 টি এবং কিছু পা নেই ইত্যাদি। movement()পৃথিবীতে প্রতিটি প্রাণীকে সংজ্ঞায়িত করার জন্য আমাদের পলিমোফিজম প্রয়োগ করতে হবে। যাইহোক, আপনাকে আরও ক্লাস বা শ্রেণি Dogs Cats Fishইত্যাদি সংজ্ঞায়িত করতে হবে । তারপরে আপনাকে বর্গ ক্লাস থেকে সেই ক্লাসগুলিকে প্রসারিত করতে হবে এবং আপনার Animalsপদ্ধতিতে movement()প্রতিটি প্রাণীর উপর ভিত্তি করে একটি নতুন আন্দোলন কার্যকারিতা সহ তার পদ্ধতিটিকে ওভাররাইড করতে হবে। আপনি ব্যবহার করতে পারেনInterfacesযে অর্জন করতে। এখানে কীওয়ার্ড ওভাররাইডিং, ওভারলোডিং ভিন্ন এবং পলিমারফিজম হিসাবে বিবেচিত হয় না। ওভারলোডিংয়ের মাধ্যমে আপনি "একই নামের সাথে" একাধিক পদ্ধতি সংজ্ঞায়িত করতে পারেন তবে একই বস্তু বা শ্রেণীতে বিভিন্ন পরামিতিগুলির সাথে।


পলিমারফিজম একটি ভাষার ক্ষমতা সম্পর্কিত একটি বস্তুকে একক ইন্টারফেস ব্যবহার করে অভিন্নভাবে চিকিত্সা করে; যেমন এটি ওভাররাইডিং সম্পর্কিত, তাই ইন্টারফেস (বা বেস ক্লাস) হল পলিমারফিক, বাস্তবায়নকারী এমন বস্তু যা ওভাররাইড করে (একই পদকটির দুটি মুখ)

যাইহোক, দুটি পদগুলির মধ্যে পার্থক্যটি অন্যান্য ভাষার সাহায্যে ভাল ব্যাখ্যা করা হয়েছে, যেমন c ++: সি ++ তে একটি পলিমোরফিক বস্তু বেস ফাংশনটি ভার্চুয়াল থাকলে এটি জাভা প্রতিরূপ হিসাবে আচরণ করে তবে যদি পদ্ধতিটি ভার্চুয়াল না হয় তবে কোডের ঝাঁপ স্থিরভাবে সমাধান করা হয় , এবং সত্য টাইপ রানটাইম এ চেক করা হয় না তাই, পলিমারফিজমে একটি বস্তুর এটি ব্যবহারের জন্য ব্যবহৃত ইন্টারফেসের উপর নির্ভর করে ভিন্নভাবে আচরণ করার ক্ষমতা অন্তর্ভুক্ত করে; আমাকে ছদ্দোকডে একটি উদাহরণ দিন:

class animal {
    public void makeRumor(){
        print("thump");
    }
}
class dog extends animal {
    public void makeRumor(){
        print("woff");
    }
}

animal a = new dog();
dog b = new dog();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

(মনে করে যে ম্যাকমার ভার্চুয়াল নয়)

জাভা সত্যিই polymorphism এই স্তর (এছাড়াও বস্তু slicing বলা হয়) প্রস্তাব না।

পশু একটি = নতুন কুকুর (); কুকুর বি = নতুন কুকুর ();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

উভয় ক্ষেত্রে এটি শুধুমাত্র woff মুদ্রণ করবে .. একটি এবং বি ক্লাস কুকুর referring হয়





override