গতকাল আমার একটি দুই ঘন্টা প্রযুক্তিগত ফোনের সাক্ষাত্কার ছিল (যা আমি পাশ করলাম, ওহো!), তবে জাভাতে গতিশীল বাঁধন সম্পর্কিত নিম্নলিখিত প্রশ্নটি আমি পুরোপুরি ছড়িয়ে দিয়েছি। এবং এটি দ্বিগুণ হতবাক হয় কারণ আমি কয়েক বছর আগে যখন টিএ ছিলাম তখন স্নাতককে এই ধারণাটি শিখিয়েছিলাম, তাই আমি তাদের ভুল তথ্য দেওয়ার সম্ভাবনাটি কিছুটা বিরক্তিকর ...
আমাকে যে সমস্যাটি দেওয়া হয়েছিল তা এখানে:
/* 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()
পদ্ধতিটি প্রেরণা করবে ), গতিশীল বাইন্ডিংটি সেই পদ্ধতির সুনির্দিষ্ট সংস্করণটি রেফারেন্সের তাত্ক্ষণিক ধরণের ভিত্তিতে আহ্বানের যত্ন নেওয়া উচিত । আমি কী মিস করছি?