জাভা স্থির পদ্ধতিগুলিকে ওভাররাইড করার অনুমতি দেয় না কেন?


534

স্থির পদ্ধতিগুলিকে ওভাররাইড করা কেন সম্ভব নয়?

যদি সম্ভব হয় তবে দয়া করে একটি উদাহরণ ব্যবহার করুন।


3
বেশিরভাগ ওওপি ভাষা এটির অনুমতি দেয় না।
jmucchiello

7
@ জেমুচ্চিলো: আমার উত্তর দেখুন। আমি আপনার মতোই ভাবছিলাম, তবে রুবি / স্মলটালকের 'শ্রেণি' পদ্ধতি সম্পর্কে শিখেছি এবং তাই অন্যান্য সত্য ওওপি ভাষাও এটি করে।
কেভিন ব্রক

5
@ জেমুচ্চিলো বেশিরভাগ ওওপি ভাষা বাস্তব ওওপি ভাষা নয় (আমি
স্মার্টটাকের

আরো দেখুন stackoverflow.com/q/370962/632951
Pacerier

1
কারণ জাভা সংকলনের সময় স্থির পদ্ধতিতে কলগুলি সমাধান করে। এমনকি আপনি যদি লিখে থাকেন Parent p = new Child()এবং তারপরেও p.childOverriddenStaticMethod()সংকলকটি Parent.childOverriddenStaticMethod()রেফারেন্সের ধরণটি দেখে সমাধান করবেন।
মনোজ

উত্তর:


494

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

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


18
... তবে জাভাতে কেবল "সঠিক"। উদাহরণস্বরূপ, স্কালার সমতুল্য "স্ট্যাটিক ক্লাস" (যা বলা হয় objects) পদ্ধতিগুলির ওভারলোডিংকে অনুমতি দেয়।

32
উদ্দেশ্য-সি শ্রেণিবদ্ধকরণ পদ্ধতিগুলিকে ওভাররাইড করার অনুমতি দেয় ।
রিচার্ড

11
একটি সংকলন-টাইপ ধরণের শ্রেণিবিন্যাস এবং একটি রান-টাইম টাইপ শ্রেণিবিন্যাস রয়েছে। স্থির পদ্ধতি কলটি এমন পরিস্থিতিতে যেখানে রান-টাইম ধরণের শ্রেণিবদ্ধতা নিজেই গ্রহণ করে না তা জিজ্ঞাসা করার উপযুক্ত ধারণা তৈরি করে। জাভাতে এটি কোনও অবজেক্ট ( obj.staticMethod()) থেকে স্থিতিশীল পদ্ধতি কল করার সময় ঘটে - যা অনুমোদিত এবং সংকলন-সময় ধরণের ব্যবহার করে। স্থির কলটি যখন কোনও শ্রেণীর অ স্থিত পদ্ধতিতে থাকে, তখন "বর্তমান" অবজেক্টটি শ্রেণীর উত্সযুক্ত ধরণের হতে পারে - তবে উদ্ভূত প্রকারভেদে সংজ্ঞায়িত স্ট্যাটিক পদ্ধতিগুলি বিবেচনা করা হয় না (সেগুলি রান-টাইম টাইপের মধ্যে রয়েছে অনুক্রমের)।
স্টিভ পাওয়েল

18
আমি এটা পরিষ্কার করেছেন উচিত: এটা না সত্য যে ধারণা প্রযোজ্য নয়
স্টিভ পাওয়েল

13
এই উত্তরটি সঠিক হলেও এটি ওপেনের প্রত্যাশা পূরণের ক্ষেত্রে কীভাবে হওয়া উচিত বা এটি আরও সঠিকভাবে হওয়া উচিত তার চেয়ে "এটি কেমন" এর তুলনায় আরও অনুরূপ এবং তাই এখানে আমি এবং অন্যরা। "এটি যেমন হয়" ব্যতীত স্ট্যাটিক পদ্ধতির ওভাররাইডকে অস্বীকার করার কোনও ठोस কারণ নেই। আমি মনে করি এটি ব্যক্তিগতভাবে একটি ত্রুটি।
রিচিএইচএইচ

186

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

public class RegularEmployee {
    private BigDecimal salary;

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

    public static BigDecimal getBonusMultiplier() {
        return new BigDecimal(".02");
    }

    public BigDecimal calculateBonus() {
        return salary.multiply(getBonusMultiplier());
    }

    /* ... presumably lots of other code ... */
}

public class SpecialEmployee extends RegularEmployee {
    public static BigDecimal getBonusMultiplier() {
        return new BigDecimal(".03");
    }
}

এই কোডটি আপনার প্রত্যাশা মতো কাজ করবে না। যথা, স্পেশাল এমপ্লয়ী নিয়মিত কর্মীদের মতোই 2% বোনাস পান। আপনি যদি "স্ট্যাটিক" গুলি সরিয়ে থাকেন তবে স্পেশাল এমপ্লয়ির 3% বোনাস পাবেন।

(স্বীকারযোগ্যভাবে, এই উদাহরণটি খারাপ কোডিং শৈলী যে বাস্তব জীবনে আপনি সম্ভবত বোনাস গুণকটি হার্ড-কোডেড না হয়ে কোথাও একটি ডাটাবেসে থাকতে চান But তবে এটি কেবল কারণ আমি উদাহরণটি খুব একটা দিয়ে দাগাতে চাইনি because কোডটির বিন্দুতে অপ্রাসঙ্গিক)

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

কিন্তু এটি কাজ করে না।

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

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

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

হালনাগাদ

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

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


11
@ বেমরোজ: তবে এটি আমার বক্তব্য: আমাকে কেন এটি করতে দেওয়া হবে না? "স্ট্যাটিক" কী করা উচিত তা সম্পর্কে আমার স্বজ্ঞাত ধারণাটি আপনার থেকে পৃথক, তবে মূলত আমি একটি স্ট্যাটিককে এমন একটি পদ্ধতি হিসাবে ভাবি যা স্থির থাকতে পারে কারণ এটি কোনও উদাহরণ ডেটা ব্যবহার করে না এবং কোনটি স্থিতিশীল হওয়া উচিত কারণ আপনি চাইতে পারেন একটি দৃষ্টান্ত স্বতন্ত্রভাবে এটি কল। একটি স্ট্যাটিক স্পষ্টভাবে একটি শ্রেণীর সাথে বাঁধা: আমি প্রত্যাশা করি Integer.valueOf ইন্টিজারে এবং Double.valueOf এর সাথে বাঁধা থাকবে ডাবলসের সাথে আবদ্ধ।
জয়

9
@ ইওরনলি ও বেমরোজ: হ্যাঁ হ্যাঁ, এটি ঠিক তাই। আমি এটা নিয়ে বিতর্ক করছি না আমার উদাহরণের কোডটি কার্যকর না হওয়ায় অবশ্যই আমি এটি লেখার চেষ্টা করব না। আমার প্রশ্নটি কেন এটি হল। (আমি আশঙ্কা করি এটি সেই কথোপকথনের একটিতে পরিণত হচ্ছে যেখানে আমরা কেবল কথোপকথন করছি না। "মাফ করবেন মিঃ সেলসম্যান, আমি কি এইগুলির মধ্যে একটি লাল পেতে পারি?" "না, এটির দাম $ 5।" "হ্যাঁ, আমি জানি এটির জন্য ব্যয় হয় $ 5, তবে আমি কি একটি লাল পেতে পারি? "" স্যার, আমি আপনাকে কেবল বলেছিলাম যে এর দাম $ 5। "" ঠিক আছে, আমি দাম জানি, তবে আমি রঙ সম্পর্কে জিজ্ঞাসা করছি। "" আমি আপনাকে ইতিমধ্যে দামটি বলেছি! " ইত্যাদি)
জে

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

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

28
আমি মনে করি জয়ের একটা পয়েন্ট আছে - এটি আমাকেও অবাক করে দিয়েছিল যখন আমি আবিষ্কার করেছি যে স্ট্যাটিক্স ওভাররাইড করা যায় না। অংশ হিসাবে কারণ আমার কাছে যদি পদ্ধতিটির সাথে A থাকে someStatic()এবং B এ A প্রসারিত করে, তবে এ-তে পদ্ধতিতে B.someMethod() আবদ্ধ হয় যদি আমি পরবর্তীতে someStatic()বিতে যুক্ত করি, কলিং কোডটি A.someStatic()পুনরায় সংশোধন না করা পর্যন্ত কলিং কোডটি এখনও অনুরোধ করে। এছাড়াও এটি আমাকে বিস্মিত করেছে যে ঘোষিত ধরণের বিআইনস্ট্যান্স bInstance.someStatic()ব্যবহার করে , রানটাইম টাইপ নয় কারণ এটি সংকলনটিতে সংযুক্ত নয়, তাই বিসোমস্ট্যাটিক () উপস্থিত থাকলে A.someStatic () কে অনুরোধ করে। A bInstance; ... bInstance.someStatic()
লরেন্স ডল

42

সংক্ষিপ্ত উত্তরটি: এটি সম্পূর্ণরূপে সম্ভব, তবে জাভা এটি করে না।

এখানে এমন কিছু কোড রয়েছে যা বর্তমান অবস্থার চিত্র তুলে ধরে জাভার :

ফাইল 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()thisthis.method()

সুতরাং অযাচিত কল সম্পর্কে কি staticMethod()? আমি তাদেরকে আজকের মতো একই পরামর্শ দেওয়ার পরামর্শ দিচ্ছি এবং কী করণীয় তা স্থির করতে স্থানীয় শ্রেণির প্রসঙ্গটি ব্যবহার করুন। অন্যথায় দুর্দান্ত বিভ্রান্তি ঘটতে পারে। অবশ্যই এটা মানে হল যে method()অর্থ হবে this.method()যদি methodছিল একটি অ-স্ট্যাটিক পদ্ধতি, এবং ThisClass.method()যদি methodএকটি স্ট্যাটিক পদ্ধতি ছিল। এটি বিভ্রান্তির আরেকটি উত্স।

অন্যান্য বিবেচ্য বিষয়

আমরা যদি এই আচরণ পরিবর্তিত (এবং স্ট্যাটিক কল সম্ভাব্য পরিবর্তনশীল অ-স্থানীয় প্রণীত), আমরা সম্ভবত অর্থ পরিদর্শন করতে চাইবেন final, privateএবং protectedকোয়ালিফায়ার হিসাবে staticএকটি বর্গ পদ্ধতি। তারপরে আমাদের সকলকে অভ্যস্ত হতে হবে যে পদ্ধতিগুলি private staticpublic finalপদ্ধতিগুলি ওভাররাইড করা হয় না, এবং তাই সংকলন সময়ে নিরাপদে সমাধান করা যেতে পারে এবং স্থানীয় রেফারেন্স হিসাবে পড়তে "নিরাপদ" হয়।


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

25

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

import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;

class RegularEmployee {

    private BigDecimal salary = BigDecimal.ONE;

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }
    public static BigDecimal getBonusMultiplier() {
        return new BigDecimal(".02");
    }
    public BigDecimal calculateBonus() {
        return salary.multiply(this.getBonusMultiplier());
    }
    public BigDecimal calculateOverridenBonus() {
        try {
            // System.out.println(this.getClass().getDeclaredMethod(
            // "getBonusMultiplier").toString());
            try {
                return salary.multiply((BigDecimal) this.getClass()
                    .getDeclaredMethod("getBonusMultiplier").invoke(this));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return null;
    }
    // ... presumably lots of other code ...
}

final class SpecialEmployee extends RegularEmployee {

    public static BigDecimal getBonusMultiplier() {
        return new BigDecimal(".03");
    }
}

public class StaticTestCoolMain {

    static public void main(String[] args) {
        RegularEmployee Alan = new RegularEmployee();
        System.out.println(Alan.calculateBonus());
        System.out.println(Alan.calculateOverridenBonus());
        SpecialEmployee Bob = new SpecialEmployee();
        System.out.println(Bob.calculateBonus());
        System.out.println(Bob.calculateOverridenBonus());
    }
}

ফলাফল আউটপুট:

0.02
0.02
0.02
0.03

আমরা কী অর্জন করার চেষ্টা করছিলাম :)

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

RegularEmployee Carl = new SpecialEmployee();

System.out.println(Carl.calculateBonus());
System.out.println(Carl.calculateOverridenBonus());

শুধু আউটপুট কনসোল দেখুন:

0.02
0.03

;)


9
হ্যাঁ প্রতিচ্ছবি শুধুমাত্র একমাত্র কাজটি করতে পারে - তবে প্রশ্নটি হ'ল এটি নয় - যদিও এটি এখানে রাখার জন্য দরকারী
Mr_and_Mrs_D

1
এই উত্তরটি এখন পর্যন্ত সমস্ত জাভা বিষয় জুড়ে আমি দেখা সবচেয়ে বড় হ্যাক। এটি এখনও পড়তে মজা
আন্দ্রেজ

19

স্থিতিশীল পদ্ধতিগুলি JVM দ্বারা বিশ্ব হিসাবে বিবেচিত হয়, কোনও বস্তুর দৃষ্টিতে আবদ্ধ হয় না।

এটি ক্লাসিক অবজেক্টগুলি থেকে যেমন স্ট্যাটিক পদ্ধতিগুলি কল করতে (যদি স্মলটালকের মতো ভাষায়) কল করতে পারে তবে ধারণামূলকভাবে এটি সম্ভব হতে পারে তবে জাভাতে এটি হয় না।

সম্পাদনা

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

class MyClass { ... }
class MySubClass extends MyClass { ... }

MyClass obj1 = new MyClass();
MySubClass obj2 = new MySubClass();

ob2 instanceof MyClass --> true

Class clazz1 = obj1.getClass();
Class clazz2 = obj2.getClass();

clazz2 instanceof clazz1 --> false

আপনি ক্লাসে প্রতিফলিত করতে পারেন, তবে এটি সেখানেই থেমে আছে। আপনি ব্যবহার করে clazz1.staticMethod(), কিন্তু ব্যবহার করে একটি স্থিতিশীল পদ্ধতি প্রার্থনা করবেন না MyClass.staticMethod()। একটি স্থিতিশীল পদ্ধতি কোনও জিনিসের সাথে আবদ্ধ নয় এবং তাই স্থিতিশীল পদ্ধতিতেও এর কোনও ধারণা thisনেই super। একটি স্থিতিশীল পদ্ধতি হ'ল একটি গ্লোবাল ফাংশন; ফলস্বরূপ পলিমারফিজমের কোনও ধারণাও নেই এবং অতএব, পদ্ধতিটি ওভাররাইড করা কোনও অর্থবোধ করে না।

তবে এটি সম্ভব হতে পারে যদি MyClassরান-টাইমে এমন কোনও বস্তু ছিল যার উপর আপনি কোনও পদ্ধতি অবলম্বন করেন, যেমন স্মার্টটাল্কে (বা সম্ভবত জেউরবি একটি মন্তব্য হিসাবে প্রমাণ করেছেন, তবে আমি জেরুবি সম্পর্কে কিছুই জানি না)।

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


5
এমনকি রুবির মতো অনেক আধুনিক ভাষায় ক্লাস-পদ্ধতি রয়েছে এবং সেগুলি ওভাররাইড করার অনুমতি দেয়।
চন্দ্র সেকার

3
জাভাতে অবজেক্ট হিসাবে ক্লাসের অস্তিত্ব রয়েছে। "ক্লাস" ক্লাস দেখুন। আমি myObject.getClass () বলতে পারি এবং এটি আমাকে উপযুক্ত শ্রেণীর অবজেক্টের একটি উদাহরণ ফিরিয়ে দেবে।
জয়

5
আপনি ক্লাসের একটি "বিবরণ" পাবেন - ক্লাস নিজেই নয়। তবে পার্থক্যটি সূক্ষ্ম।
ইওর্নলি

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

clazz2 instanceof clazz1সঠিকভাবে ব্যবহার করতে আপনি এর পরিবর্তে ব্যবহার করতে পারেন class2.isAssignableFrom(clazz1), যা আমার বিশ্বাস আপনার উদাহরণে সত্য ফিরে আসবে।
সাইমন ফারসবার্গ

14

গতিশীল প্রেরণের মাধ্যমে মেথড ওভাররাইডিং সম্ভব হয়েছে , যার অর্থ হ'ল ঘোষিত ধরণের কোনও বস্তু তার আচরণ নির্ধারণ করে না, বরং তার রানটাইম টাইপ:

Animal lassie = new Dog();
lassie.speak(); // outputs "woof!"
Animal kermit = new Frog();
kermit.speak(); // outputs "ribbit!"

যদিও উভয়ই lassieএবং kermitধরণের বস্তু হিসাবে ঘোষিত হয় Animal, তাদের আচরণ (পদ্ধতি .speak()) পরিবর্তিত হয় কারণ গতিশীল প্রেরণ কেবল পদ্ধতি কলকে আবদ্ধ করবে.speak() রান টাইমে কোনও প্রয়োগের জন্য - সংকলনের সময় নয়।

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


11

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

class Animal {
    public static void eat() {
        System.out.println("Animal Eating");
    }
}

class Dog extends Animal{
    public static void eat() {
        System.out.println("Dog Eating");
    }
}

class Test {
    public static void main(String args[]) {
       Animal obj= new Dog();//Dog object in animal
       obj.eat(); //should call dog's eat but it didn't
    }
}


Output Animal Eating

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


3
অবজেক্ট থেকে স্থিতিশীল পদ্ধতি কল করা খারাপ অভ্যাস।
দিমিত্রি জাগোরুলকিন

6

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


1
আপনি ইতিমধ্যে এটিকে আবৃত করা এবং এটি পরিষ্কার করে দিয়েছিলেন যে এগুলি ধারণাগত স্তরে ওভাররাইডিং স্ট্যাটিকগুলিকে ছাড় দেওয়ার পর্যাপ্ত কারণ নয় এবং অন্য কোনও উত্তর পড়েনি। আমরা জানি এটি কাজ করে না। এটা তোলে ইচ্ছা স্ট্যাটিক পদ্ধতি অগ্রাহ্য পুরোপুরি "পরিষ্কার এবং প্রকৃতপক্ষে এটা অনেক অন্যান্য ভাষায় সম্ভব।
RichieHH

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

6

জাভাতে (এবং অনেকগুলি ওওপি ভাষা, তবে আমি সবার জন্য কথা বলতে পারি না; এবং কারও কারও কাছে স্থির থাকে না) সমস্ত পদ্ধতির একটি নির্দিষ্ট স্বাক্ষর থাকে - পরামিতি এবং প্রকারগুলি। ভার্চুয়াল পদ্ধতিতে, প্রথম প্যারামিটারটি অন্তর্ভুক্ত করা হয়: অবজেক্টটির নিজেই একটি রেফারেন্স এবং যখন বস্তুর মধ্যে থেকে ডাকা হয়, সংকলক স্বয়ংক্রিয়ভাবে যুক্ত হয় this

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

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

আপনি যদি চান যে জাভা সংজ্ঞাটি পরিবর্তন করে যাতে প্রতিটি পদ্ধতি, স্থিতিশীল বা ভার্চুয়ালের জন্য কোনও অবজেক্ট প্রসঙ্গটি পাস করা হয়, তবে আপনার মূলত কেবল ভার্চুয়াল পদ্ধতি রয়েছে।

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

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

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

সম্পাদনা : অন্য একটি মন্তব্য। এখন যেহেতু আমি পার্থক্যগুলি দেখতে পাচ্ছি এবং আমি নিজে জাভা / সি # বিকাশকারী হিসাবে, আমি বুঝতে পারি যে আপনি যদি রুবির মতো ভাষা থেকে আসছেন তবে জাভা বিকাশকারীদের কাছ থেকে পাওয়া উত্তরগুলি কেন বিভ্রান্তিকর হতে পারে। জাভা staticপদ্ধতিগুলি রুবি classপদ্ধতির মতো নয় । জাভা বিকাশকারীদের এটি বুঝতে অসুবিধা হবে, বিপরীতভাবে যারা রুবি / স্মলটালকের মতো ভাষা নিয়ে বেশিরভাগ ক্ষেত্রে কাজ করে। আমি দেখতে পাচ্ছি যে এটি স্থিতিশীল পদ্ধতি সম্পর্কে কথা বলার জন্য জাভা আরও একটি "ক্লাস পদ্ধতি" ব্যবহার করে তবে এই একই শব্দটি রুবি পৃথকভাবে ব্যবহার করেছেন by জাভাতে রুবি স্টাইলের ক্লাস পদ্ধতি নেই (দুঃখিত); রুবির জাভা স্টাইলের স্ট্যাটিক পদ্ধতি নেই যা সত্যিই কেবল পুরানো পদ্ধতিগত স্টাইলের ফাংশন, সি তে পাওয়া যায় as

যাইহোক - প্রশ্নের জন্য ধন্যবাদ! আমি আজ ক্লাসের পদ্ধতিগুলি (রুবি স্টাইল) সম্পর্কে আমার জন্য নতুন কিছু শিখলাম।


1
অবশ্যই, জাভা স্থিতিশীল পদ্ধতিগুলিতে একটি লুকানো প্যারামিটার হিসাবে কোনও "শ্রেণি" অবজেক্টটি পাস করতে পারেনি তার কোনও কারণ নেই। এটি কেবল এটি করার জন্য ডিজাইন করা হয়নি।
jmucchiello

6

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

উদাহরণ : আসুন আমরা যদি স্ট্যাটিক পদ্ধতিতে ওভাররাইড করার চেষ্টা করি তবে কী ঘটে তা দেখার চেষ্টা করি: -

class SuperClass {
// ......
public static void staticMethod() {
    System.out.println("SuperClass: inside staticMethod");
}
// ......
}

public class SubClass extends SuperClass {
// ......
// overriding the static method
public static void staticMethod() {
    System.out.println("SubClass: inside staticMethod");
}

// ......
public static void main(String[] args) {
    // ......
    SuperClass superClassWithSuperCons = new SuperClass();
    SuperClass superClassWithSubCons = new SubClass();
    SubClass subClassWithSubCons = new SubClass();

    superClassWithSuperCons.staticMethod();
    superClassWithSubCons.staticMethod();
    subClassWithSubCons.staticMethod();
    // ...
}
}

আউটপুট : -
SuperClass: inside staticMethod
SuperClass: inside staticMethod
SubClass: inside staticMethod

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


5

সাধারণত স্ট্যাটিক পদ্ধতিগুলিকে 'ওভাররাইডিং' করার অনুমতি দেওয়ার কোনও অর্থ হয় না কারণ রানটাইমে কোনটিকে কল করা উচিত তা নির্ধারণ করার কোনও ভাল উপায় নেই। কর্মচারীর উদাহরণ গ্রহণ করে, আমরা যদি RegularEmployee.getBonusM Multiplier () কল করি - কোন পদ্ধতিটি কার্যকর হওয়ার কথা?

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


2
স্বজ্ঞাতভাবে, আমি মনে করি এটি ঠিক ভার্চুয়াল ফাংশনের মতো কাজ করা উচিত। যদি বি A এর প্রসারিত হয় এবং A এবং B উভয় ডুস্ট্ফ নামে ভার্চুয়াল ফাংশন থাকে, সংকলক জানে যে A এর উদাহরণগুলি A.doStuff ব্যবহার করা উচিত এবং B এর দৃষ্টান্তে B.doStuff ব্যবহার করা উচিত। স্থির ফাংশনগুলি কেন এটি করতে পারে না? সর্বোপরি, সংকলক প্রতিটি বস্তুর কোন শ্রেণীর উদাহরণ হিসাবে তা জানে।
জে

এরম ... জে, একটি স্থির পদ্ধতি কোনও উদাহরণে বলা হয় না (সাধারণত হয় না) ...
মেরিটন

2
@ মেরিটন, তবে তারপরে এটি আরও সহজ, না? কোনও শ্রেণিবদ্ধ ব্যবহার করে যদি কোনও স্থিতিশীল পদ্ধতি বলা হয়, আপনি ক্লাসের জন্য উপযুক্ত পদ্ধতিটি ব্যবহার করবেন।
সিপারকিনস

তবে তারপরে কী আপনার ওভাররাইড করছে। আপনি যদি এডো স্টাফ () কল করেন তবে এটি "B প্রসারিত A" তে ওভাররাইড হওয়া সংস্করণ বা "C প্রসারিত A" তে ওভাররাইড হওয়া সংস্করণটি ব্যবহার করা উচিত? এবং আপনার যদি সি বা বি থাকে তবে আপনি সেই সংস্করণগুলিকে যে কোনও উপায়ে কল করছেন ... কোনও ওভাররাইডিংয়ের দরকার নেই।
PSpeed

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

5

ওভাররাইড করে আমরা বস্তুর ধরণের উপর নির্ভর করে একটি বহুতল প্রকৃতি তৈরি করতে পারি। স্থির পদ্ধতির সাথে বস্তুর সাথে কোন সম্পর্ক নেই। সুতরাং জাভা স্থির পদ্ধতি ওভাররাইড সমর্থন করতে পারে না।


5

আমি জয়ের মন্তব্য পছন্দ করি এবং দ্বিগুণ ( https://stackoverflow.com/a/2223803/1517187 )।
আমি সম্মত হই যে এটি জাভাটির খারাপ নকশা।
অন্যান্য অনেকগুলি ভাষা স্থিতিশীল পদ্ধতিগুলিকে ওভাররাইড করা সমর্থন করে, যেমন আমরা পূর্ববর্তী মন্তব্যে দেখি। আমার মনে হয় জেও আমার মতো ডেলফি থেকে জাভাতে এসেছেন।
দেলফি (অবজেক্ট পাস্কাল) হ'ল প্রথম ভাষা ওওপি প্রয়োগকারী।
এটা স্পষ্টতই যে বহু লোকের সেই ভাষা নিয়ে অভিজ্ঞতা ছিল কারণ এটি বাণিজ্যিক জিইউআই পণ্যগুলি লেখার একক ভাষা অতীতে ছিল। এবং - হ্যাঁ, আমরা ডেলফি স্থির পদ্ধতিগুলিকে ওভাররাইড করতে পারি। প্রকৃতপক্ষে, ডেলফির স্থিতিশীল পদ্ধতিগুলিকে "শ্রেণি পদ্ধতি" বলা হয়, যখন ডেলফির কাছে "ডেলফি স্ট্যাটিক পদ্ধতিগুলি" সম্পর্কে ভিন্ন ধারণা ছিল যা প্রাথমিক পদ্ধতিতে বাঁধাইয়ের পদ্ধতি ছিল। পদ্ধতিগুলিকে ওভাররাইড করার জন্য আপনাকে দেরীতে বাইন্ডিং ব্যবহার করতে হয়েছে, "ভার্চুয়াল" নির্দেশিকা ঘোষণা করুন। সুতরাং এটি খুব সুবিধাজনক এবং স্বজ্ঞাত ছিল এবং আমি জাভাতে এটি আশা করব।


3

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

MyClass.static1()
MySubClass.static1()   // If you overrode, you have to call it through MySubClass anyway.

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


8
"আপনি কোনও উদাহরণের মাধ্যমে স্থিতিশীল পদ্ধতিগুলিতে কল করতে পারবেন না" আসলে জাভার একটি তাত্ক্ষণিক হ'ল আপনি একটি উদাহরণের মাধ্যমে স্থির পদ্ধতিগুলি কল করতে পারেন, যদিও এটি অত্যন্ত খারাপ ধারণা।
পাওয়ারলর্ড

1
প্রকৃতপক্ষে জাভা স্থির সদস্যদের অ্যাক্সেসের মাধ্যমে অ্যাক্সেসের অনুমতি দেয়: জাভাতে স্ট্যাটিক ভেরিয়েবল
রিচার্ড জে পি লে গুয়েন

আপনি যদি এটি করেন তবে একটি উপযুক্ত আধুনিক আইডিই একটি সতর্কতা তৈরি করে, সুতরাং কমপক্ষে আপনি এটি ধরতে পারবেন যখন ওরাকল পিছনের দিকের সামঞ্জস্যের জিনিসটি রাখতে পারেন can
গিম্বি

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

পুনঃটুইট প্রশ্ন হল কেন এটির variable.staticMethod()পরিবর্তে কল করার অনুমতি দেওয়া হয় Class.staticMethod(), যেখানে variableঘোষিত প্রকারের সাথে একটি পরিবর্তনশীল Class। আমি মানি এটি খারাপ ভাষার নকশা।
ফিশিনিয়ার

3

জাভাতে ওভাররাইড করার সহজ অর্থ হল যে নির্দিষ্ট পদ্ধতিটি বস্তুর রানটাইম টাইপের ভিত্তিতে ডাকা হবে এবং এটির সংকলন-টাইমের ধরণের ভিত্তিতে নয় (যা ওভাররাইড হওয়া স্থির পদ্ধতিগুলির ক্ষেত্রে)। স্ট্যাটিক পদ্ধতিগুলি শ্রেণি পদ্ধতি হিসাবে এগুলি উদাহরণ পদ্ধতি নয় তাই কোন বিষয় বা উদাহরণের সাথে কোন রেফারেন্স নির্দেশ করছে তার সাথে তাদের কিছুই করার নেই কারণ স্থির পদ্ধতির প্রকৃতির কারণে এটি একটি নির্দিষ্ট শ্রেণীর অন্তর্গত। আপনি এটি সাবক্লাসে পুনরায় ঘোষনা করতে পারেন তবে সেই সাবক্লাস পিতামাতা শ্রেণীর স্থিতিশীল পদ্ধতিগুলি সম্পর্কে কিছুই জানতে পারবে না কারণ আমি যেমন বলেছি, এটি কেবলমাত্র যে শ্রেণিতে এটি ঘোষিত হয়েছে তা সুনির্দিষ্ট। অবজেক্টের রেফারেন্স ব্যবহার করে তাদের অ্যাক্সেস করা জাভা ডিজাইনারদের দেওয়া কেবলমাত্র একটি অতিরিক্ত স্বাধীনতা এবং কেবলমাত্র তারা যখন এটিকে আরও বিশদ এবং উদাহরণকে সীমাবদ্ধ করে তখনই আমরা অবশ্যই এই অনুশীলনটি বন্ধ করার কথা চিন্তা করি না should http://faisalbhagat.blogspot.com/2014/09/method-overriding-and-method-hiding.html


3

ওভাররাইড করে, আপনি গতিশীল পলিমারফিজম অর্জন করেন। আপনি যখন স্থিতিশীল পদ্ধতিগুলিকে ওভাররাইড করে বলছেন, আপনি যে শব্দগুলি ব্যবহার করার চেষ্টা করছেন তা বিরোধী are

স্থিতিশীল বলেছেন - সংকলন সময়, গতিশীল পলিমারফিজমের জন্য ওভাররাইডিং ব্যবহৃত হয়। উভয়ই প্রকৃতির বিপরীত এবং তাই একসাথে ব্যবহার করা যায় না।

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

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

দ্রষ্টব্য: আপনি যদি কোনও বস্তু সহ কোনও শ্রেণি পদ্ধতিতে অ্যাক্সেস করেন, তবুও জাভা সংকলক এটি খুঁজে পাওয়ার জন্য যথেষ্ট বুদ্ধিমান এবং স্থির লিঙ্কিং করবে।


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

স্থির অর্থ সংকলন সময় নয়, স্থির অর্থ এটি শ্রেণীর সাথে আবদ্ধ হয় তবে কোনও নির্দিষ্ট অবজেক্ট। এটি ক্লাস কারখানা তৈরির চেয়ে বেশি বুদ্ধি না থাকলে, স্থিতিশীল ব্যতীত Box.createBoxআরও বেশি জ্ঞান অর্জন করে BoxFactory.createBoxএবং এটি একটি অনিবার্য প্যাটার্ন হয় যখন ব্যতিক্রম না ছোঁড়ায় নির্মাণে ত্রুটি পরীক্ষা করার প্রয়োজন হয় (কনস্ট্রাক্টর ব্যর্থ হতে পারে না, তারা কেবল প্রক্রিয়া / নিক্ষেপ করতে পারে ব্যতিক্রম), যেখানে একটি স্থিতিশীল পদ্ধতি ব্যর্থতার পিছনে ফিরে আসতে পারে, বা এমনকি সাফল্য / ত্রুটি কলব্যাকগুলি hastebin.com/codjahati.java এর মতো কিছু লিখতে পারে ।
দিমিত্রি

2

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


1
হাই জি 4 ইউকিউ 3_ গৌরব অবদান রাখার সিদ্ধান্ত নেওয়ার জন্য ধন্যবাদ তবে আমরা সাধারণত এর চেয়ে দীর্ঘতর এবং আরও বিস্তারিত উত্তর আশা করি।
ডিজেক্লেওয়ার্থ

@ ডিজেক্লেওয়ার্থ আপনি উত্তর উত্তর geeksforgeeks.org/…
g1ji

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

1

সহজ সমাধান: সিঙ্গলটন উদাহরণ ব্যবহার করুন। এটি ওভাররাইড এবং উত্তরাধিকারের অনুমতি দেবে।

আমার সিস্টেমে আমার সিঙ্গলেটনস রেজিস্ট্রি ক্লাস রয়েছে যা উত্তীর্ণ শ্রেণীর জন্য উদাহরণ দেয়। উদাহরণ না পাওয়া গেলে এটি তৈরি করা হয়।

হ্যাক্স ভাষা ক্লাস:

package rflib.common.utils;
import haxe.ds.ObjectMap;



class SingletonsRegistry
{
  public static var instances:Map<Class<Dynamic>, Dynamic>;

  static function __init__()
  {
    StaticsInitializer.addCallback(SingletonsRegistry, function()
    {
      instances = null;
    });

  } 

  public static function getInstance(cls:Class<Dynamic>, ?args:Array<Dynamic>)
  {
    if (instances == null) {
      instances = untyped new ObjectMap<Dynamic, Dynamic>();      
    }

    if (!instances.exists(cls)) 
    {
      if (args == null) args = [];
      instances.set(cls, Type.createInstance(cls, args));
    }

    return instances.get(cls);
  }


  public static function validate(inst:Dynamic, cls:Class<Dynamic>)
  {
    if (instances == null) return;

    var inst2 = instances[cls];
    if (inst2 != null && inst != inst2) throw "Can\'t create multiple instances of " + Type.getClassName(cls) + " - it's singleton!";
  }

}

খুব দুর্দান্ত, হ্যাক্স প্রোগ্রামিং ভাষা সম্পর্কে এটি প্রথমবার শুনেছি :)
সাইক 115

1
এটি জাভাতে আরও ভালভাবে ক্লাসে স্ট্যাটিক পদ্ধতি হিসাবে প্রয়োগ করা হয়; Singleton.get()। রেজিস্ট্রিটি কেবলমাত্র ওভারহেডে বয়লারপ্লেট, এবং এটি ক্লাসগুলিতে জিসিকে অন্তর্ভুক্ত করে।
লরেন্স ডল

আপনার ঠিক আছে, এটি একটি সর্বোত্তম সমাধান। আমি ঠিক জানি না কেন আমি কেন রেজিস্ট্রি বেছে নিয়েছিলাম, সম্ভবত কিছু চিন্তাভাবনা ছিল যা এই ফলাফলের দিকে নিয়েছিল।
রায়ভো ফিশমিস্টার

1

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

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

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

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


নীচের অংশটি কোডটি স্থির পদ্ধতিটিকে ওভাররাইড করার চেষ্টা করে তবে কোনও সংকলনের ত্রুটির মুখোমুখি হবে না

public class Vehicle {
static int VIN;

public static int getVehileNumber() {
    return VIN;
}}

class Car extends Vehicle {
static int carNumber;

public static int getVehileNumber() {
    return carNumber;
}}

এটি কারণ, এখানে আমরা কোনও পদ্ধতির উপর নজর রাখছি না তবে আমরা কেবল এটি পুনরায় ঘোষণা করছি। জাভা কোনও পদ্ধতির পুনরায় ঘোষণার অনুমতি দেয় (স্ট্যাটিক / নন-স্ট্যাটিক)।

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

এছাড়াও, যদি getVehileNumber () চূড়ান্ত হিসাবে ঘোষিত হয় তবে কোডটি সংকলন করবে না, যেহেতু চূড়ান্ত কীওয়ার্ডটি প্রোগ্রামারটিকে পদ্ধতিটি পুনরায় ঘোষণা করতে বাধা দেয়।

public static final int getVehileNumber() {
return VIN;     }

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


1

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


public abstract IBox createBox();আইবক্স ইন্টারফেসের অভ্যন্তরে অন্তর্নিহিত কীভাবে কাজ করা যায় ? ক্রিয়েবক্সকে ওভাররাইড করার জন্য বক্স আইবক্স বাস্তবায়ন করতে পারে এবং বৈধ আইবক্সে অবজেক্টের ফলাফল তৈরি করতে পারে, অন্যথায় একটি শূন্যতা ফিরিয়ে দেয়। কনস্ট্রাক্টররা "নাল" ফিরিয়ে দিতে পারবেন না এবং সেইজন্য আপনি (1) ব্যতিক্রমগুলি সর্বদা (আমরা এখন যা করি) ব্যবহার করতে বাধ্য হই, বা (2) ফ্যাক্টরি ক্লাস তৈরি করে যা আমি যা বলেছিলাম তা কিন্তু এমনভাবে যা নবীনদের বা বিশেষজ্ঞদের কাছে কোনও ধারণা রাখে না জাভা (যা এখন আমরাও করি) স্থির অযৌক্তিক পদ্ধতিগুলি এটি সমাধান করে।
দিমিত্রি

-1

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

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

উদাহরণস্বরূপ, নীচের কোডটি দেখুন: -

public class StaticMethodsHiding {
    public static void main(String[] args) {
        SubClass.hello();
    }
}


class SuperClass {
    static void hello(){
        System.out.println("SuperClass saying Hello");
    }
}


class SubClass extends SuperClass {
    // static void hello() {
    // System.out.println("SubClass Hello");
    // }
}

আউটপুট: -

SuperClass saying Hello

সাব ক্লাসে স্থির পদ্ধতি লুকিয়ে রাখার বিষয়ে বিশদ জন্য জাভা ওরাকল ডক্স দেখুন এবং একটি সাবক্লাসে আপনি কী করতে পারেন তা সন্ধান করুন।

ধন্যবাদ


-3

নিম্নলিখিত কোডটি দেখায় যে এটি সম্ভব:

class OverridenStaticMeth {   

static void printValue() {   
System.out.println("Overriden Meth");   
}   

}   

public class OverrideStaticMeth extends OverridenStaticMeth {   

static void printValue() {   
System.out.println("Overriding Meth");   
}   

public static void main(String[] args) {   
OverridenStaticMeth osm = new OverrideStaticMeth();   
osm.printValue();   

System.out.println("now, from main");
printValue();

}   

} 

1
না এটা হয় না; স্থির ঘোষিত ধরণের osmহয় OverridenStaticMethনা OverrideStaticMeth
লরেন্স ডল

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