আমরা কেন একটি শ্রেণি সংজ্ঞায়িত করতে পারি না protected
?
আমি জানি যে আমরা পারব না, তবে কেন? কিছু নির্দিষ্ট কারণ থাকতে হবে।
আমরা কেন একটি শ্রেণি সংজ্ঞায়িত করতে পারি না protected
?
আমি জানি যে আমরা পারব না, তবে কেন? কিছু নির্দিষ্ট কারণ থাকতে হবে।
উত্তর:
কারণ এটি কোনও বোধগম্য নয়।
সুরক্ষিত শ্রেণীর সদস্য (পদ্ধতি বা ভেরিয়েবল) হ'ল প্যাকেজ-প্রাইভেট (ডিফল্ট ভিজিবিলিটি) এর মতো, এটি সাব-ক্লাস থেকেও অ্যাক্সেস করা যায়।
যেহেতু জাভাতে 'সাবপ্যাকেজ' বা 'প্যাকেজ-উত্তরাধিকার' এর মতো কোনও ধারণা নেই, শ্রেণি সুরক্ষিত বা প্যাকেজ-ব্যক্তিগত হিসাবে ঘোষণা করা একই জিনিস।
যদিও আপনি নেস্টেড এবং অভ্যন্তরীণ ক্লাসগুলি সুরক্ষিত বা ব্যক্তিগত হিসাবে ঘোষণা করতে পারেন।
open
কোটলিনে যা বর্তমান প্যাকেজের বাইরে সাবক্লাসিংয়ের অনুমতি দেয় ( protected
বিপরীত ডিফল্টর সাথে জাভাতে কেউ এটি রোধ করতে পারে ) imagine
যেমন আপনি জানেন যে ডিফল্টটি প্যাকেজ স্তরের অ্যাক্সেসের জন্য এবং সুরক্ষিত এটি প্যাকেজ স্তর প্লাস নন-প্যাকেজ ক্লাসের জন্য তবে যা এই শ্রেণিটি প্রসারিত করে (এখানে লক্ষ্য করার মতো বিষয়টি আপনি ক্লাসটি কেবল দৃশ্যমান হলেই প্রসারিত করতে পারবেন!)। আসুন এটি এইভাবে রাখুন:
যেহেতু এই শ্রেণিকে কেবল কয়েকটি শ্রেণি দ্বারা উপ-শ্রেণিবদ্ধ করার সীমাবদ্ধ করার কোনও উপায় নেই (আমরা প্যাকেজের / প্যাকেজের বাইরে উপলব্ধ সমস্ত শ্রেণীর মধ্যে কেবল কয়েকটি শ্রেণীর দ্বারা বংশগত হওয়া সীমাবদ্ধ করতে পারি না), সুরক্ষিত অ্যাক্সেস স্পেসিফায়ারগুলির কোনও ব্যবহার নেই শীর্ষ স্তরের ক্লাসের জন্য। সুতরাং এটি অনুমোদিত নয়।
public class A
{
protected class B
{
}
}
@ নিকিতা রাইব্যাক উত্তর ভালো পয়েন্ট রয়েছে তবে বিশদের অভাবে, আমি নিজেকে গভীরভাবে চিন্তা না করেই ধারণাটি পেতে পারি না, নিম্নলিখিতটি আমি যা ভেবেছিলাম এবং এখন তার কারণটি আমার পুরোপুরি বুঝতে হবে।
চারটি অ্যাক্সেস মডিফায়ার, ধরুন প্রথম স্তরটি সর্বজনীন এবং চতুর্থ স্তরটি ব্যক্তিগত (এই টেবিলের ভিত্তিতে) ক্রমানুসারে )। প্রথম জিনিসটি আমাদের জানা উচিত যে ক্লাসটি শীর্ষ স্তরে ব্যক্তিগত হিসাবে সংজ্ঞায়িত করা যায় না।
সুতরাং যদি "প্রাইভেট ক্লাস ফু" (কোনও প্রাইভেট সদস্য সংজ্ঞায়িত, অর্থাৎ শ্রেণি নিজেই একজন সদস্য) অনুমতি দেয় তবে বাহ্যিক (যা সদস্য রয়েছে) কী? ফাইলের সুযোগ? না, ফাইল বহিরাগত অর্থহীন কারণ একক ফাইলে এমনকি একাধিক ক্লাস পৃথক শ্রেণীর ফাইলগুলিতে সংকলিত হবে। সুতরাং বাহ্যিক প্যাকেজ হয় । তবে তৃতীয় স্তরের ডিফল্ট অ্যাক্সেস সংশোধকটির অর্থ ইতিমধ্যে "প্যাকেজ-ব্যক্তিগত "। সুতরাং চতুর্থ স্তরের ব্যক্তিগত অ্যাক্সেস মডিফায়ার ব্যবহার / অনুমোদিত হবে না।
তবে নেস্টেড প্রাইভেট ক্লাস অনুমতি দেয় কারণ ডাইরেক্ট বাইরের ক্লাস, প্যাকেজ নয়, যেমন :
class PrivateNestedMain {
private static class Inner {
public static void main(String[] args) {
System.out.println("Hello from Inner!");
}
}
}
এখন যদি "সুরক্ষিত শ্রেণি ফু" অনুমতি দেয়? সুরক্ষিত মূল বৈশিষ্ট্য হ'ল সাবক্লাস, সুতরাং বাইরের (প্যাকেজ) অবশ্যই (আপ-টু স্কোপ কারণে, তবে এটি alচ্ছিক ) সাবক্লাসের স্টাইল সরবরাহ করে , যেমন সাব-প্যাকেজ, বা package A extends package B
, তবে আমরা এরকম কোনও কিছুই জানি না। সুতরাং সুরক্ষিত শীর্ষ স্তরে পূর্ণ সম্ভাবনা (প্রধান ক্ষেত্রটি সাবক্লাস-প্রশস্ত) ব্যবহার করতে পারে না যা বাহ্যিকটি প্যাকেজ (যেমন কোনও উপ-প্যাকেজ জিনিস নয়) তবে সুরক্ষিত নেস্টেড শ্রেণিতে সম্পূর্ণ সম্ভাবনা ব্যবহার করতে পারে যা বাহ্যিক শ্রেণি ( অর্থাৎ সাবক্লাস হতে পারে) :
class ProtectedNestedMain {
protected static class Inner {
public static void main(String[] args) {
System.out.println("Hello from Inner!");
}
}
}
মনে রাখবেন, উপরে বলেন, "পূর্ণ সম্ভাবনা ব্যবহার করতে পারবেন না" কারণে এটা উপশ্রেণী ব্যাপী পৌঁছতে পারে না নিছক কোন বাইরের উপশ্রেণী, মানে যে কারণ আসলে সংরক্ষিত অনুমতি যাবে , এটা এড়ানোর জন্য পছন্দের শুধু একটি ব্যাপার প্যাকেজের কাজ প্রতিলিপি সাব-ক্লাস-সক্ষম না হলে বাহ্যিক , নীচে দেখুন।
আমার বিভ্রান্তি মূলত https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html এ বিখ্যাত টেবিলের কারণে ঘটেছিল :
যদি প্রথম স্তর (পাবলিক) এবং তৃতীয় স্তরের (প্যাকেজ-প্রাইভেট) অনুমতি দেওয়া হয় তবে পৃথিবীতে কীভাবে দ্বিতীয় স্তরের (সুরক্ষিত) অনুমতি দেওয়া হচ্ছে না?
সর্বজনীন সমর্থন সাবক্লাস বিভ্রান্তিমূলক সহজ। এই টেবিলটি পড়ার সঠিক উপায়
বাহ্যিকের সাবক্লাস বৈশিষ্ট্য থাকলে জনসাধারণের সমর্থন সাবক্লাস।
একই বিভ্রান্তিকরটি প্যাকেজ-প্রাইভেটের ক্ষেত্রে প্রযোজ্য, প্যাকেজ-প্রাইভেট সাবক্লাসকে সমর্থন করে না ( সেল ইন এন ) এর অর্থ এই নয় যে সাবক্লাস ধারণাটি বাইরের ক্ষেত্রে প্রয়োগ হয়।
এর মানে হল, আমরা উপেক্ষা করা উচিত উপশ্রেণী কলাম যদি উপশ্রেণী বৈশিষ্ট্য বাইরের পাওয়া যায় না:
আমরা এখন দেখতে পাচ্ছি, সুরক্ষিত এবং প্যাকেজ-প্রাইভেট উভয়ই এখন একই স্তরের ( ওয়াইওয়াইএন ), কেন মধ্যবর্তী স্তরের ক্ষেত্রে অনুমতি দেওয়া হচ্ছে না তা নিয়ে আর কোনও বিভ্রান্তি নেই। সামগ্রিকভাবে, জাভা বিভ্রান্তি এড়াতে সুরক্ষিত কেবল প্যাকেজ-ব্যক্তিগত বেছে নেবে ( এটি কেবল পছন্দের বিষয় , তবে সুরক্ষিত মূল বৈশিষ্ট্যটি সাবক্লাস, তাই প্যাকেজ-ব্যক্তিগত উচ্চতর) এবং ফলস্বরূপ , শীর্ষ স্তরে কেবলমাত্র 2 টি অ্যাক্সেস সংশোধক অনুমোদিত:
শীর্ষ স্তরে - পাবলিক, বা প্যাকেজ-ব্যক্তিগত (কোনও স্পষ্টত পরিবর্তনকারী নেই)।
সুরক্ষিত ক্ষেত্রের সংজ্ঞা দেওয়া সেই ক্ষেত্রটিকে প্যাকেজের অভ্যন্তরের পাশাপাশি প্যাকেজের বাইরেও উত্তরাধিকারের মাধ্যমে অ্যাক্সেসযোগ্য করে তোলে (কেবলমাত্র শিশু শ্রেণির অভ্যন্তরে)।
সুতরাং যদি আমাদের কোনও শ্রেণি সুরক্ষিত করার অনুমতি দেওয়া হয় তবে আমরা খুব সহজেই প্যাকেজের অভ্যন্তরে এটি অ্যাক্সেস করতে পারি তবে প্যাকেজের বাইরে class শ্রেণীর অ্যাক্সেসের জন্য আমাদের প্রথমে সেই সত্তাকে প্রসারিত করতে হবে যেখানে এই ক্লাসটি এটির প্যাকেজটি সংজ্ঞায়িত করা হয়েছে।
এবং যেহেতু প্যাকেজটি প্রসারিত করা যায় না (আমদানি করা যায়), সুরক্ষিত শ্রেণি নির্ধারণ করা আবার এটি প্যাকেজ-ব্যক্তিগত করে তুলবে যা এটি ইতিমধ্যে আমরা করতে পারব এটি ডিফল্ট হিসাবে সংজ্ঞায়িত করার অনুরূপ। সুতরাং কোনও শ্রেণীর ব্যক্তিগতকে সংজ্ঞায়িত করার কোনও সুবিধা নেই এটি কেবল বিষয়গুলি দ্বিধাগ্রস্থ করবে।
আরও তথ্যের জন্য পড়ুন কেন বাইরের জাভা শ্রেণি ব্যক্তিগত বা সুরক্ষিত হতে পারে না
সুরক্ষিত জনসাধারণের মতো নয়। সুরক্ষিত উভয়ই প্যাকেজ স্তরের অ্যাক্সেস প্লাস রয়েছে কেবলমাত্র উত্তরাধিকার সূত্রে প্যাকেজগুলির বাইরেও অ্যাক্সেস করা যায় .. যদি কোনও শ্রেণি প্যাকেজের বাইরে একটি প্যাকেজকে অন্য প্যাকেজ থেকে অন্তর্নিহিত করে (INHERITANCE ব্যবহার করে সুরক্ষিত পদ্ধতি সহ) এই শ্রেণীর বিয়ের পদ্ধতিগুলি অ্যাক্সেস করতে পারে যা সুরক্ষিত পদ্ধতি রয়েছে তবে এই শ্রেণি থেকে উদ্ভূত উপ-শ্রেণিগুলি অর্থাত্, এ সুরক্ষিত পদ্ধতিগুলিতে অ্যাক্সেস করতে পারে না ... এটি জনসাধারণের সাথে বিপরীত ঘটে ...
উদাহরণ:
package 2;
class B
{
protected void method1()
{
}
}
package 1;
import 2.B;
class A extends B
{
//can access protected method
}
class C extends A
{
//can't access the protected method
}
"সুরক্ষিত" এর আচরণ = "ডিফল্ট" এর আচরণ + এটি "যে কোনও প্যাকেজের যে কোনও সাবক্লাসে এটি ব্যবহার করুন"।
যাইহোক আমাদের ক্লাসের জন্য ডিফল্ট অ্যাক্সেস মডিফায়ার রয়েছে, সুরক্ষিত অ্যাক্সেস মডিফায়ার থেকে আমরা যে সুবিধা পেতে পারি তা হ'ল: - সাবক্লাসিংয়ের মাধ্যমে কোনও প্যাকেজে এটি ব্যবহার করে by তবে সাবক্লাসের জন্য, পিতামাতার "সুরক্ষিত" শ্রেণীর দৃশ্যমানতা ব্যক্তিগত হবে। সুতরাং এটি অ্যাক্সেস করা যাবে না। মূলত যদি আপনার সুরক্ষিত শীর্ষ-স্তরের শ্রেণি থাকে তবে কোনও বহিরাগত শ্রেণি এটি সাবক্ল্যাসিং করে অ্যাক্সেস অর্জন করতে পারে না। সুতরাং শীর্ষ স্তরের শ্রেণীর জন্য সুরক্ষিত অর্থহীন।
সুরক্ষিত : কেবল প্যাকেজ স্তরে ভিজিবল করুন।
শ্রেণিটি সুরক্ষিত সংজ্ঞায়িত ---> এটি বাইরের প্যাকেজ থেকে প্রসারিত হতে পারে না (দৃশ্যমান নয়)।
এবং যদি এটি প্রসারিত করা যায় না তবে এটি সুরক্ষিত হিসাবে রাখা অর্থহীন , কারণ এটি তখন ডিফল্ট হয়ে যায় অ্যাক্সেস যা অনুমোদিত।
একই বেসরকারী সংজ্ঞায়িত ক্লাসে প্রযোজ্য ।
দ্রষ্টব্য: নেস্টেড বা অভ্যন্তরীণ ক্লাসগুলি সুরক্ষিত বা ব্যক্তিগত হিসাবে সংজ্ঞায়িত করা যেতে পারে ।
* : সুরক্ষিত কীওয়ার্ড অন্বেষণ করুন , এই উত্তরের জন্য আমি এটি সংক্ষেপে পরিণত করেছি।
@ আকাশ ৫৮৮৮ এর উত্তর আমার কাছে কোনও অর্থ দেয়নি:
যদি সমস্ত শ্রেণিকে সাবক্লাস করার অনুমতি দেওয়া হয় তবে এটি সর্বজনীন অ্যাক্সেস স্পেসিফায়ারের অনুরূপ।
যেহেতু এই শ্রেণিকে কেবল কয়েকটি শ্রেণি দ্বারা উপ-শ্রেণিবদ্ধ করার সীমাবদ্ধ করার কোনও উপায় নেই (আমরা প্যাকেজের / প্যাকেজের বাইরে উপলব্ধ সমস্ত শ্রেণীর মধ্যে কেবল কয়েকটি শ্রেণীর দ্বারা বংশগত হওয়া সীমাবদ্ধ করতে পারি না), সুরক্ষিত অ্যাক্সেস স্পেসিফায়ারগুলির কোনও ব্যবহার নেই শীর্ষ স্তরের ক্লাসের জন্য। সুতরাং এটি অনুমোদিত নয়।
তারপরে আপনি সুরক্ষিত পদ্ধতি এবং ভেরিয়েবলগুলিতে একই যুক্তি প্রয়োগ করতে পারেন, সেগুলিও পরে "পাবলিকের সমান"। প্যাকেজের বাইরে থাকা সমস্ত শ্রেণিগুলি আমাদের সর্বজনীন শ্রেণিকে প্রসারিত করতে এবং এর সুরক্ষিত পদ্ধতিগুলি ব্যবহার করতে পারে। কেন বর্ধিত ক্লাসগুলিতে পদ্ধতি এবং ভেরিয়েবলগুলি সীমাবদ্ধ করা হচ্ছে তবে পুরো ক্লাসটি সীমাবদ্ধ করা ঠিক নয়? "পাবলিকের সমান" "পাবলিকের সমান" নয়। আমার ব্যাখ্যাটি হ'ল এটি কোনও সুরক্ষিত শ্রেণীর অনুমতি দেওয়া পুরোপুরি ঠিক, কারণ সুরক্ষিত পদ্ধতির অনুমতি দেওয়া ঠিক fine
উত্তর "আপনি কোনও শ্রেণি প্রসারিত করতে পারবেন না যা আপনি অ্যাক্সেস করতে / দেখতে পারবেন না" উত্তরটি আরও যুক্তিসঙ্গত।
এই প্রশ্নের অর্থটি কী তা বোঝায় যে, জেভিএম সি (সান জেভিএম) এবং সি ++ (ওরাকল জেভিএম) তে লেখা আছে তাই সংকলনের সময় আমরা আমাদের জাভা ফাইলের বাইরে .class ফাইল তৈরি করতে যাচ্ছি এবং যদি আমরা সুরক্ষিত কীওয়ার্ড সহ একটি শ্রেণি ঘোষণা করি তাহলে এটি JVM দ্বারা অ্যাক্সেস করা হবে না।
জেভিএম দ্বারা সুরক্ষিত শ্রেণি কেন অ্যাক্সেস করা হবে না তার উত্তরটি হ'ল যেহেতু সুরক্ষিত ক্ষেত্রগুলি একই প্যাকেজের মধ্যে বা কেবল উত্তরাধিকারের মাধ্যমে পৃথক প্যাকেজটিতে অ্যাক্সেসযোগ্য এবং জেভিএম এমনভাবে লিখিত হয় না যাতে এটি উইল শ্রেণীর উত্তরাধিকারী হয়। আশা করি এটি এই প্রশ্নের সন্তুষ্টি :)
একইভাবে, একটি শীর্ষ স্তরের শ্রেণি ব্যক্তিগত হতে পারে না। নীচে হিসাবে ব্যাখ্যা:
সুতরাং যদি আমরা কোনও শ্রেণীর ব্যক্তিগতকে সংজ্ঞায়িত করি তবে কী হবে, সেই শ্রেণিটি কেবলমাত্র সেই সত্তার মধ্যেই অ্যাক্সেসযোগ্য হবে যেখানে এটি সংজ্ঞায়িত হয়েছে যা আমাদের ক্ষেত্রে এটির প্যাকেজটি?
সুতরাং শ্রেণিতে ব্যক্তিগত অ্যাক্সেস সংজ্ঞায়িত করা একই প্যাকেজের ভিতরে এটি অ্যাক্সেসযোগ্য করে তুলবে যা পূর্বনির্ধারিত কীওয়ার্ডটি ইতিমধ্যে আমাদের জন্য করে তোলে, সুতরাং শ্রেণীর বেসরকারীকে কোনওরূপে ব্যাখ্যা করার কোনও সুবিধা নেই যা এটি কেবল বিষয়টিকে দ্বিধাগ্রস্ত করে দেবে।
সুরক্ষিত মানে হল যে সদস্যটি অন্য প্যাকেজে থাকলেও একই প্যাকেজের যে কোনও শ্রেণীর দ্বারা এবং উপ শ্রেণি দ্বারা অ্যাক্সেস করা যেতে পারে।
উদাহরণ:
package a;
class parent{
protected void p();
}
package b;
import a.p;
class child extends parent{
//you can access method which is protected in the parent in the child
}
class another extends child {
//here you can not access the protected method
}
যদি কোনও বহিরাগত শ্রেণি সুরক্ষিত দ্বারা ঘোষিত হয় তবে আমি মনে করি আপনি চান যে ক্লাসটি কেবল একই প্যাকেজ এবং এর সাবক্লাসটি নয় তবে বিভিন্ন প্যাকেজ থেকে অ্যাক্সেস করা যেতে পারে। তবে, সুরক্ষিত শ্রেণীর জন্য সাবক্ল্যাস তৈরি করা সম্ভব নয়, কারণ আপনি যখন লেখেন "ক্লাস কুকুরটি প্রাণীকে প্রসারিত করে" সুরক্ষিত "অ্যানিমাল" কেবল তার উপক্লাস দ্বারা অ্যাক্সেস করা যায়, সম্ভবত "কুকুর" "প্রাণী" সাবক্লাস নয় ।
বহিরাগত শ্রেণি রক্ষিত বাহ্যিক শ্রেণীর সাথে একই!