জাভাতে পাবলিক, সুরক্ষিত, প্যাকেজ-প্রাইভেট এবং প্রাইভেটের মধ্যে পার্থক্য কী?


3171

জাভা, সেখানে যখন এক্সেস সংশোধনকারীদের প্রতিটি যথা ডিফল্ট (ব্যক্তিগত প্যাকেজ), ব্যবহার করার স্পষ্ট নিয়ম আছে public, protectedএবং private, যখন উপার্জন classএবং interfaceএবং উত্তরাধিকার সঙ্গে তার আচরণ?


161
privateপ্যাকেজের মধ্যে অন্যান্য ক্লাস থেকে লুকায়। publicপ্যাকেজের বাইরে ক্লাসে প্রকাশ করে। কেবলমাত্র সাবক্লাসে সীমাবদ্ধ এর protectedএকটি সংস্করণ public
বিনোদনমূলক

87
@ টেনেনরিশিন - না; সি ++ এর বিপরীতে, জাভা protectedপদ্ধতিটিকে পুরো প্যাকেজ থেকে অ্যাক্সেসযোগ্য করে তোলে। জাভা এর দৃশ্যমানতা মডেল এই বোকামির লক্ষ্য ভেঙে protected
নিকোলাস বারবুলেসকো

35
@ নিকোলাস এটি সম্পূর্ণ প্যাকেজটি সহ, ছাড়া বা অ্যাক্সেসযোগ্য protected। অ্যাক্সেস মডিফায়ার হিসাবে , যা কিছু protectedকরে তা হ'ল প্যাকেজের বাইরে সাবক্লাসে প্রকাশ করা।
মার্চিউড

15
@tennenrishin - ভাল, নিকোলাস যা বলেছিল তা ... এবং আপনি এখন এটি পুনরাবৃত্তি করছেন। আপনি মূলত যা বলেছিলেন তা ছিল protected- এবং আমি উদ্ধৃতি দিয়েছি - 'কেবলমাত্র সাবক্লাসে সীমাবদ্ধ সর্বজনীন সংস্করণ' যা আপনার নিজের ভর্তি দ্বারা সত্য নয় যেহেতু সুরক্ষিত পুরো প্যাকেজটির মাধ্যমে অ্যাক্সেসের অনুমতি দেয় (তবে এটি সাবক্লাসে অ্যাক্সেসকে সীমাবদ্ধ করে না) । )
luis.espinal

10
আমি নিকোলাসের সাথেও একমত যে জাভায় সুরক্ষিত অ্যাক্সেস মোডটি মূর্খ। যা ঘটেছে তা হল জাভা সঙ্কুচিত অনুভূমিক (জাল্লা) এবং উল্লম্ব অ্যাক্সেস সীমাবদ্ধতার যোগ্যতা। ডিফল্ট স্কোপটি ল্যাটিস প্যাকেজ হওয়ার সাথে সাথে একটি অনুভূমিক / ল্যাটিসের সীমাবদ্ধতা। সর্বজনীন হ'ল আরেকটি অনুভূমিক সীমাবদ্ধতা যেখানে জাল পুরো পৃথিবী। ব্যক্তিগত এবং (সি ++) সুরক্ষিত উল্লম্ব। সুরক্ষিত সি ++ সংস্করণের সমতুল্য হয়ে রইল protected-packageএমন বিরল ক্ষেত্রে যেখানে আমাদের এটির প্রয়োজন ছিল সেখানে আমাদের ক্রস-কাট অ্যাক্সেস থাকলে এটি আরও ভাল হত protected
luis.espinal

উত্তর:


5634

অফিসিয়াল টিউটোরিয়ালটি আপনার কিছু উপকারে আসতে পারে।

______________________________________________________________
| │ শ্রেণি │ প্যাকেজ │ সাবক্লাস │ উপক্লাস │ বিশ্ব |
| । │ │ (একই pkg) │ (ভিন্ন pkg) │ |
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| সর্বজনীন │ + │ + │ + │ + │ + | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| সুরক্ষিত │ + │ + │ + │ + │ | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| কোনও সংশোধক নেই + │ + │ + │ │ | 
| ───────────┼───────┼─────────┼──────────┼──────── ──┼──────── |
| প্রাইভেট │ + │ │ │ │ |
| ___________ | _______ | _________ | __________ | __________ | ________ |
 +: অ্যাক্সেসযোগ্য ফাঁকা: অ্যাক্সেসযোগ্য

5
উপরের সারণীটি ভুল, কারণ এমনকি privateসদস্যরা একই উত্স-ফাইলে কোনও শ্রেণি / স্থির পদ্ধতি দ্বারা দেখা / ব্যবহার করতে পারে can
উসাগি মিয়ামামতো

5
সুরক্ষিত সদস্যকে কেবল একই প্যাকেজের সাবক্লাস থেকে অ্যাক্সেস করা যেতে পারে তবে বিভিন্ন প্যাকেজ থেকে সাবক্লাস নয়। উপরের টেবিলটিতে একটি সংশোধন হওয়া উচিত
niks

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

3
উদাহরণস্বরূপ, যদি আমার থাকে MyClassএবং আমি করি তবে আমার ভিতরে AnotherClass extends MyClassথেকে সমস্ত সুরক্ষিত এবং পাবলিক পদ্ধতি এবং বৈশিষ্ট্য অ্যাক্সেস হবে AnotherClass। আমি MyClass myClass = new MyClass();যদি AnotherClassঅন্য কোথাও করি - তবে নির্মাতাকে বলি - এটি যদি অন্য প্যাকেজে থাকে তবে আমার কেবলমাত্র পাবলিক পদ্ধতিতে অ্যাক্সেস থাকবে। মনে রাখবেন যে আমি যদি = new MyClass() { @Override protected void protectedMethod() { //some logic } };এটি করি তবে মনে হয় যে আমি সুরক্ষিত পদ্ধতিগুলি অ্যাক্সেস করতে পারি তবে এটি প্রসারিতের মতো, তবে পরিবর্তে ইনলাইন।
অ্যাডপ্রোকাস

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

483

(কেভেট: আমি জাভা প্রোগ্রামার নই, আমি পার্ল প্রোগ্রামার। পার্লের কোনও আনুষ্ঠানিক সুরক্ষা নেই যা সম্ভবত আমি সমস্যাটিকে এত ভালভাবে বুঝতে পেরেছি))

ব্যক্তিগত

আপনি যেমন ভাবেন, কেবল যে শ্রেণিতে এটি ঘোষিত হয়েছে তা এটি দেখতে পারে।

প্যাকেজ ব্যক্তিগত

এটি কেবলমাত্র প্যাকেজটিতে এটি ঘোষণা করা এবং ব্যবহার করা যেতে পারে । এটি জাভাতে ডিফল্ট (যা কিছুকে ভুল হিসাবে দেখায়)।

রক্ষিত

প্যাকেজ প্রাইভেট + সাবক্লাস বা প্যাকেজ সদস্যদের দ্বারা দেখা যেতে পারে।

প্রকাশ্য

প্রত্যেকেই এটি দেখতে পাবে।

প্রকাশিত

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

সি ++ একটি অতিরিক্ত স্তরকে "বন্ধু" হিসাবে সংজ্ঞায়িত করে এবং আপনার সম্পর্কে যত কম জানবেন তত ভাল।

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

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

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

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

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

অনেক ভাষা পাবলিক / সুরক্ষিত / প্রাইভেটের শ্রেণিবিন্যাসিক প্রকৃতি খুব সীমিত এবং বাস্তবের সাথে সঙ্গতিপূর্ণ না বলে মনে করে। সে লক্ষ্যে, বৈশিষ্ট্যযুক্ত শ্রেণীর ধারণা রয়েছে তবে এটি অন্য শো।


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

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

9
এই দিকটিতে @ রিয়েভান্ডারওয়েরডেন সি #+ এর মতোই। আমি এটি দেখতে বেশ অদ্ভুত মনে করি যে জাভা এমন কোনও সদস্যকে ঘোষণা করতে দেয় না যা সাবক্লাসে অ্যাক্সেসযোগ্য তবে পুরো প্যাকেজটি নয়। এটি আমার কাছে এক ধরণের উল্টো দিক - একটি প্যাকেজটি শিশু শ্রেণির চেয়ে বিস্তৃত সুযোগ!
কনরাড মোরাউস্কি

15
@ কনরাডমোরাউস্কি আইএমএইচও প্যাকেজটি সাবক্লাসের চেয়ে কম স্কোপ। যদি আপনি নিজের ক্লাসটি ফাইনাল হিসাবে ঘোষণা করেন না, ব্যবহারকারীরা এটি সাবক্লাস করতে সক্ষম হবেন - তাই জাভা সুরক্ষিত করা আপনার প্রকাশিত ইন্টারফেসের অংশ। ওটিওএইচ, প্যাকেজগুলি একক সংস্থার দ্বারা সুস্পষ্টভাবে বিকাশ করা হয়েছে: যেমন com.mycompany.mypackage। যদি আপনার কোডটি আমার প্যাকেজে নিজেকে ঘোষণা করে তবে আপনি স্পষ্টভাবে নিজেকে আমার সংস্থার অংশ হিসাবে ঘোষণা করেন, সুতরাং আমাদের যোগাযোগ করা উচিত। সুতরাং, প্যাকেজটি সাবক্লাসের চেয়ে শ্রোতাদের কাছে পৌঁছানোর পক্ষে (আমার সংস্থার লোকেরা) আরও কম / সহজে প্রকাশিত হয়েছে (যে ব্যক্তিরা আমার অবজেক্টকে প্রসারিত করে) এবং তাই এটি কম দৃশ্যমানতা হিসাবে গণ্য হয়।
নামবিহীন onym

2
friendক্লাসের মধ্যে বিশেষ সম্পর্ক নির্ধারণের জন্য ভাল good এটি সঠিকভাবে ব্যবহৃত হলে অনেক ক্ষেত্রে উচ্চতর এনক্যাপসুলেশনকে অনুমতি দেয়। উদাহরণস্বরূপ, এটি কোনও সুবিধাযুক্ত কারখানার শ্রেণি দ্বারা একটি নির্মিত ধরণের অভ্যন্তরীণ নির্ভরতা ইনজেক্ট করতে ব্যবহার করা যেতে পারে। এটির একটি খারাপ নাম রয়েছে কারণ যে সমস্ত লোকেরা ভালভাবে ডিজাইন করা অবজেক্ট মডেলটি সঠিকভাবে বজায় রাখার বিষয়ে চিন্তা করেন না তারা তাদের কাজের চাপকে স্বাচ্ছন্দ্যে এটিকে অপব্যবহার করতে পারেন।
ডেনিস

434

টেবিলের আরও ভাল সংস্করণ এখানে মডিউলগুলির জন্য একটি কলামও অন্তর্ভুক্ত রয়েছে।

জাভা অ্যাক্সেস পরিবর্তনকারী iers

ব্যাখ্যা

  • একটি বেসরকারী সদস্য ( i) হল শুধুমাত্র একই শ্রেণী হিসেবে এটা ঘোষিত হয় মধ্যে অ্যাক্সেসযোগ্য।

  • অ্যাক্সেস মডিফায়ার ( j) নেই এমন সদস্য কেবল একই প্যাকেজের ক্লাসের মধ্যে অ্যাক্সেসযোগ্য।

  • একটি সংরক্ষিত সদস্য ( k) একই প্যাকেজের সমস্ত শ্রেণীর মধ্যে প্রবেশযোগ্য এবং অন্যান্য প্যাকেজ উপশ্রেণী মধ্যে।

  • একজন প্রকাশ্য সদস্য ( l) সমস্ত শ্রেণীর কাছেই অ্যাক্সেসযোগ্য (যদি না এটি একটি বাস মডিউল এমন প্যাকেজের তাতে ঘোষিত হয় রপ্তানি করে না)।


কোন সংশোধকটি বেছে নেবেন?

অ্যাক্সেস মডিফায়ারগুলি হ'ল দুর্ঘটনাক্রমে এনক্যাপসুলেশন (*) ভাঙ্গা রোধ করতে সহায়তা করার একটি সরঞ্জাম । নিজেকে জিজ্ঞাসা করুন আপনি কি সদস্যকে এমন কিছু হতে চান যা শ্রেণি, প্যাকেজ, শ্রেণি শ্রেণিবিন্যাসের অভ্যন্তরীণ বা একেবারে অভ্যন্তরীণ নয়, এবং সেই অনুসারে অ্যাক্সেস স্তরটি চয়ন করে।

উদাহরণ:

  • কোনও ক্ষেত্র long internalCounterসম্ভবত ব্যক্তিগত হতে হবে কারণ এটি পরিবর্তনীয় এবং বাস্তবায়নের বিশদ।
  • যে ক্লাসটি কেবলমাত্র কারখানার শ্রেণিতে ইনস্ট্যান্ট করা উচিত (একই প্যাকেজের মধ্যে) একটি প্যাকেজ বিধিনিষেধযুক্ত কনস্ট্রাক্টর থাকতে হবে, কারণ প্যাকেজের বাইরে থেকে সরাসরি এটি কল করা সম্ভব নয়।
  • void beforeRender()উপস্থাপনের আগে ডেকে আনা অভ্যন্তরীণ পদ্ধতি এবং সাবক্লাসে হুক হিসাবে ব্যবহৃত সুরক্ষিত হওয়া উচিত।
  • void saveGame(File dst)জিইউআই কোড থেকে ডাকা একটি পদ্ধতি সর্বজনীন হওয়া উচিত।

(*) এনক্যাপসুলেশন হুবহু কী?


11
শুধু বলছি: এমন অনেক লোক রয়েছে যাদের লাল / সবুজ বর্ণের পার্থক্য নিয়ে সমস্যা রয়েছে। লাল / সবুজ (বা হলুদ / কমলা / ...) রঙিন স্কিম ব্যবহার করে টেবিলগুলি যে কোনও ক্ষেত্রে খুব কমই "ভাল" হয় ;-)
ঘোস্টটিক্ট

1
@ ঘোস্টগেট, আমি একমত নই আমি, intuitively মনে লাল / সবুজ প্রান্তিক "কাজ" অনেক মানুষের জন্য / "কাজ করে না" দিয়ে, অর্থাত্ এটা হয় অনেক বিকল্প চেয়ে ভাল।
আইয়ুব

8
colourblindawareness.org/colour-blindness/… ... 8% রঙিন অন্ধ পুরুষকে প্রায় 1% ডিউট্রানোপস, 1% প্রোটানোপস, 1% প্রোটানোমালাস এবং 5% ডিউট্রেনোমালাসে ভাগ করা যায়এবং যেহেতু আমি সেই 5% এর 50% এর মধ্যে একজন, বিশ্রামের আশ্বাস: লাল / সবুজ স্তন্যপান।
ঘোস্টটিক

6
@ ঘোস্টগেট ওকে .. এটি আমার প্রত্যাশার চেয়ে জনসংখ্যার একটি বড় অংশ। আমি এই রঙ অন্ধত্ব সিমুলেটরে চিত্রটি আপলোড করেছি এবং সমস্ত বিভিন্ন মোড পরীক্ষা করেছি। এমনকি একরঙা / আক্রোমাটপসিয়া মোডে রঙের পার্থক্য যুক্তিসঙ্গত। আপনি কি পার্থক্যটি দেখতে পাচ্ছেন বা সিমুলেটরটি বন্ধ আছে? (আমি এখনও এই
মতামতটিতে রয়েছি যে

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

206
____________________________________________________________________
                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |              |          |              |     
————————————————+———————————————+———————————+———————————————+———————
protected       |              |          |              |      
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |              |          |              |      
————————————————+———————————————+———————————+———————————————+———————
private         |              |          |              |       
____________________________________________________________________

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

2
@ ভ্যাংগার্ড 69৯, protectedসংশোধকটি চিহ্নিত জিনিসটিকে (শ্রেণি, পদ্ধতি বা ক্ষেত্র) কিছু অন্যান্য শ্রেণীর কাছে অন্য কিছু প্যাকেজে উপলব্ধ করে কেবল যদি অন্য শ্রেণিটি শ্রেণীর একটি সাবক্লাস যেখানে protectedচিহ্নিত জিনিসটি ঘোষিত হয়।
আব্দুল

"nonsubbed"? "এই প্যাকেজের অন্য প্যাকেজ"? হাহ। আমি ভেবেছিলাম আমি জাভা জানি।
sehe

@ আলেকজান্ডার ফারবার আপনি কি একটি নির্দিষ্ট ব্রাউজার কনফিগারেশনের জন্য অনুকূলিত করেছেন? এটি এখন আমার Chrome হয় এবং এই হল ফায়ারফক্স
sehe

হুম আসুন তাহলে আমার পরিবর্তনটি আবার ফিরিয়ে দিন
আলেকজান্ডার ফারবার

165

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

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

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

এছাড়াও, রিফ্যাক্টর করার সময় জিনিসগুলি ভাঙ্গা থেকে আটকাতে ওভাররাইড করার সময় @ ওভাররাইড টীকাটি ব্যবহার করুন।


3
@ রুচিরবারোনিয়া, "ওয়ার্ল্ড" = অ্যাপ্লিকেশনটির সমস্ত কোড, যেখানেই তা নির্বিশেষে।
আন্দ্রেজ

116

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

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

সারসংক্ষেপ

এই অ্যাক্সেস স্পেসিফায়ার সহ কোনও সদস্যের প্রবেশাধিকার অনুমোদিত?

  • সদস্য হ'ল private: কেবলমাত্র সদস্যকে কলিং কোড হিসাবে একই শ্রেণীর মধ্যে সংজ্ঞায়িত করা হয়।
  • সদস্যটি প্যাকেজটি ব্যক্তিগত: কেবলমাত্র কলিং কোডটি সদস্যের অবিলম্বে এনক্লোজিং প্যাকেজের মধ্যে থাকে।
  • সদস্য হলেন protected: একই প্যাকেজ, বা যদি সদস্যটি কলিং কোড সহ শ্রেণীর একটি সুপারক্লাসে সংজ্ঞায়িত হয়।
  • সদস্য হলেন public: হ্যাঁ

কী অ্যাক্সেস স্পেসিফায়ারদের প্রযোজ্য

স্থানীয় ভেরিয়েবল এবং আনুষ্ঠানিক পরামিতি অ্যাক্সেস স্পেসিফায়ার নিতে পারে না। যেহেতু এগুলি স্কোপিংয়ের নিয়ম অনুযায়ী বাহ্যিকভাবে সহজাতভাবে অ্যাক্সেসযোগ্য, সেগুলি কার্যকরভাবে ব্যক্তিগত।

শীর্ষ স্কোপের ক্লাসগুলির জন্য, কেবল publicএবং প্যাকেজ-প্রাইভেট অনুমোদিত। এই নকশা পছন্দ সম্ভবতঃ কারণ protectedএবং privateমোড়ক পর্যায়ে অপ্রয়োজনীয় হবে (সেখানে প্যাকেজ কোন উত্তরাধিকার যায়)।

সমস্ত অ্যাক্সেস স্পেসিফায়ার ক্লাস সদস্য (কন্সট্রাক্টর, পদ্ধতি এবং স্ট্যাটিক সদস্য ফাংশন, নেস্টেড ক্লাস) এ সম্ভব।

সম্পর্কিত: জাভা ক্লাস অ্যাক্সেসিবিলিটি

ক্রম

অ্যাক্সেস স্পেসিফায়ারদের কঠোরভাবে আদেশ করা যেতে পারে

সর্বজনীন> সুরক্ষিত> প্যাকেজ-প্রাইভেট> ব্যক্তিগত

যার অর্থ publicসর্বাধিক অ্যাক্সেস সরবরাহ করে private। একটি প্রাইভেট সদস্যের উপর সম্ভব যে কোনও রেফারেন্স প্যাকেজ-প্রাইভেট সদস্যের জন্যও বৈধ; কোনও প্যাকেজ-প্রাইভেট সদস্যের কোনও রেফারেন্স কোনও সুরক্ষিত সদস্যের পক্ষে বৈধ and (একই প্যাকেজে সুরক্ষিত সদস্যদের অন্য শ্রেণিতে অ্যাক্সেস দেওয়া একটি ভুল হিসাবে বিবেচিত হয়েছিল।)

মন্তব্য

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

ইনার ক্লাস

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

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

কীভাবে এগুলি ইন্টারঅ্যাক্ট হয় তার স্বাদের জন্য, এই উদাহরণটি বিবেচনা করুন। ব্যক্তিগত অভ্যন্তরীণ ক্লাসগুলি "ফাঁস" করা সম্ভব; এটি সাধারণত একটি সতর্কতা:

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

সংকলক আউটপুট:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

কিছু সম্পর্কিত প্রশ্ন:


1
"জনসাধারণ ব্যতীত অন্য সংশোধনকারীদের নিষিদ্ধ করা হয়েছে" - জাভা 9 হিসাবে, এটি আর হয় না: ইন্টারফেসের ব্যক্তিগত পদ্ধতিও থাকতে পারে।
এমসির সম্রাট

96

একটি চলতি নিয়ম হিসাবে:

  • private: শ্রেণির সুযোগ।
  • default(বা package-private): প্যাকেজ সুযোগ।
  • protected: package scope + child(প্যাকেজের মতো, তবে আমরা এটি বিভিন্ন প্যাকেজ থেকে সাবক্লাস করতে পারি)। সুরক্ষিত সংশোধক সর্বদা "পিতামাতা-সন্তানের" সম্পর্ক রাখে।
  • public: সর্বত্র।

ফলস্বরূপ, আমরা যদি অ্যাক্সেসকে তিনটি অধিকারে ভাগ করি:

  • (ডি) প্রত্যক্ষ (একই শ্রেণীর ভিতরে কোনও পদ্ধতি থেকে বা "এই" সিনট্যাক্সের মাধ্যমে প্রার্থনা করুন)।
  • (আর) ইফারেন্স (ক্লাসের রেফারেন্স ব্যবহার করে বা "ডট" সিনট্যাক্সের মাধ্যমে কোনও পদ্ধতির আবেদন করুন)।
  • (আমি) neritance (উপশ্রেণীর মাধ্যমে)।

তাহলে আমাদের কাছে এই সাধারণ টেবিলটি রয়েছে:

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

54

খুব সংক্ষেপে

  • public: যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য।
  • protected: একই প্যাকেজের ক্লাস এবং যে কোনও প্যাকেজে থাকা সাবক্ল্যাসগুলি অ্যাক্সেসযোগ্য।
  • ডিফল্ট (কোনও সংশোধক নির্দিষ্ট করা হয়নি): একই প্যাকেজটির ক্লাস দ্বারা অ্যাক্সেসযোগ্য।
  • private: কেবল একই শ্রেণীর মধ্যে অ্যাক্সেসযোগ্য।

47

জাভাতে সবচেয়ে ভুল বোঝাবুঝি অ্যাক্সেস মডিফায়ার protected। আমরা জানি যে এটি একটি ব্যতিক্রম সহ ডিফল্ট সংশোধকটির অনুরূপ যেখানে সাবক্লাসগুলি এটি দেখতে পারে। কিন্তু কিভাবে? আশা করি এই বিভ্রান্তি স্পষ্ট করে এমন একটি উদাহরণ এখানে:

  • ধরুন আমাদের ২ টি ক্লাস রয়েছে; Fatherএবং Son, প্রতিটি নিজস্ব প্যাকেজ:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
  • আসুন এতে একটি সুরক্ষিত পদ্ধতি যুক্ত foo()করুন Father

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
  • পদ্ধতিটি foo()4 টি প্রসঙ্গে বলা যেতে পারে:

    1. একটি শ্রেণীর ভিতরে যা একই প্যাকেজে অবস্থিত সেখানে foo()সংজ্ঞায়িত ( fatherpackage):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
    2. একটি সাবক্লাসের ভিতরে, বর্তমান উদাহরণে thisবা এর মাধ্যমে super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
    3. একটি রেফারেন্সে যার প্রকার একই শ্রেণি:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
    4. একটি রেফারেন্স যার টাইপ পিতা বা মাতা বর্গ হয় এবং এটি উপর ভিতরে প্যাকেজ যেখানে foo()সংজ্ঞায়িত করা হয় ( fatherpackage) [এ প্রসঙ্গে ভিতরে কোন অন্তর্ভুক্ত করা যেতে পারে। 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
  • নিম্নলিখিত পরিস্থিতিতে বৈধ নয়।

    1. একটি রেফারেন্সে যার প্রকারটি প্যারেন্ট ক্লাস এবং এটি প্যাকেজের বাইরে যেখানে foo()সংজ্ঞায়িত হয়েছে ( fatherpackage):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
    2. সাবক্লাসের প্যাকেজের অভ্যন্তরে একটি অ-সাবক্লাস (একটি সাবক্লাস তার পিতামাতার কাছ থেকে সুরক্ষিত সদস্যদের উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এটি তাদের সাব-ক্লাসে ব্যক্তিগত করে তোলে):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }

Object#clone()একটি protectedসদস্য উদাহরণ ।
ইঞ্জি। ফুয়াদ

করার super.foo()এবং প্রথম অবৈধ পরিস্থিতির মধ্যে পার্থক্য কী f.foo()?
cst1992

1
@ সিএসটি ১৯৯২ এটি বিভ্রান্তিকর তবে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন .6..2.২ দেখুন: "কোনও বস্তুর সুরক্ষিত সদস্য বা নির্মাতাকে প্যাকেজের বাইরে থেকে অ্যাক্সেস করা যেতে পারে যা কেবলমাত্র সেই কোড দ্বারা ঘোষিত হয় যা সেই বস্তুর প্রয়োগের জন্য দায়ী"। সুপার.ফু () সহ "সুপার" রেফারেন্সটি "বাস্তবায়নের জন্য সরাসরি দায়বদ্ধ" তবে "চ" রেফারেন্সটি হয় না। কেন? কারণ আপনি 100% নিশ্চিত হতে পারেন যে "সুপার" টাইপ ফাদারের, তবে "চ" এর জন্য নয়; রান-টাইমে এটি ফাদারের অন্য কোনও উপ-ধরণের হতে পারে। দেখুন docs.oracle.com/javase/specs/jls/se9/html/...
skomisa

1
যে কেউ বোঝে তার কাছ থেকে একটি উত্তর পড়ে তা সতেজ হয় protected। দুর্ভাগ্যক্রমে, এই পৃষ্ঠার অন্যান্য সমস্ত উত্তর যা সংজ্ঞায়িত করে protectedএটি কিছুটা ভুল হয়ে যায়।
দাউদ ইবনে করিম

30

ব্যক্তিগত

  • পদ্ধতি, ভেরিয়েবল এবং কনস্ট্রাক্টর

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

  • ক্লাস এবং ইন্টারফেস

ব্যক্তিগত অ্যাক্সেস মডিফায়ার সবচেয়ে সীমাবদ্ধ অ্যাক্সেস স্তর। ক্লাস এবং ইন্টারফেস ব্যক্তিগত হতে পারে না।

বিঃদ্রঃ

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


রক্ষিত

  • ক্লাস এবং ইন্টারফেস

সুরক্ষিত অ্যাক্সেস মডিফায়ার ক্লাস এবং ইন্টারফেসে প্রয়োগ করা যাবে না।

পদ্ধতি, ক্ষেত্রগুলি সুরক্ষিত হিসাবে ঘোষণা করা যেতে পারে, তবে কোনও ইন্টারফেসের পদ্ধতি এবং ক্ষেত্রগুলি সুরক্ষিত হিসাবে ঘোষণা করা যায় না।

বিঃদ্রঃ

সুরক্ষিত অ্যাক্সেস সাবক্লাসকে সাহায্যকারী পদ্ধতি বা পরিবর্তনশীলটি ব্যবহার করার সুযোগ দেয়, যখন কোনও নন-রিলেটেড শ্রেণিকে এটি ব্যবহারের চেষ্টা থেকে বিরত করে।


প্রকাশ্য

ঘোষিত শ্রেণি, পদ্ধতি, নির্মাণকারী, ইন্টারফেস ইত্যাদি জনসাধারণ অন্য যে কোনও শ্রেণীর থেকে অ্যাক্সেস করা যায়।

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

  • বিভিন্ন প্যাকেজ

তবে আমরা যে সার্বজনীন শ্রেণীর অ্যাক্সেসের চেষ্টা করছি সেগুলি যদি অন্য প্যাকেজে থাকে, তবে পাবলিক বর্গটি এখনও আমদানি করা দরকার।

শ্রেণীর উত্তরাধিকারের কারণে, কোনও শ্রেণীর সমস্ত পাবলিক পদ্ধতি এবং ভেরিয়েবলগুলি এর সাবক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত।


ডিফল্ট-কোনও কীওয়ার্ড:

ডিফল্ট অ্যাক্সেস মডিফায়ার মানে আমরা শ্রেণি, ক্ষেত্র, পদ্ধতি ইত্যাদির জন্য স্পষ্টভাবে অ্যাক্সেস মডিফায়ারটি ঘোষণা করি না

  • একই প্যাকেজগুলির মধ্যে

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

বিঃদ্রঃ

আমরা স্ট্যাটিক ক্ষেত্রগুলিকে ওভাররাইড করতে পারি না if আপনি যদি ওভাররাইড করার চেষ্টা করেন তবে এটি কোনও ত্রুটি দেখায় না তবে এটি আমাদের ব্যতীত কাজ করে না।

সম্পর্কিত উত্তর

রেফারেন্স লিঙ্ক

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspPoint.com/java/java_access_modifiers.htm


21

পার্থক্যটি ইতিমধ্যে সরবরাহিত লিঙ্কগুলিতে পাওয়া যেতে পারে তবে কোনটি ব্যবহার করা হয় তা সাধারণত "সর্বনিম্ন জ্ঞানের নীতিমালায়" আসে। শুধুমাত্র প্রয়োজনীয় ন্যূনতম দৃশ্যমানতার অনুমতি দিন।


20

ব্যক্তিগত : কেবলমাত্র ক্লাসে সীমাবদ্ধ অ্যাক্সেস

ডিফল্ট (কোনও সংশোধক নেই) : শ্রেণি এবং প্যাকেজটিতে সীমিত অ্যাক্সেস

সুরক্ষিত : শ্রেণি, প্যাকেজ এবং উপশ্রেণীর সীমিত অ্যাক্সেস (প্যাকেজের ভিতরে এবং বাইরে উভয়ই)

সর্বজনীন : শ্রেণি, প্যাকেজ (সমস্ত) এবং উপশ্রেণীর অ্যাক্সেসযোগ্য ... সংক্ষেপে, সর্বত্র।


17

বিভিন্ন স্তরে অ্যাক্সেস সীমাবদ্ধ করতে অ্যাক্সেস মডিফায়ারগুলি রয়েছে।

সর্বজনীন: এটি মূলত যতটা সহজ আপনি যে কোনও শ্রেণি থেকে অ্যাক্সেস করতে পারবেন তা একই প্যাকেজে রয়েছে কিনা whether

আপনি যদি একই প্যাকেজটিতে থাকেন তবে অ্যাক্সেস করতে আপনি সরাসরি অ্যাক্সেস করতে পারবেন তবে আপনি যদি অন্য প্যাকেজটিতে থাকেন তবে আপনি শ্রেণীর কোনও অবজেক্ট তৈরি করতে পারেন।

ডিফল্ট: এটি প্যাকেজের শ্রেণীর যে কোনও থেকে একই প্যাকেজে অ্যাক্সেসযোগ্য।

অ্যাক্সেস করতে আপনি ক্লাসের একটি অবজেক্ট তৈরি করতে পারেন। তবে আপনি প্যাকেজের বাইরে এই ভেরিয়েবলটি অ্যাক্সেস করতে পারবেন না।

সুরক্ষিত: আপনি একই প্যাকেজে ভেরিয়েবলের পাশাপাশি অন্য যে কোনও প্যাকেজে সাবক্লাস অ্যাক্সেস করতে পারেন। সুতরাং মূলত এটি ডিফল্ট + উত্তরাধিকারী আচরণ।

বেস ক্লাসে সংজ্ঞায়িত সুরক্ষিত ক্ষেত্র অ্যাক্সেস করতে আপনি শিশু শ্রেণির অবজেক্ট তৈরি করতে পারেন।

ব্যক্তিগত: এটি একই শ্রেণিতে অ্যাক্সেস হতে পারে।

অ স্থির পদ্ধতিতে আপনি সরাসরি এই রেফারেন্সের কারণে (কনস্ট্রাক্টরগুলিতে) অ্যাক্সেস করতে পারেন তবে স্থির পদ্ধতিতে অ্যাক্সেসের জন্য আপনাকে শ্রেণীর অবজেক্ট তৈরি করতে হবে।


16

জাভাতে অ্যাক্সেস মডিফায়ারগুলি।

জাভা অ্যাক্সেস মডিফায়ারগুলি জাভায় অ্যাক্সেস নিয়ন্ত্রণ সরবরাহ করতে ব্যবহৃত হয়।

1. ডিফল্ট:

ক্লাসে কেবল একই প্যাকেজে অ্যাক্সেসযোগ্য।

উদাহরণ স্বরূপ,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

এই অ্যাক্সেসটি জনসাধারণের চেয়ে সুরক্ষিত এবং সুরক্ষিত তবে ব্যক্তিগতের চেয়ে কম সীমাবদ্ধ।

2. জনসাধারণ

যে কোনও জায়গা থেকে অ্যাক্সেস করা যায়। (গ্লোবাল অ্যাক্সেস)

উদাহরণ স্বরূপ,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

আউটপুট: হ্যালো

3. ব্যক্তিগত

কেবল একই শ্রেণীর ভিতরে প্রবেশযোগ্য।

আপনি যদি অন্য শ্রেণীর এক শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেস করার চেষ্টা করেন তবে সংকলন ত্রুটি নিক্ষেপ করবে। উদাহরণ স্বরূপ,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. সুরক্ষিত

কেবল একই প্যাকেজের ক্লাসে এবং সাবক্লাসে অ্যাক্সেসযোগ্য

উদাহরণ স্বরূপ,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

আউটপুট: হ্যালো

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


14
  • সর্বজনীন - অ্যাপ্লিকেশনের যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য।

  • ডিফল্ট - প্যাকেজ থেকে অ্যাক্সেসযোগ্য।

  • সুরক্ষিত - প্যাকেজ এবং অন্যান্য প্যাকেজের সাব-ক্লাস থেকে অ্যাক্সেসযোগ্য। যেমন

  • ব্যক্তিগত - এটির শ্রেণি থেকে কেবল অ্যাক্সেসযোগ্য।


14

প্যাকেজের জন্য দৃশ্যমান। ডিফল্ট. কোনও সংশোধক প্রয়োজন হয় না।

ক্লাসে কেবল দৃশ্যমান ( ব্যক্তিগত )।

বিশ্বের কাছে দৃশ্যমান ( সর্বজনীন )।

প্যাকেজ এবং সমস্ত সাবক্লাসে দৃশ্যমান ( সুরক্ষিত )।

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

String name = "john";

public int age(){
    return age;
}

ব্যক্তিগত প্রবেশাধিকার সংশোধক - ব্যক্তিগত:

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

বেসরকারী হিসাবে ঘোষিত চলকগুলি ক্লাসে পাবলিক গেটর পদ্ধতি উপস্থিত থাকলে শ্রেণীর বাইরে প্রবেশ করা যায়।

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

উদাহরণ:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

পাবলিক অ্যাক্সেস মডিফায়ার - সর্বজনীন:

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

তবে, আমরা যে সার্বজনীন শ্রেণিতে অ্যাক্সেসের চেষ্টা করছি সেগুলি যদি অন্য প্যাকেজে থাকে, তবে পাবলিক বর্গটি এখনও আমদানি করা দরকার।

শ্রেণীর উত্তরাধিকারের কারণে, কোনও শ্রেণীর সমস্ত পাবলিক পদ্ধতি এবং ভেরিয়েবলগুলি এর সাবক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত।

উদাহরণ:

public void cal(){

}

সুরক্ষিত অ্যাক্সেস মডিফায়ার - সুরক্ষিত:

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

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

সুরক্ষিত অ্যাক্সেস সাবক্লাসকে সাহায্যকারী পদ্ধতি বা পরিবর্তনশীলটি ব্যবহার করার সুযোগ দেয়, যখন কোনও নন-রিলেটেড শ্রেণিকে এটি ব্যবহারের চেষ্টা থেকে বিরত করে।

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

12

এই পৃষ্ঠাটি সুরক্ষিত ও ডিফল্ট অ্যাক্সেস সংশোধক সম্পর্কে ভাল লিখেছে

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

তবে এই সুরক্ষিত সদস্যরা "কেবল উত্তরাধিকারের মাধ্যমে প্যাকেজের বাইরে অ্যাক্সেসযোগ্য"। অর্থাত্ আপনি অন্য শ্রেণীর কোনও প্যাকেজে উপস্থিত উপ-শ্রেণীর কোনও শ্রেণীর কোনও সুরক্ষিত সদস্যকে সরাসরি অ্যাক্সেস করতে পারেন যেন সেই সদস্যটি নিজেই সাবক্লাসে উপস্থিত থাকে। তবে সেই সুরক্ষিত সদস্য প্যারেন্ট ক্লাসের রেফারেন্স ব্যবহার করে প্যাকেজের বাইরে সাবক্লাসে অ্যাক্সেসযোগ্য হবে না। ....


কেবল এটি যুক্ত করতে "একবার বাচ্চা পিতামাতার শ্রেণীর সুরক্ষিত সদস্যের অ্যাক্সেস পাওয়ার পরে এটি ব্যক্তিগত হয়ে যায় (বা বরং আমি একটি বিশেষ বেসরকারী সদস্য বলতে পারি যা সাবক্লাসের সাবক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে) সাবক্লাসের সদস্য)।
আনন্দ

9

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

সময়ের সাথে সাথে আপনি কখন একটি ক্লাসকে প্যাকেজ-প্রাইভেট তৈরি করবেন এবং কখন সাবক্লাসে ব্যবহারের জন্য সুরক্ষিত কিছু পদ্ধতি ঘোষণা করবেন সে সম্পর্কে আপনার ধারণা তৈরি হবে।


6

দ্রষ্টব্য: এটি গৃহীত উত্তরের জন্য কেবলমাত্র পরিপূরক

এটি জাভা অ্যাক্সেস মোডিফায়ারগুলির সাথে সম্পর্কিত ।

থেকে জাভা অ্যাক্সেস সংশোধনকারীদের :

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

  • তালিকাবদ্ধ
  • ব্যক্তিগত
  • ডিফল্ট (প্যাকেজ)
  • রক্ষিত
  • প্রকাশ্য

কোনও ক্লাস টিউটোরিয়ালের সদস্যদের অ্যাক্সেস নিয়ন্ত্রণ থেকে :

অ্যাক্সেস লেভেল মডিফায়াররা নির্ধারণ করে যে অন্যান্য শ্রেণি একটি নির্দিষ্ট ক্ষেত্র ব্যবহার করতে পারে বা একটি নির্দিষ্ট পদ্ধতিতে প্রার্থনা করতে পারে। অ্যাক্সেস নিয়ন্ত্রণের দুটি স্তর রয়েছে:

  • শীর্ষ স্তরে - পাবলিক, বা প্যাকেজ-ব্যক্তিগত (কোনও স্পষ্টত পরিবর্তক নেই)।
  • সদস্য স্তরে - পাবলিক, প্রাইভেট, সুরক্ষিত, বা প্যাকেজ-প্রাইভেট (কোনও স্পষ্টত কোনও পরিবর্তনকারী নেই)।

সংশোধক জনসাধারণের সাথে কোনও শ্রেণি ঘোষণা করা যেতে পারে, সেই ক্ষেত্রে সেই শ্রেণিটি সর্বত্র সমস্ত শ্রেণীর কাছে দৃশ্যমান। যদি কোনও শ্রেণীর কোনও সংশোধক না থাকে (ডিফল্ট, এটি প্যাকেজ-প্রাইভেট নামেও পরিচিত), তবে এটি কেবল তার নিজস্ব প্যাকেজের মধ্যেই দৃশ্যমান

নিম্নলিখিত টেবিলটি প্রতিটি সংশোধক দ্বারা অনুমোদিত সদস্যদের অ্যাক্সেস দেখায়।

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
 Modifier     Class  Package  Subclass  World 
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
 public       Y      Y        Y         Y     
 protected    Y      Y        Y         N     
 no modifier  Y      Y        N         N     
 private      Y      N        N         N     
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

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

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


1
পরিপূরকটি আসলে কী, এবং কেন এটি বিদ্যমান পোস্টে সম্পাদনা নয়?
সেপ্টেম্বর

পরিপূরক হ'ল এক্সেস মোডিফায়ার। একটি সম্পাদনা হয় না কেন? Answerতিহাসিক স্বার্থে গ্রহণযোগ্য উত্তরটি অবিচ্ছিন্ন রাখতে এবং আমার উত্তর দেওয়ার জন্য।
25 אוהב אותך

5

সর্বজনীন সুরক্ষিত ডিফল্ট এবং ব্যক্তিগত হ'ল অ্যাক্সেস মডিফায়ার।

এগুলি এনক্যাপসুলেশন বা গোপন এবং শ্রেণীর বিষয়বস্তু প্রদর্শনের জন্য।

  1. শ্রেণি সর্বজনীন বা ডিফল্ট হতে পারে
  2. শ্রেণীর সদস্যরা পাবলিক, সুরক্ষিত, ডিফল্ট বা ব্যক্তিগত হতে পারে।

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

সাধারণত, সদস্য ভেরিয়েবলগুলি ব্যক্তিগতভাবে সংজ্ঞায়িত করা হয় তবে সদস্য পদ্ধতিগুলি সর্বজনীন।


Defaultকোনও অ্যাক্সেস মডিফায়ার নয় এবং অন্য দু'জনের মধ্যে ভুল গণ্ডি রয়েছে।
ব্যবহারকারী 207421

5

প্রায়শই আমি বুঝতে পেরেছি যে কোনও ভাষার মৌলিক ধারণাগুলি স্মরণ করা বাস্তব-বিশ্বের উপমা তৈরি করেই সম্ভব হতে পারে। জাভাতে অ্যাক্সেস সংশোধক বোঝার জন্য এখানে আমার সাদৃশ্যটি রয়েছে:

ধরে নেওয়া যাক আপনি কোনও বিশ্ববিদ্যালয়ের একজন শিক্ষার্থী এবং আপনার একটি বন্ধু আছে যা সপ্তাহান্তে আপনার সাথে দেখা করতে আসবে। মনে করুন ক্যাম্পাসের মাঝখানে বিশ্ববিদ্যালয়ের প্রতিষ্ঠাতার একটি বড় মূর্তি রয়েছে।

  • আপনি যখন তাকে ক্যাম্পাসে নিয়ে আসেন, আপনি এবং আপনার বন্ধু যেটি প্রথম দেখেন তা হ'ল এই মূর্তি। এর অর্থ হ'ল যে কেউ ক্যাম্পাসে হাঁটেন তিনি বিশ্ববিদ্যালয়ের অনুমতি ব্যতীত মূর্তিটি দেখতে পারেন। এটি মূর্তিটিকে তৈরি করে পাবলিক

  • এর পরে, আপনি আপনার বন্ধুকে আপনার আস্তানায় নিয়ে যেতে চান, তবে তার জন্য আপনাকে তাকে দর্শনার্থী হিসাবে নিবন্ধিত করতে হবে। এর অর্থ হ'ল তিনি ক্যাম্পাসের বিভিন্ন ভবনে প্রবেশের জন্য একটি অ্যাক্সেস পাস (যা আপনার মত একই)। এটি তার অ্যাক্সেস কার্ড হিসাবে তৈরি করবে সুরক্ষিত

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

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

আশাকরি এটা সাহায্য করবে!


4

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

public-> যে
privateকোনও জায়গা থেকে অ্যাক্সেসযোগ্য -> যেখানে ঘোষণা করা হয়েছে কেবল একই শ্রেণীর মধ্যে অ্যাক্সেসযোগ্য

এখন বিভ্রান্তি দেখা দেয় যখন এটা আসে defaultএবংprotected

default-> কোনও অ্যাক্সেস মডিফায়ার কীওয়ার্ড উপস্থিত নেই। এর অর্থ এটি শ্রেণীর প্যাকেজের মধ্যে কঠোরভাবে উপলব্ধ। এই প্যাকেজের বাইরে কোথাও এটি অ্যাক্সেস করা যায় না।

protected-> defaultএকই প্যাকেজ ক্লাসের চেয়ে সামান্য কম কঠোর এবং পৃথক পৃথকভাবে এটি ঘোষিত প্যাকেজের বাইরে সাব ক্লাস দ্বারা অ্যাক্সেস করা যায় ।


4

জাভা অ্যাক্সেস যা আপনি ব্যবহার করতে পারেন তা পরিবর্তন করে

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

অ্যাক্সেস পরিবর্তক জন্য প্রযোজ্য হতে পারে class, field[সম্বন্ধে] , method। এটি অ্যাক্সেস, সাবক্লাস বা ওভাররাইড করার চেষ্টা করুন।

  • অ্যাক্সেস fieldবা methodএর মাধ্যমে হয়class
  • উত্তরাধিকার। উত্তরসূরি class(সাবক্লাস) অ্যাক্সেস মডিফায়ার যে কোনও হতে পারে। উত্তরাধিকারী method(ওভাররাইড) অ্যাক্সেস মডিফায়ারটি একই হওয়া বা এটি প্রসারিত হওয়া উচিত

শীর্ষ স্তরের শ্রেণি (প্রথম স্তরের সুযোগ) হতে পারে publicএবং defaultNested class[সম্পর্কে] তাদের যে কোনও একটি থাকতে পারে

package প্যাকেজ শ্রেণিবিন্যাসের জন্য প্রযোজ্য নয়

সুইফট অ্যাক্সেস পরিবর্তনকারী iers


2

এগুলি সমস্ত এনক্যাপসুলেশন সম্পর্কে (বা জো ফিলিপস হিসাবে বলা হয়েছে, কম জ্ঞান হিসাবে )।

সর্বাধিক সীমাবদ্ধ (প্রাইভেট) দিয়ে শুরু করুন এবং দেখুন আপনার পরে কম সীমাবদ্ধ সংশোধক প্রয়োজন কিনা।

আমরা সকলেই ব্যক্তিগত এবং জনসাধারণের মতো পদ্ধতি এবং সদস্য সংশোধক ব্যবহার করি ... তবে খুব কম বিকাশকারী একটি কাজ হ'ল কোডটি যুক্তিযুক্তভাবে সাজানোর জন্য প্যাকেজগুলি ব্যবহার করে ।

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

Outside world -> Package (SecurityEntryClass ---> Package private classes)

আরেকটি বিষয় হ'ল যে ক্লাসগুলি একে অপরের উপর অনেক বেশি নির্ভর করে একই প্যাকেজে শেষ হতে পারে এবং নির্ভরতা খুব দৃ ref় হলে অবশেষে রিফ্যাক্টর বা সংহত হতে পারে।

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


2

ব্যক্তিগত-সুরক্ষিত-সর্বজনীন নিখুঁত-উপমা-জন্য-পরিবর্তনশীল-ডেটা-ধরনের

ব্লক ডায়াগ্রাম কিভাবে ব্যাখ্যা ডাটা সদস্যদের অনুসরণ বেস বর্গ হয় উত্তরাধিকারসূত্রে যখন উদ্ভূত বর্গ এক্সেস মোড ব্যক্তিগত

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

দ্রষ্টব্য: ব্যক্তিগত অ্যাক্সেস স্পেসিফায়ারের সাথে ডেটা সদস্যদের ঘোষণা করা ডেটা লুকানো হিসাবে পরিচিত

উত্স: অ্যাক্সেস স্পেসিফায়ার - ব্যক্তিগত, প্রকাশ্য এবং সুরক্ষিত


1
প্রশ্নটি জাভা সম্পর্কে ছিল, সি ++ নয়।
বেনোইট

1
@ বেনোইট তবে আমি যা পোস্ট করেছি, ছবিগুলি বিশেষতঃ উভয়ের জন্য একই নয়: জাভা এবং সি ++? এই নিয়মগুলিও জাভাটির জন্য প্রয়োগ হচ্ছে না? ধন্যবাদ
লিওনিডা

2
সি ++ তে মাত্র 3 টি সংশোধক রয়েছে, যখন জাভাতে 4 জন রয়েছে।
বেনোইট

1
উপমাটি ভাল, তবে ডিফল্ট অ্যাক্সেস স্পেসিফায়ার অনুপস্থিত,
এমএসএস

1
ওপি প্রশ্নটি জিজ্ঞাসা করলেন "জাভাতে পাবলিক, সুরক্ষিত, প্যাকেজ-প্রাইভেট এবং প্রাইভেটের মধ্যে পার্থক্য কী?"
জেএল_এসও

2

আমার দুই সেন্ট :)

ব্যক্তিগত:

শ্রেণী -> একটি শীর্ষ স্তরের শ্রেণি ব্যক্তিগত হতে পারে না। অভ্যন্তরীণ ক্লাসগুলি ব্যক্তিগত হতে পারে যা একই বর্গ থেকে অ্যাক্সেসযোগ্য।

উদাহরণ পরিবর্তনশীল -> ক্লাসে কেবল অ্যাক্সেসযোগ্য। ক্লাসের বাইরে অ্যাক্সেস করতে পারবেন না।

প্যাকেজ-ব্যক্তিগত:

শ্রেণী -> একটি শীর্ষ স্তরের শ্রেণি প্যাকেজ-ব্যক্তিগত হতে পারে। এটি কেবল একই প্যাকেজ থেকে অ্যাক্সেসযোগ্য। সাব প্যাকেজ থেকে নয়, বাইরের প্যাকেজ থেকে নয়।

উদাহরণ পরিবর্তনশীল -> একই প্যাকেজ থেকে অ্যাক্সেসযোগ্য। সাব প্যাকেজ থেকে নয়, বাইরের প্যাকেজ থেকে নয়।

সংরক্ষিত:

শ্রেণী -> একটি শীর্ষ স্তরের শ্রেণি সুরক্ষিত করা যায় না।

উদাহরণ পরিবর্তনশীল -> একই প্যাকেজ বা সাবপ্যাকেজে কেবল অ্যাক্সেসযোগ্য। ক্লাস বাড়ানোর সময় কেবল প্যাকেজের বাইরে অ্যাক্সেস থাকতে পারে।

প্রকাশ্য:

শ্রেণী -> প্যাকেজ / সাবপ্যাকেজ / অন্য প্যাকেজ থেকে অ্যাক্সেসযোগ্য

উদাহরণ পরিবর্তনশীল -> প্যাকেজ / সাবপ্যাকেজ / অন্য প্যাকেজ থেকে অ্যাক্সেসযোগ্য

এখানে বিস্তারিত উত্তর দেওয়া আছে

https://github.com/junto06/java-4-beginners/blob/master/basics/access-modifier.md


1
  • প্রকাশ্য

    যদি কোনও শ্রেণীর সদস্য জনসাধারণের সাথে ঘোষণা করা হয় তবে এটি যে কোনও জায়গা থেকে অ্যাক্সেস করা যেতে পারে

  • রক্ষিত

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

  • ডিফল্ট

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

  • ব্যক্তিগত

    যদি কোনও শ্রেণীর সদস্যকে কীওয়ার্ড সুরক্ষিত দিয়ে ঘোষণা করা হয় তবে এক্ষেত্রে এটি কেবল একই শ্রেণীর সদস্যদের কাছে উপলব্ধ


-1

জাভাতে অ্যাক্সেস স্পেসিফায়ার্স: জাভাতে 4 টি অ্যাক্সেস স্পেসিফায়ার রয়েছে, নামটি ব্যক্তিগত, প্যাকেজ-প্রাইভেট (ডিফল্ট), সুরক্ষিত এবং অ্যাক্সেস ক্রমবর্ধমান পাবলিক।

ব্যক্তিগত : আপনি যখন কোনও শ্রেণি বিকাশ করছেন এবং আপনি চান এই শ্রেণীর সদস্য এই শ্রেণীর বাইরে প্রকাশিত না হয় তখন আপনার এটিকে ব্যক্তিগত হিসাবে ঘোষণা করা উচিত। ব্যক্তিগত সদস্যরা কেবলমাত্র ক্লাসে অ্যাক্সেস করতে পারবেন যেখানে তাদের সংজ্ঞায়িত করা হয়েছে অর্থাৎ ক্লোজিং ক্লাস। ব্যক্তিগত সদস্যদের এই 'রেফারেন্স' রেফারেন্সে এবং ক্লাসের অন্যান্য সদস্যদের এই সদস্যদের ঘিরে রাখার ক্ষেত্রে ব্যবহার করা যেতে পারে তবে কেবল এই শ্রেণীর সংজ্ঞা অনুসারে।

প্যাকেজ-বেসরকারী (ডিফল্ট) : এই অ্যাক্সেস স্পেসিফায়ারটি নীচে বর্ণিত অ্যাক্সেসের পাশাপাশি ব্যক্তিগত অ্যাক্সেস স্পেসিফায়ার দ্বারা নির্দিষ্ট অ্যাক্সেস সরবরাহ করবে।

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

মূলত, একই প্যাকেজের মধ্যে আপনি ডিফল্ট সদস্যদের ক্লাসের উদাহরণে সরাসরি বা সাবক্লাসে 'এটি' রেফারেন্সে অ্যাক্সেস করতে পারেন।

সুরক্ষিত : এই অ্যাক্সেস স্পেসিফায়ার নীচে বর্ণিত অ্যাক্সেসের পাশাপাশি প্যাকেজ-ব্যক্তিগত অ্যাক্সেস স্পেসিফায়ার দ্বারা নির্দিষ্ট অ্যাক্সেস সরবরাহ করবে।

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

দয়া করে নোট করুন:

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

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

সর্বজনীন : এই অ্যাক্সেস স্পেসিফায়ার নীচে বর্ণিত অ্যাক্সেসের পাশাপাশি সুরক্ষিত অ্যাক্সেস স্পেসিফায়ার দ্বারা নির্দিষ্ট অ্যাক্সেস সরবরাহ করবে।

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

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