স্থির পদ্ধতি জাভাতে বিমূর্ত হতে পারে না কেন?


592

জাভাতে প্রশ্নটি আমি কেন একটি বিমূর্ত স্থির পদ্ধতি সংজ্ঞায়িত করতে পারি না? উদাহরণ স্বরূপ

abstract class foo {
    abstract void bar( ); // <-- this is ok
    abstract static void bar2(); //<-- this isn't why?
}

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

6
যদি আপনার প্রশ্নের উত্তর দেওয়ার কিছু থাকে তবে এটিকে উত্তর হিসাবে পোস্ট করুন , কোনও মন্তব্য নয়
সলোমন উকো

উত্তর:


569

কারণ "বিমূর্ত" এর অর্থ: "কোনও কার্যকারিতা কার্যকর করে না", এবং "স্ট্যাটিক" এর অর্থ: "আপনার কোনও বস্তুর উদাহরণ না থাকলেও কার্যকারিতা রয়েছে"। এবং এটি একটি যৌক্তিক দ্বন্দ্ব।


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

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

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

10
@Eric: এবং এখনো , আপনি কি বলতে প্রযোজ্য নয় abstract static: একটি ফাংশন হল x যে "উপশ্রেণী বাস্তবায়িত" করতে পারবে না একই সময়ে "শ্রেণী মৃত্যুদন্ড কার্যকর" করা - শুধুমাত্র উপর উপশ্রেণী । যেখানে এটি আর বিমূর্ত হয় না।
টমলক

72
@ টোমাকাক: আপনার যুক্তিটি বিজ্ঞপ্তিযুক্ত। static"খালি নয়" - এর অর্থ জাভা স্থির পদ্ধতিগুলি বিমূর্ত হতে দেয় না এটি কেবলমাত্র একটি পরিণতি। এর অর্থ "ক্লাসে কল করা"। (এর অর্থ " কেবলমাত্র ক্লাসে কলযোগ্য" হওয়া উচিত তবে এটি অন্য সমস্যা abstract static। কিছু পদ্ধতি কেবল উদাহরণ পদ্ধতি হিসাবে বোঝায় না। দুর্ভাগ্যক্রমে জাভা আপনাকে কোনও বিমূর্ত বেস ক্লাস (বা একটি ইন্টারফেস) তৈরি করার সময় নির্দিষ্ট করতে দেয় না।
মাইকেল কারম্যান

326

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


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

22
আমি বিশ্বাস করি যে আপনি "দরিদ্র ভাষার নকশা" হিসাবে উল্লেখ করেছেন এটি সত্যই "সুরক্ষামূলক ভাষার নকশা" বেশি, যার উদ্দেশ্য হ'ল অপ্রয়োজনীয় ভাষার বৈশিষ্ট্যগুলির কারণে প্রবর্তকরা যে OO নীতি লঙ্ঘন করেন তা সীমিত করা।
ইথানফার

22
"বিমূর্ত স্ট্যাটিক" ধারণাটি ওও নীতির লঙ্ঘন?
ট্রেভর

7
@ থ্রিডড, মোটেও নয়, তবে অবশ্যই এমন লোকেরা আছে যারা বলে যে কেবল নিজের ধারণাটি staticইতিমধ্যে লঙ্ঘন ....
পেসারিয়ার

4
স্ট্যাটিকের প্রয়োজনীয়তা একটি স্পষ্ট প্রদর্শন যে "ওও নীতিগুলি" সাধারণত দাবি করা ততটা সর্বসীমা নয়।
বেন

147

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


18
হ্যাঁ জাভাতে স্থির পদ্ধতিগুলি ওভাররাইড করা যায় না সেভাবে এটি সত্যিই লজ্জাজনক।
মিশেল

12
@ মিশেল: বিষয়টি কী হবে? যদি আপনি উদাহরণ ভিত্তিক আচরণ চান, উদাহরণ পদ্ধতি ব্যবহার করুন।
রান 12 ঘন্টা

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

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

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

70

abstractএকটি পদ্ধতি টীকা ইঙ্গিত করে যে পদ্ধতি উপশ্রেণী মধ্যে ওভাররাইড করা আবশ্যক।

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

যেহেতু স্থিতিশীল সদস্যগুলিকে সাবক্লাসে ওভাররাইড করা যায় না, তাই abstractটীকা তাদের জন্য প্রয়োগ করা যায় না।

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

ClassA.methodA();

এবং

methodA();

স্মলটাল্কে, শ্রেণীর নামটি alচ্ছিক নয়, সুতরাং বাক্য গঠনটি (নোট করুন যে স্মলটালক "বিষয়" এবং "ক্রিয়া" পৃথক করতে ব্যবহার করে না, পরিবর্তে এটি রাষ্ট্রীয় পরিসমাপ্তি হিসাবে ব্যবহার করে):

ClassA methodA.

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


1
"একটি স্ট্যাটিক সদস্যকে সাবক্লাসে ওভাররাইড করা যায় না" ভুল। এটি সম্ভব, অন্তত জাভা 6 এ। কখন থেকে বিষয়টি নিশ্চিত তা নিশ্চিত নয়।
স্টিভেন ডি গ্রুট 15

15
@ স্টিভেন ডি গ্রোট একটি স্ট্যাটিক সদস্য প্রকৃতপক্ষে সাবক্লাস দ্বারা ওভাররাইড করা যাবে না। যদি একটি সাবক্লাসের সুপারক্লাসে স্থির পদ্ধতির মতো একই স্বাক্ষরযুক্ত একটি স্থিতিশীল পদ্ধতি থাকে তবে এটি এটিকে ওভাররাইড করে না, এটি এটি লুকিয়ে রাখে। http://docs.oracle.com/javase/tutorial/java/IandI/override.html পার্থক্য হ'ল পলিমারফিজম কেবল ওভাররাইডের জন্যই কাজ করে, তবে লুকানো পদ্ধতির জন্য নয়।
29

2
@ জন 29 স্পষ্টতার জন্য ধন্যবাদ, তবে নামকরণের পার্থক্য বাদে এটি ব্যবহারে একই রকম বলে মনে হচ্ছে।
স্টিভেন ডি গ্রুট

2
@ স্টিভেন ডি গ্রুটে হ্যাঁ, এটি ব্যবহারেও একই রকম, তবে আচরণটি ভিন্ন। স্ট্যাটিক বিমূর্ত পদ্ধতি না থাকার কারণেই এটি স্থির বিমূর্ত পদ্ধতিগুলি যদি পলিমারফিজমকে সমর্থন না করে তবে তার বিন্দুটি কী?
29

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

14

আমি একই প্রশ্ন জিজ্ঞাসা, এখানে কেন

যেহেতু বিমূর্ত শ্রেণি বলছে, এটি বাস্তবায়ন দেয় না এবং সাবক্লাসটি এটি দেওয়ার অনুমতি দেয় না

সুতরাং সাবক্লাসকে সুপারক্লাসের পদ্ধতিগুলি ওভাররাইড করতে হবে,

নিয়ম সংখ্যা 1 - একটি স্থিতিশীল পদ্ধতি ওভাররাইড করা যায় না

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

সুতরাং, তারা বিমূর্ত হতে পারে।

মত জিনিস আছে বিমূর্ত স্ট্যাটিক <--- জাভা ইউনিভার্স মঞ্জুরিপ্রাপ্ত নয়


5
-1, এটি সত্য নয় যে "জাভা স্থিতিশীল পদ্ধতিটিকে ওভাররাইড করার অনুমতি দেয় না কারণ স্থির সদস্য এবং পদ্ধতিগুলি সময়ের উপাদানগুলি সংকলন করে"। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ৩70০৯62২/২abstract static দেখুন স্থিতিশীল টাইপ-চেকিং অবশ্যই সম্ভব । জাভা স্থির পদ্ধতিগুলিকে ওভাররাইড করার অনুমতি দেয় না এর আসল কারণ হ'ল জাভা স্থির পদ্ধতিগুলিকে ওভাররাইড করার অনুমতি দেয় না।
পেসারিয়ার

পলিমারফিজমের সাথে ওভারলোডিংয়ের কোনও সম্পর্ক নেই। ওভারলোডিং এবং ওভাররাইডিংয়ের জাভা এবং জাভাস্ক্রিপ্ট উভয়ের মধ্যে "জাভা" থাকা একই উপায়ে "ওভার" উপসর্গ ব্যতীত আর কিছুই নেই। কোনও পদ্ধতির নাম এটি সনাক্ত করে না, এটির স্বাক্ষর এটি। ঠিক foo(String)তেমনটি নয় foo(Integer)- এটাই সব।
ক্যাপ্টেন ম্যান

@ ক্যাপিটেনম্যান ওভারলোডিংকে আক্ষরিক অর্থে "প্যারামেট্রিক পলিমারফিজম" বলা হয় কারণ পরামিতিটির ধরণের উপর নির্ভর করে একটি আলাদা পদ্ধতি বলা হয় যা পলিমারফিজম is
Davor

12

এটি একটি ভয়াবহ ভাষার নকশা এবং কেন এটি সম্ভব হতে পারে তা নিয়ে আসলেই কোনও কারণ নেই।

আসলে, এখানে কিভাবে এটি একটি বাস্তবায়ন করতে পারেন মধ্যে সম্পন্ন করা জাভা :

public class Main {

        public static void main(String[] args) {
                // This is done once in your application, usually at startup
                Request.setRequest(new RequestImplementationOther());

                Request.doSomething();
        }

        public static final class RequestImplementationDefault extends Request {
                @Override
                void doSomethingImpl() {
                        System.out.println("I am doing something AAAAAA");
                }
        }

        public static final class RequestImplementaionOther extends Request {
                @Override
                void doSomethingImpl() {
                        System.out.println("I am doing something BBBBBB");
                }
        }

        // Static methods in here can be overriden
        public static abstract class Request {

                abstract void doSomethingImpl();

                // Static method
                public static void doSomething() {
                        getRequest().doSomethingImpl();
                }

                private static Request request;
                private static Request getRequest() {
                        // If setRequest is never called prior, it will default to a default implementation. Of course you could ignore that too. 
                        if ( request == null ) {
                                return request = new RequestImplementationDefault();
                        }
                        return request;
                }
                public static Request setRequest(Request r){
                        return request = r;
                }

        }
}

================= নীচের পুরানো উদাহরণ ===================

GetRequest সন্ধান করুন এবং getRequestImpl ... setInstance কল করার আগে বাস্তবায়ন পরিবর্তন করতে বলা যেতে পারে।

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * @author Mo. Joseph
 * @date 16 mar 2012
 **/

public abstract class Core {


    // ---------------------------------------------------------------        
    private static Core singleton; 
    private static Core getInstance() {
        if ( singleton == null )
            setInstance( new Core.CoreDefaultImpl() );  // See bottom for CoreDefaultImpl

        return singleton;
    }    

    public static void setInstance(Core core) {
        Core.singleton = core;
    }
    // ---------------------------------------------------------------        



    // Static public method
    public static HttpServletRequest getRequest() {      
        return getInstance().getRequestImpl();
    }


    // A new implementation would override this one and call setInstance above with that implementation instance
    protected abstract HttpServletRequest getRequestImpl();




    // ============================ CLASSES =================================

    // ======================================================================
    // == Two example implementations, to alter getRequest() call behaviour 
    // == getInstance() have to be called in all static methods for this to work
    // == static method getRequest is altered through implementation of getRequestImpl
    // ======================================================================

    /** Static inner class CoreDefaultImpl */
    public static class CoreDefaultImpl extends Core { 
        protected HttpServletRequest getRequestImpl() {
            return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        }
    }

     /** Static inner class CoreTestImpl : Alternative implementation */
    public static class CoreTestImpl extends Core { 
        protected HttpServletRequest getRequestImpl() {
            return new MockedRequest();
        }
    }       

}

অনুসরণ হিসাবে ব্যবহৃত:

static {
     Core.setSingleton(new Core.CoreDefaultImpl());

     // Or

     Core.setSingleton(new Core.CoreTestImpl());

     // Later in the application you might use

     Core.getRequest(); 

}

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

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

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

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

5
  • একটি বিমূর্ত পদ্ধতিটি কেবলমাত্র তাই সংজ্ঞায়িত করা হয় যাতে এটি একটি সাবক্লাসে ওভাররাইড করা যায়। তবে স্থির পদ্ধতিগুলি ওভাররাইড করা যায় না। অতএব, এটি একটি বিমূর্ত, স্থির পদ্ধতি থাকা একটি সংকলন-সময় ত্রুটি।

    এখন পরের প্রশ্নটি হল স্ট্যাটিক পদ্ধতিগুলি কেন ওভাররাইড করা যায় না ??

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


4

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

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


4

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

ধরুন আপনার কাছে ক্লাসগুলির একগুচ্ছ অভিন্ন একটি স্থিতিশীল পদ্ধতি রয়েছে। এই পদ্ধতিগুলি শ্রেণিবদ্ধ একটি স্থিতিশীল পদ্ধতি কল করে:

class C1 {
    static void doWork() {
        ...
        for (int k: list)
            doMoreWork(k);
        ...
    }
    private static void doMoreWork(int k) {
        // code specific to class C1
    }
}
class C2 {
    static void doWork() {
        ...
        for (int k: list)
            doMoreWork(k);
        ...
    }
    private static void doMoreWork(int k) {
        // code specific to class C2
    }
}

doWork()পদ্ধতি C1এবং C2অভিন্ন। এর মধ্যে প্রচুর পরিমাণে কলস থাকতে পারে: C3 C4ইত্যাদি যদি static abstractঅনুমতি দেওয়া হয় তবে আপনি নকল কোডটি এমন কিছু করে মুছে ফেলতেন :

abstract class C {
    static void doWork() {
        ...
        for (int k: list)
            doMoreWork(k);
        ...
    }

    static abstract void doMoreWork(int k);
}

class C1 extends C {
    private static void doMoreWork(int k) {
        // code for class C1
    }
}

class C2 extends C {
    private static void doMoreWork(int k) {
        // code for class C2
    }
}

তবে এটি সংকলন করবে না কারণ static abstractসংমিশ্রণ অনুমোদিত নয়। যাইহোক, এটি static classকনস্ট্রাক্ট দিয়ে সংঘবদ্ধ করা যেতে পারে , যা অনুমোদিত:

abstract class C {
    void doWork() {
        ...
        for (int k: list)
            doMoreWork(k);
        ...
    }
    abstract void doMoreWork(int k);
}
class C1 {
    private static final C c = new  C(){  
        @Override void doMoreWork(int k) {
            System.out.println("code for C1");
        }
    };
    public static void doWork() {
        c.doWork();
    }
}
class C2 {
    private static final C c = new C() {
        @Override void doMoreWork(int k) {
            System.out.println("code for C2");
        }
    };
    public static void doWork() {
        c.doWork();
    }
}

এই সমাধানের সাথে ডুপ্লিকেট করা একমাত্র কোডটি

    public static void doWork() {
        c.doWork();
    }

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

আপনি এখানে যে প্রসঙ্গটি সরবরাহ করেছেন তা আমি বুঝতে পারি না। আপনার চূড়ান্ত সমাধানে আপনি যা করতে পারেন তা কল C1.doWork()বা C2.doWork()আপনি কল করতে পারবেন না C.doWork()। এছাড়াও আপনি যে উদাহরণ সরবরাহ করেছেন, তাতে কোনটি কার্যকর হবে না, ধরুন যদি এটি অনুমোদিত হয় তবে শ্রেণি কীভাবে Cএর বাস্তবায়ন খুঁজে পাবে doMoreWork()? অবশেষে আমি আপনার প্রসঙ্গ কোডটি একটি খারাপ নকশা বলব। কেন? কারণ আপনি কোড জন্য পৃথক ফাংশন যা পরিবর্তে কোড সাধারণ যে জন্য একটি ফাংশন তৈরি এবং তারপর ক্লাসে একটি স্ট্যাটিক ফাংশন রূপায়ণকারী অনন্য তৈরি করেছেন C। এটা সহজ !!!
ব্লিপ করুন

2

ধরুন এখানে দুটি ক্লাস রয়েছে, Parentএবং ChildParentহয় abstract। ঘোষণাগুলি নিম্নরূপ:

abstract class Parent {
    abstract void run();
}

class Child extends Parent {
    void run() {}
}

এর অর্থ হ'ল যে কোনও উদাহরণ Parentঅবশ্যই run()নির্বাহ করা হবে।

যাইহোক, এখন এটি Parentনা অনুমান abstract

class Parent {
    static void run() {}
}

এর অর্থ Parent.run()এটি স্থির পদ্ধতি কার্যকর করবে will

একটি abstractপদ্ধতির সংজ্ঞাটি হ'ল "এমন একটি পদ্ধতি যা ঘোষিত হয় তবে বাস্তবায়িত হয় না", যার অর্থ এটি নিজে কিছু দেয় না।

কোনও staticপদ্ধতির সংজ্ঞাটি হ'ল "এমন একটি পদ্ধতি যা একই পরামিতিগুলির জন্য একই মান প্রদান করে যেখানে এটি বলা হয় না কেন"।

abstractউদাহরণ পরিবর্তনের সাথে সাথে একটি পদ্ধতির রিটার্ন মান পরিবর্তন হবে। একটি staticপদ্ধতি না। একটি static abstractপদ্ধতি হ'ল এমন একটি পদ্ধতি যেখানে রিটার্নের মান স্থির থাকে তবে কোনও কিছুই ফেরত দেয় না। এটি একটি যৌক্তিক দ্বন্দ্ব।

এছাড়াও, কোনও static abstractপদ্ধতির জন্য খুব বেশি কারণ নেই ।


2

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


1
বিমূর্ত শ্রেণিতে অবশ্যই স্থির পদ্ধতি থাকতে পারে। তবে স্থির বিমূর্ত পদ্ধতি নয়।
জ্যাকসঅনএফ

2

পদ্ধতি হিসেবে ঘোষণা staticউপায়ে আমরা তার বর্গ নামে যে পদ্ধতি কল করতে পারেন এবং যদি যে ক্লাস হয় abstractপাশাপাশি, এটা কোন ইন্দ্রিয় তোলে একে ডাকতে যেমন কোনো অংশ নেই, তাই আমরা উভয় হিসাবে একটি পদ্ধতি ঘোষণা করতে পারবে না staticএবং abstract


2

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


1

ক্লাসের উদাহরণ ছাড়াই একটি স্ট্যাটিক পদ্ধতি বলা যেতে পারে। আপনার উদাহরণে আপনি foo.bar2 () কল করতে পারেন, তবে foo.bar () না, কারণ বারের জন্য আপনার একটি উদাহরণ প্রয়োজন। নিম্নলিখিত কোড কাজ করবে:

foo var = new ImplementsFoo();
var.bar();

আপনি যদি কোনও স্ট্যাটিক পদ্ধতিতে কল করেন তবে এটি সর্বদা একই কোড কার্যকর করা হবে। উপরের উদাহরণে, আপনি ইমপ্লিমেন্টসফুতে বার 2 পুনরায় সংজ্ঞায়িত করলেও, var.bar2 () এ কল foo.bar2 () চালিত করবে।

যদি বার 2 এর এখন কোনও প্রয়োগণ না থাকে (এটি বিমূর্তির অর্থ) তবে আপনি প্রয়োগ না করে কোনও পদ্ধতিতে কল করতে পারেন। এটা খুব ক্ষতিকারক।


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

3
আসলে, আমি ভুল ছিল। কোনও ইন্টারফেসে আপনার স্থির পদ্ধতি থাকতে পারে না। ভাষার ত্রুটি।
ফিজিয়ারাওন

1

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

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

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

abstract class Foo {
    abstract static void bar();
}

class Foo2 {
    @Override
    static void bar() {}
}

তারপরে যে কোনও Foo.bar();কল স্পষ্টতই অবৈধ এবং আপনি সর্বদা ব্যবহার করবেন Foo2.bar();

এটি মনে রেখে, একটি স্ট্যাটিক বিমূর্ত পদ্ধতিটির একমাত্র উদ্দেশ্য হ'ল এই জাতীয় পদ্ধতিটি বাস্তবায়নের জন্য সাবক্লাসগুলি প্রয়োগ করা। আপনি প্রথমে মনে হতে পারে এই খুব ভুল, কিন্তু যদি আপনি একটি জেনেরিক টাইপ প্যারামিটার আছে <E extends MySuperClass>এটা ইন্টারফেসের মাধ্যমে যে গ্যারান্টি চমৎকার হবে Eকরতে পারেন .doSomething()। মনে রাখবেন টাইপ ইরেজরের জেনেরিকগুলি কেবল সংকলনের সময় উপস্থিত রয়েছে।

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

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


1

কারণ অ্যাবস্ট্রাক্ট ক্লাসটি একটি ওওপিএস ধারণা এবং স্ট্যাটিক সদস্যরা ওওপিএসের অংশ নয় ....
এখন কথাটি হ'ল আমরা ইন্টারফেসে স্থির সম্পূর্ণ পদ্ধতি ঘোষণা করতে পারি এবং একটি ইন্টারফেসের অভ্যন্তরে মূল পদ্ধতি ঘোষণা করে আমরা ইন্টারফেস চালাতে পারি

interface Demo 
{
  public static void main(String [] args) {
     System.out.println("I am from interface");
  }
}

0

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

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

public interface SortableObject {
    public [abstract] static String [] getSortableTypes();
    public String getSortableValueByType(String type);
}

এখন আপনি একটি বাছাইযোগ্য অবজেক্টের সংজ্ঞা দিতে পারেন যা মূল ধরণের অনুসারে বাছাই করা যায় যা এই সমস্ত বস্তুর জন্য একই:

public class MyDataObject implements SortableObject {
    final static String [] SORT_TYPES = {
        "Name","Date of Birth"
    }
    static long newDataIndex = 0L ;

    String fullName ;
    String sortableDate ;
    long dataIndex = -1L ;
    public MyDataObject(String name, int year, int month, int day) {
        if(name == null || name.length() == 0) throw new IllegalArgumentException("Null/empty name not allowed.");
        if(!validateDate(year,month,day)) throw new IllegalArgumentException("Date parameters do not compose a legal date.");
        this.fullName = name ;
        this.sortableDate = MyUtils.createSortableDate(year,month,day);
        this.dataIndex = MyDataObject.newDataIndex++ ;
    }
    public String toString() {
        return ""+this.dataIndex+". "this.fullName+" ("+this.sortableDate+")";
    }

    // override SortableObject 
    public static String [] getSortableTypes() { return SORT_TYPES ; }
    public String getSortableValueByType(String type) {
        int index = MyUtils.getStringArrayIndex(SORT_TYPES, type);
        switch(index) {
             case 0: return this.name ;
             case 1: return this.sortableDate ;
        }
        return toString(); // in the order they were created when compared
    }
}

এখন আপনি একটি তৈরি করতে পারেন

public class SortableList<T extends SortableObject> 

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

String [] MenuItems = T.getSortableTypes();

একটি উদাহরণ ব্যবহার করার সাথে সমস্যাটি হ'ল সোর্টেবললিস্টে এখনও আইটেম না থাকতে পারে তবে ইতিমধ্যে পছন্দসই বাছাই করা দরকার।

চেরিও, ওলাফ


0

প্রথমে বিমূর্ত ক্লাস সম্পর্কে একটি মূল বিষয় - একটি বিমূর্ত শ্রেণি ইনস্ট্যান্ট করা যায় না ( উইকি দেখুন )। সুতরাং, আপনি কোনও বিমূর্ত শ্রেণির কোনও উদাহরণ তৈরি করতে পারবেন না ।

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

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

গম্ভীর গর্জন।


বিমূর্ত শ্রেণীর প্রতিটি পদ্ধতির মৃত্যুদণ্ড কার্যকর করার জন্য যেভাবেই হোক তার শ্রেণি বাড়ানো দরকার, সুতরাং এটি একটি বাহানা নয়। আপনি বিমূর্ত শ্রেণিটি প্রসারিত করতে পারেন (একই সময়ে, বিমূর্ত পদ্ধতি প্রয়োগ করে)। সুতরাং এটি ব্যাখ্যা হিসাবে কাজ করে না।
পেরে

0

জাভা ডক অনুসারে :

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

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

এর একটি দুর্দান্ত উদাহরণ হ'ল:

list.sort(ordering);

পরিবর্তে

Collections.sort(list, ordering);

স্থির পদ্ধতি ব্যবহারের আরেকটি উদাহরণ ডকটিতেও দেওয়া হয়েছে :

public interface TimeClient {
    // ...
    static public ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }

    default public ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }    
}

0

কারণ 'অ্যাবস্ট্রাক্ট' অর্থ পদ্ধতিটি ওভাররাইড করা বোঝায় এবং কেউ 'স্ট্যাটিক' পদ্ধতিগুলিকে ওভাররাইড করতে পারে না।


এই উত্তরটি এমন কোনও কিছুই যুক্ত করে না যা পূর্ববর্তী উত্তরগুলি ইতিমধ্যে সম্বোধন করে নি।
মঙ্গলআটমিক

@ মার্স অ্যাটমিক আমি মনে করি এটি আরও উপযুক্ত তবে শীর্ষের ভোট দেওয়া উত্তর। এছাড়াও, এটি সংক্ষিপ্ত।
প্রবীণ কুমার

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

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

"কেন আমি এটা করতে পারি না?" উত্তর: "আপনি পারবেন না কারণ"।
জ্যাকসঅনএফ

0

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

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


0

কারণ অ্যাবস্ট্রাক্ট একটি কীওয়ার্ড যা অ্যাবস্ট্রাক্ট পদ্ধতিতে প্রয়োগ করা হয় কোনও শরীর নির্দিষ্ট করে না। এবং যদি আমরা স্থিতিশীল কীওয়ার্ড সম্পর্কে কথা বলি তবে এটি শ্রেণিকক্ষের অন্তর্গত।


দয়া করে আপনার উত্তর সম্পর্কে কিছুটা বিস্তৃত হন।
ব্লিপ করুন

0

কারণ আপনি যদি ক্লাসে কোনও স্থিতিশীল সদস্য বা স্ট্যাটিক ভেরিয়েবল ব্যবহার করেন তবে এটি ক্লাস লোডিংয়ের সময়ে লোড হবে।


3
এবং কেন এটি একটি সমস্যা হবে?
eis

-1

আপনি জাভা 8 এ ইন্টারফেসের সাথে এটি করতে পারেন।

এটি সম্পর্কে এটি অফিসিয়াল ডকুমেন্টেশন:

https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html


2
কিভাবে? আমি সমাধানগুলির সন্ধান করেছি এবং এর কোন সন্ধান পাইনি।
তুইলিহা

Wut? তুমি পার না. সমস্ত স্ট্যাটিক ইন্টারফেস পদ্ধতি ইন্টারফেস ক্লাস ব্যবহার করে প্রার্থনা করতে হবে।
মিমি

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

-1

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


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