সংক্ষিপ্ত উত্তরটি: এটি সম্পূর্ণরূপে সম্ভব, তবে জাভা এটি করে না।
এখানে এমন কিছু কোড রয়েছে যা বর্তমান অবস্থার চিত্র তুলে ধরে জাভার :
ফাইল Base.java
:
package sp.trial;
public class Base {
static void printValue() {
System.out.println(" Called static Base method.");
}
void nonStatPrintValue() {
System.out.println(" Called non-static Base method.");
}
void nonLocalIndirectStatMethod() {
System.out.println(" Non-static calls overridden(?) static:");
System.out.print(" ");
this.printValue();
}
}
ফাইল Child.java
:
package sp.trial;
public class Child extends Base {
static void printValue() {
System.out.println(" Called static Child method.");
}
void nonStatPrintValue() {
System.out.println(" Called non-static Child method.");
}
void localIndirectStatMethod() {
System.out.println(" Non-static calls own static:");
System.out.print(" ");
printValue();
}
public static void main(String[] args) {
System.out.println("Object: static type Base; runtime type Child:");
Base base = new Child();
base.printValue();
base.nonStatPrintValue();
System.out.println("Object: static type Child; runtime type Child:");
Child child = new Child();
child.printValue();
child.nonStatPrintValue();
System.out.println("Class: Child static call:");
Child.printValue();
System.out.println("Class: Base static call:");
Base.printValue();
System.out.println("Object: static/runtime type Child -- call static from non-static method of Child:");
child.localIndirectStatMethod();
System.out.println("Object: static/runtime type Child -- call static from non-static method of Base:");
child.nonLocalIndirectStatMethod();
}
}
আপনি যদি এটি চালান (আমি এটি একটি ম্যাকের উপর দিয়েছিলাম, যা গ্রহীত থেকে, জাভা 1.6 ব্যবহার করে) পেয়েছেন:
Object: static type Base; runtime type Child.
Called static Base method.
Called non-static Child method.
Object: static type Child; runtime type Child.
Called static Child method.
Called non-static Child method.
Class: Child static call.
Called static Child method.
Class: Base static call.
Called static Base method.
Object: static/runtime type Child -- call static from non-static method of Child.
Non-static calls own static.
Called static Child method.
Object: static/runtime type Child -- call static from non-static method of Base.
Non-static calls overridden(?) static.
Called static Base method.
এখানে, কেবলমাত্র একমাত্র কেস যা বিস্মিত হতে পারে (এবং যা নিয়ে প্রশ্নটি হয়) এটি প্রথম প্রদর্শিত হয় কেস হিসাবে প্রতীয়মান:
"রান-টাইম টাইপটি কোন স্ট্যাটিক পদ্ধতিগুলি বলা হয় তা নির্ধারণ করতে ব্যবহৃত হয় না, এমনকি কোনও বস্তুর উদাহরণের সাথে ডাকা হলেও (obj.staticMethod()
) ।"
এবং শেষ কেস:
"ক্লাসের কোনও অবজেক্ট মেথডের মধ্যে থেকে স্ট্যাটিক পদ্ধতি কল করার সময়, নির্বাচিত স্ট্যাটিক পদ্ধতিটি ক্লাস থেকে নিজেই অ্যাক্সেসযোগ্য হয় এবং না বর্গ বস্তুর রান-টাইম টাইপ সংজ্ঞা থেকে।"
কোনও বস্তুর উদাহরণ সহ কল করা হচ্ছে
স্থির কলটি সংকলন-সময়ে সমাধান করা হয়, অন্যদিকে একটি অ স্থিত পদ্ধতি কলটি রান-টাইমে সমাধান করা হয়। লক্ষ করুন যে স্থির পদ্ধতিগুলি উত্তরাধিকার সূত্রে প্রাপ্ত (পিতামাতার কাছ থেকে) সেগুলি (শিশু দ্বারা) ওভাররাইড করা হয় না । আপনি যদি অন্যথায় আশা করেন তবে এটি অবাক হতে পারে।
একটি অবজেক্ট পদ্ধতির মধ্যে থেকে কল করা
অবজেক্ট মেথড কলগুলি রান-টাইম টাইপ ব্যবহার করে সমাধান করা হয়, তবে স্টাইলিক ( ক্লাস ) মেথড কলগুলি সংকলন-সময় (ঘোষিত) প্রকারটি ব্যবহার করে সমাধান করা হয়।
নিয়ম পরিবর্তন করা
এই নিয়মগুলি পরিবর্তন করতে, যাতে ডাকা উদাহরণটিতে শেষ কলটি Child.printValue()
, স্ট্যাটিক কলগুলি রান-টাইমে একটি ধরণের সরবরাহ করতে হবে, বরং কম্পাইলারের পরিবর্তে অবজেক্টের ঘোষিত শ্রেণীর (অথবা সংকলনের সময় কলটি সংশোধন করার পরিবর্তে) প্রসঙ্গ)। স্থিতিকাল কলগুলি কলটি সমাধানের জন্য (গতিশীল) প্রকারের শ্রেণিবিন্যাসকে ব্যবহার করতে পারে ঠিক যেমন আজ অবজেক্ট পদ্ধতি কলগুলি করছে।
এটি সহজেই করণীয় হবে (যদি আমরা জাভা: -ও বদলে) তবে এটি অযৌক্তিক নয়, তবে এর কিছু আকর্ষণীয় বিবেচনা রয়েছে।
প্রধান বিবেচনার যে আমরা সিদ্ধান্ত নিতে হবে হয় যা স্ট্যাটিক পদ্ধতি কল এই কাজ করা উচিত নয়।
এই মুহুর্তে, জাভা ভাষায় কলগুলি (সাধারণত একটি সতর্কতা সহ) obj.staticMethod()
দ্বারা প্রতিস্থাপন করা হয় ভাষায় এই "কৌতুক" রয়েছে ObjectClass.staticMethod()
। [ দ্রষ্টব্য: ObjectClass
এই সংকলন-টাইপ ধরণের obj
।] রান-টাইম টাইপটি গ্রহণ করে এইভাবে ওভাররাইড করার জন্য এগুলি ভাল প্রার্থী হবে obj
।
যদি আমরা এটি করি তবে পদ্ধতি সংস্থাগুলি পড়া আরও শক্ত হয়ে উঠবে: পিতামাতাদের ক্লাসে স্থির কলগুলি সম্ভবত গতিশীলভাবে "পুনরায় রাউটেড" হতে পারে । এটি এড়াতে আমাদের ক্লাসের নাম সহ স্থিত পদ্ধতিতে কল করতে হবে - এবং এটি কলগুলি আরও স্পষ্টতই সংকলন-টাইপ টাইপ শ্রেণিবিন্যাসের সাথে সমাধান করেছে (এখনকার হিসাবে)।
স্থিতিশীল পদ্ধতিতে আহ্বান করার অন্যান্য উপায়গুলি আরও জটিল: রান-টাইম ধরণটি গ্রহণের this.staticMethod()
মতোই হওয়া উচিত । যাইহোক, এটি বিদ্যমান প্রোগ্রামগুলির সাথে কিছু মাথাব্যথার কারণ হতে পারে, যা প্রসাধন ছাড়াই (দৃশ্যত স্থানীয়) স্থির পদ্ধতিগুলি কল করে (যা তর্কযুক্ত সমতুল্য )।obj.staticMethod()
this
this.method()
সুতরাং অযাচিত কল সম্পর্কে কি staticMethod()
? আমি তাদেরকে আজকের মতো একই পরামর্শ দেওয়ার পরামর্শ দিচ্ছি এবং কী করণীয় তা স্থির করতে স্থানীয় শ্রেণির প্রসঙ্গটি ব্যবহার করুন। অন্যথায় দুর্দান্ত বিভ্রান্তি ঘটতে পারে। অবশ্যই এটা মানে হল যে method()
অর্থ হবে this.method()
যদি method
ছিল একটি অ-স্ট্যাটিক পদ্ধতি, এবং ThisClass.method()
যদি method
একটি স্ট্যাটিক পদ্ধতি ছিল। এটি বিভ্রান্তির আরেকটি উত্স।
অন্যান্য বিবেচ্য বিষয়
আমরা যদি এই আচরণ পরিবর্তিত (এবং স্ট্যাটিক কল সম্ভাব্য পরিবর্তনশীল অ-স্থানীয় প্রণীত), আমরা সম্ভবত অর্থ পরিদর্শন করতে চাইবেন final
, private
এবং protected
কোয়ালিফায়ার হিসাবে static
একটি বর্গ পদ্ধতি। তারপরে আমাদের সকলকে অভ্যস্ত হতে হবে যে পদ্ধতিগুলি private static
ও public final
পদ্ধতিগুলি ওভাররাইড করা হয় না, এবং তাই সংকলন সময়ে নিরাপদে সমাধান করা যেতে পারে এবং স্থানীয় রেফারেন্স হিসাবে পড়তে "নিরাপদ" হয়।