জাভা গতিশীল বাঁধাই এবং পদ্ধতি ওভাররাইড


90

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

আমাকে যে সমস্যাটি দেওয়া হয়েছিল তা এখানে:

/* What is the output of the following program? */

public class Test {

  public boolean equals( Test other ) {
    System.out.println( "Inside of Test.equals" );
    return false;
  }

  public static void main( String [] args ) {
    Object t1 = new Test();
    Object t2 = new Test();
    Test t3 = new Test();
    Object o1 = new Object();

    int count = 0;
    System.out.println( count++ );// prints 0
    t1.equals( t2 ) ;
    System.out.println( count++ );// prints 1
    t1.equals( t3 );
    System.out.println( count++ );// prints 2
    t3.equals( o1 );
    System.out.println( count++ );// prints 3
    t3.equals(t3);
    System.out.println( count++ );// prints 4
    t3.equals(t2);
  }
}

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

দৃশ্যত না. আমার সাক্ষাত্কারকারক নিজেই প্রোগ্রামটি চালানোর জন্য আমাকে উত্সাহিত করেছিলেন, এবং দেখুন, ওভাররাইড করা পদ্ধতি থেকে কেবলমাত্র একটি একক আউটপুট ছিল: লাইনে t3.equals(t3)

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


দয়া করে এই উত্তরটিতে আমার পোস্টটি সন্ধান করুন যেখানে আমি অতিরিক্ত কেসগুলির সাথে ব্যাখ্যা করার জন্য যথাসাধ্য চেষ্টা করেছি। আমি আপনার ইনপুটগুলি সত্যই প্রশংসা করব :)
দেবেন্দ্র লাট্টু

উত্তর:


82

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

এখানে কিছু আলোচনা

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

সম্পাদনা করুন: এখানেও একটি ভাল বর্ণনা । এই উদাহরণটি পরিবর্তে প্যারামিটারের ধরণের সাথে সম্পর্কিত একই সমস্যা দেখাচ্ছে, কিন্তু একই সমস্যার কারণে।

আমি বিশ্বাস করি যে বাঁধাই যদি প্রকৃতপক্ষে গতিশীল থাকে তবে কলর এবং পরামিতি পরীক্ষার উদাহরণ হিসাবে যে কোনও ক্ষেত্রেই ওভাররাইড পদ্ধতিতে ডাকা হবে। সুতরাং t3.equals (o1) একমাত্র কেস যা মুদ্রণ করবে না।


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

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

14
@ ওভাররাইড টীকা উপস্থিত থাকার আরেকটি কারণ।
ম্যাট

4
আমার পরে পুনরাবৃত্তি করুন: "জাভা ওভারলোডেড পদ্ধতিগুলির জন্য স্ট্যাটিক বাঁধাই ব্যবহার করে, এবং ওভাররাইড
হওয়াগুলির

4
সুতরাং আমি এই না জেনে স্নাতক। ধন্যবাদ!
আতিহ

26

equalsপদ্ধতি Testওভাররাইড নেই equalsপদ্ধতি java.lang.Object। প্যারামিটারের ধরণটি দেখুন! Testবর্গ ওভারলোডিং হয় equalsএকটি পদ্ধতি যে একটি গ্রহণ সঙ্গে Test

যদি equalsপদ্ধতিটি ওভাররাইডের উদ্দেশ্যে করা হয় তবে এটি @ ওভাররাইড টীকাটি ব্যবহার করা উচিত। এটি এই সাধারণ ভুলটিকে নির্দেশ করতে সংকলনের ত্রুটির কারণ হতে পারে।


হ্যাঁ, আমি কেন খুব সহজেই জানি না যে আমি কেন সেই সাধারণ তবুও অত্যন্ত গুরুত্বপূর্ণ বিবরণটি মিস করেছি, কিন্তু আমার সমস্যাটি ঠিক সেখানে ছিল। ধন্যবাদ!
ম্যাগসোল

প্রশ্নকারীর কৌতূহলের ফলাফলগুলির সঠিক উত্তর হওয়ার জন্য +1
ম্যাট বি

দয়া করে এই উত্তরটিতে আমার পোস্টটি সন্ধান করুন যেখানে আমি অতিরিক্ত কেসগুলির সাথে ব্যাখ্যা করার জন্য যথাসাধ্য চেষ্টা করেছি। আমি আপনার ইনপুটগুলি সত্যই প্রশংসা করব :)
দেবেন্দ্র লাট্টু

7

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


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

JDK7 (বা এমনকি আজ একই ধরণের বাস্তবায়ন কৌশল ব্যবহার করে) ইনভয়েডিনামিকের সাথে সুন্দর এবং দ্রুত হওয়া উচিত।
টম হাটিন -

5

জাভা প্যারামিটারগুলিতে সহ-প্রকরণকে সমর্থন করে না, কেবল ফেরতের প্রকারে।

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

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

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


4
আপনার অর্থ বিপরীত পরামিতি।
টম হাটিন -

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

4

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


এটি এবং বেশিরভাগ প্রতিক্রিয়া বিন্দুটি অনুপস্থিত। সমস্যাটি ওভাররাইডের পরিবর্তে ওভারলোডিং ব্যবহার করা হচ্ছে এমনটি নয়। কেন t1.equals (t3) এর জন্য টি -১ টি অবজেক্ট হিসাবে ঘোষিত হলেও পরীক্ষায় আরম্ভ করা হয় তার জন্য ওভারলোডেড পদ্ধতি ব্যবহার করা হয় না।
রবিন

4

ওভারডেনের পরিবর্তে পদ্ধতিটি ওভারলোড হয়। সমান সবসময় পরামিতি হিসাবে একটি অবজেক্ট নেয়।

বিটিডব্লিউ, ব্লচের কার্যকর জাভাতে আপনার একটি আইটেম রয়েছে (যা আপনার নিজের হওয়া উচিত)।


জোশুয়া ব্লচের কার্যকর জাভা?
ডিজেক্লেওয়ার্থ

কার্যকর হ্যাঁ, টাইপ করার সময় অন্য কিছু নিয়ে ভাবছিলাম: ডি
গিলস

4

কিছুক্ষণ অনুসন্ধানের পরে ডায়নামিক বাইন্ডিং (ডিডি) এবং স্ট্যাটিক বাইন্ডিং (এসবি) এর কিছু নোট :

1. নির্বাহের সময় নির্ধারণ : (রেফ 1)

  • ডিবি: রান সময়
  • এসবি: সংকলক সময়

2. এর জন্য ব্যবহৃত :

  • ডিবি: ওভাররাইডিং
  • এসবি: ওভারলোডিং (স্ট্যাটিক, প্রাইভেট, ফাইনাল) (রেফ 2)

তথ্যসূত্র:

  1. কোন পদ্ধতিটি ব্যবহার করতে পছন্দ করে তার অর্থ সমাধানকারীকে কার্যকর করুন
  2. কারণ মোডিফায়ার স্ট্যাটিক, প্রাইভেট বা ফাইনাল দিয়ে পদ্ধতি ওভাররাইড করতে পারে না
  3. http://javarevisited.blogspot.com/2012/03/ কি-is-static-and-dynamic- বাইন্ডিং- ইন html

2

যদি অন্য কোনও পদ্ধতি যুক্ত করা হয় তবে ওভারলোডিংয়ের পরিবর্তে ওভাররাইডগুলি রান চলাকালীন গতিশীল বাঁধাই কলটি ব্যাখ্যা করবে।

/ * নিম্নলিখিত প্রোগ্রামটির ফলাফল কী? * /

public class DynamicBinding {
    public boolean equals(Test other) {
        System.out.println("Inside of Test.equals");
        return false;
    }

    @Override
    public boolean equals(Object other) {
        System.out.println("Inside @override: this is dynamic binding");
        return false;
    }

    public static void main(String[] args) {
        Object t1 = new Test();
        Object t2 = new Test();
        Test t3 = new Test();
        Object o1 = new Object();

        int count = 0;
        System.out.println(count++);// prints 0
        t1.equals(t2);
        System.out.println(count++);// prints 1
        t1.equals(t3);
        System.out.println(count++);// prints 2
        t3.equals(o1);
        System.out.println(count++);// prints 3
        t3.equals(t3);
        System.out.println(count++);// prints 4
        t3.equals(t2);
    }
}

1

ডায়নামিক বনাম স্ট্যাটিক বাইন্ডিং সম্পর্কে আমি একটি আকর্ষণীয় নিবন্ধ পেয়েছি। এটি গতিশীল বাঁধাইয়ের অনুকরণের জন্য কোডের একটি অংশ নিয়ে আসে। এটি আমার কোডটিকে আরও পঠনযোগ্য করে তুলেছে।

https://sites.google.com/site/jeffhartkopf/covariance


0

"কেন?" প্রশ্নের উত্তর? এইভাবে জাভা ভাষার সংজ্ঞা দেওয়া হয়।

কোভারিয়েন্স এবং কন্ট্রোভারিয়েন্স সম্পর্কিত উইকিপিডিয়া নিবন্ধটি উদ্ধৃত করার জন্য :

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

অন্যান্য ভাষাগুলি আলাদা।


আমার সমস্যাটি প্রায় 3 + 3 দেখা এবং 9 টি লেখার সমতুল্য ছিল, তারপরে 1 + 1 এবং 2 লিখতে দেখেছি আমি জাভা ভাষার সংজ্ঞা কীভাবে বুঝি; এক্ষেত্রে, যে কোনও কারণেই হোক না কেন, আমি কোনও সমস্যা না হওয়ার জন্য পদ্ধতিটি সম্পূর্ণরূপে ভুল করেছিলাম, যদিও আমি একই সমস্যায় অন্যত্র যে ভুলটি এড়ানো হয়েছিল।
ম্যাগসোল

0

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


-1

আমি এটি দুটি উদাহরণের মাধ্যমে ব্যাখ্যা করার চেষ্টা করব যা আমি অনলাইনে এসেছি এমন কয়েকটি উদাহরণের বর্ধিত সংস্করণ।

public class Test {

    public boolean equals(Test other) {
        System.out.println("Inside of Test.equals");
        return false;
    }

    @Override
    public boolean equals(Object other) {
        System.out.println("Inside of Test.equals ot type Object");
        return false;
    }

    public static void main(String[] args) {
        Object t1 = new Test();
        Object t2 = new Test();
        Test t3 = new Test();
        Object o1 = new Object();

        int count = 0;
        System.out.println(count++); // prints 0
        o1.equals(t2);

        System.out.println("\n" + count++); // prints 1
        o1.equals(t3);

        System.out.println("\n" + count++);// prints 2
        t1.equals(t2);

        System.out.println("\n" + count++);// prints 3
        t1.equals(t3);

        System.out.println("\n" + count++);// prints 4
        t3.equals(o1);

        System.out.println("\n" + count++);// prints 5
        t3.equals(t3);

        System.out.println("\n" + count++);// prints 6
        t3.equals(t2);
    }
}

এখানে 0, 1, 2 এবং 3 গণনার মানগুলির সাথে রেখাগুলি রয়েছে; আমরা আছে রেফারেন্স এর অবজেক্ট জন্য O1 এবং T1 উপর equals()পদ্ধতি। সুতরাং, সংকলনের সময়, অবজেক্ট.ক্লাস ফাইল equals()থেকে পদ্ধতিটি সীমাবদ্ধ থাকবে।

যাইহোক, যদিও রেফারেন্স এর T1 হয় অবজেক্ট , এটা হয়েছে intialization এর টেস্ট বর্গ
Object t1 = new Test();
সুতরাং, রান-টাইমে এটি কল করে public boolean equals(Object other)যা একটি

ওভাররাইড পদ্ধতি

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

এখন, 4 এবং 6 হিসাবে গণনা মানগুলির জন্য, এটি আবার সোজাসুজি যে টি 3 যা টেস্টের রেফারেন্স এবং ইনিশিয়ালাইজেশন রয়েছে equals()তাকে অবজেক্ট রেফারেন্স হিসাবে প্যারামিটার সহ কলিং পদ্ধতিটি এবং এটি একটি

অতিরিক্ত লোড পদ্ধতি

ঠিক আছে!

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

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

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