উত্তর:
ডিফল্ট দৃশ্যমানতাটি "প্যাকেজ-ব্যক্তিগত" হিসাবে পরিচিত (যদিও আপনি এটি স্পষ্টভাবে ব্যবহার করতে পারবেন না), যার অর্থ ক্ষেত্রটি একই প্যাকেজের ভিতরে যা ক্ষেত্রের অন্তর্ভুক্ত তা অ্যাক্সেসযোগ্য হবে।
যেমন এমডিএমএ উল্লেখ করেছে, ইন্টারফেস সদস্যদের ক্ষেত্রে এটি সত্য নয়, যার জন্য ডিফল্টটি "পাবলিক"।
ডিফল্ট নির্দিষ্টকারী প্রসঙ্গে নির্ভর করে।
ক্লাস এবং ইন্টারফেস ঘোষণার জন্য, ডিফল্টটি প্যাকেজটি ব্যক্তিগত। এটি সুরক্ষিত এবং প্রাইভেটের মধ্যে পড়ে, একই প্যাকেজ অ্যাক্সেসে কেবল ক্লাস করার অনুমতি দেয়। (সুরক্ষিত এটি এর মতো, তবে প্যাকেজের বাইরে সাবক্লাসে অ্যাক্সেসের অনুমতি দেয়))
class MyClass // package private
{
int field; // package private field
void calc() { // package private method
}
}
ইন্টারফেস সদস্যদের (ক্ষেত্র এবং পদ্ধতি) জন্য, ডিফল্ট অ্যাক্সেস সর্বজনীন। তবে মনে রাখবেন যে ইন্টারফেসের ঘোষণাটি ব্যক্তিগতভাবে প্যাকেজটিতে ডিফল্ট হয়।
interface MyInterface // package private
{
int field1; // static final public
void method1(); // public abstract
}
আমাদের যদি তখন ঘোষণা থাকে
public interface MyInterface2 extends MyInterface
{
}
মাইইন্টারফেস 2 ব্যবহার করে ক্লাসগুলি তখন সুপার ইন্টারফেস থেকে ফিল্ড 1 এবং মেথড 1 দেখতে পারে, কারণ তারা সর্বজনীন, যদিও তারা নিজেরাই মাইন্টারফেসের ঘোষণাটি দেখতে পাচ্ছে না।
/* pp */
) কেবলমাত্র ডিফল্ট অ্যাক্সেসের জন্য সুবিধাজনক নাম । এটি জেএলএসের নাম নয়।
যদি কোনও অ্যাক্সেস নির্দিষ্টকারী দেওয়া না হয় তবে এটি ক্লাস এবং শ্রেণীর সদস্যদের জন্য প্যাকেজ-স্তরের অ্যাক্সেস (এর জন্য কোনও স্পষ্টভাবে নির্দিষ্টকরণকারক নেই)। ইন্টারফেসের পদ্ধতিগুলি স্পষ্টতই সর্বজনীন।
ডিফল্ট দৃশ্যমানতা (কোনও কীওয়ার্ড নেই) হ'ল প্যাকেজ যার অর্থ এটি একই প্যাকেজে অবস্থিত প্রতিটি শ্রেণীর জন্য উপলব্ধ।
মজাদার দিকের নোটটি হ'ল সুরক্ষিতটি সাবক্লাসগুলির মধ্যে নয় বরং একই প্যাকেজের অন্যান্য শ্রেণিতেও দৃশ্যমানতা সীমাবদ্ধ করে
এটি কী জিনিস তা নির্ভর করে।
শীর্ষ-স্তরের প্রকারগুলি (যা শ্রেণি, এনম, ইন্টারফেস এবং টীকাগুলির অন্য ধরণের মধ্যে ঘোষিত নয়) ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত । ( জেএলএস §6.6.1 )
ক্লাসে, সমস্ত সদস্য (এর অর্থ ক্ষেত্র, পদ্ধতি এবং নেস্টেড ধরণের ঘোষণার অর্থ) এবং নির্মাতারা ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত । ( জেএলএস §6.6.1 )
এনামগুলিতে কনস্ট্রাক্টররা ডিফল্টরূপে ব্যক্তিগত are প্রকৃতপক্ষে, এনাম কনট্রাক্টরগুলি অবশ্যই ব্যক্তিগত হতে হবে এবং সেগুলি জনসাধারণ বা সুরক্ষিত হিসাবে নির্দিষ্ট করা ত্রুটি। এনাম ধ্রুবক সর্বদা সর্বজনীন থাকে এবং কোনও অ্যাক্সেস নির্দিষ্টকারীকে অনুমতি দেয় না। এনামগুলির অন্যান্য সদস্যরা ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত । ( জেএলএস §8.9 )
ইন্টারফেস এবং টীকাগুলির ধরণগুলিতে, সমস্ত সদস্য (আবার তার অর্থ ক্ষেত্র, পদ্ধতি এবং নেস্টেড ধরণের ঘোষণাপত্র) ডিফল্টরূপে সর্বজনীন । প্রকৃতপক্ষে, ইন্টারফেস এবং টীকা জাতীয় ধরণের সদস্যদের অবশ্যই সর্বজনীন হতে হবে এবং তাদের ব্যক্তিগত বা সুরক্ষিত হিসাবে নির্দিষ্ট করা ত্রুটি। ( জেএলএস -9.3 থেকে 9.5 )
স্থানীয় ক্লাসগুলিকে একটি পদ্ধতি, কনস্ট্রাক্টর বা আরম্ভকারী ব্লকের ভিতরে ঘোষিত ক্লাসের নাম দেওয়া হয়। তারা হয় করার scoped {
.. }
ব্লক যা তারা ঘোষণা করা এবং কোন এক্সেস সুনির্দিষ্টভাবে উল্লেখ করা অনুমতি দেয় না। ( জেএলএস -১.3.৩ ) প্রতিচ্ছবি ব্যবহার করে, আপনি অন্য কোথাও থেকে স্থানীয় ক্লাসগুলি ইনস্ট্যান্ট করতে পারেন এবং সেগুলি প্যাকেজ-ব্যক্তিগত , যদিও আমি নিশ্চিত নই যে এই বিবরণটি জেএলএসে আছে কিনা I'm
অজ্ঞাতনামা ক্লাসগুলি হ'ল কাস্টম ক্লাস new
যা দিয়ে অভিব্যক্তিতে সরাসরি কোনও শ্রেণীর শরীর নির্দিষ্ট করা হয়। ( জেএলএস §15.9.5 ) তাদের সিনট্যাক্সটি কোনও অ্যাক্সেস নির্দিষ্টকারীকে অনুমতি দেয় না। প্রতিবিম্ব ব্যবহার করে, আপনি অন্য কোথাও বেনাম ক্লাসগুলি ইনস্ট্যান্ট করতে পারেন এবং তারা এবং তাদের উত্পন্ন নির্মাতারা উভয়ই প্যাকেজ-ব্যক্তিগত , যদিও আমি নিশ্চিত নই যে এই বিবরণটি জেএলএসে আছে কিনা।
উদাহরণস্বরূপ এবং স্ট্যাটিক ইনিশিয়ালাইজার ব্লকগুলির ভাষা স্তরে অ্যাক্সেস স্পেসিফায়ার নেই ( জেএলএস &8.6 এবং 8.7 ), তবে স্ট্যাটিক ইনিশিয়ালাইজার ব্লকগুলি <clinit>
( জেভিএমএস §2.9 ) নামে একটি পদ্ধতি হিসাবে প্রয়োগ করা হয় , সুতরাং পদ্ধতিটি অবশ্যই অভ্যন্তরীণভাবে কিছু অ্যাক্সেস স্পেসিফায়ার থাকতে হবে। আমি জাভ্যাক এবং এক্লিপসের সংকলক দ্বারা একটি হেক্স সম্পাদক ব্যবহার করে সংকলিত ক্লাসগুলি পরীক্ষা করে দেখেছি যে উভয়ই প্যাকেজ-প্রাইভেট হিসাবে পদ্ধতিটি উত্পন্ন করে । তবে, আপনি <clinit>()
ভাষার মধ্যে কল করতে পারবেন না কারণ একটি পদ্ধতির নাম <
এবং >
অক্ষরগুলি অবৈধ, এবং প্রতিবিম্বের পদ্ধতিগুলি এর অস্তিত্ব অস্বীকার করার জন্য কঠোরভাবে ব্যবহৃত হয়, তাই কার্যকরভাবে এর অ্যাক্সেস স্পেসিফায়ারের কোনও অ্যাক্সেস নেই । শ্রেণি শুরুর সময় পদ্ধতিটি কেবল ভিএম দ্বারা কল করা যেতে পারে।ইনস্ট্যান্স ইনিশিয়ালাইজার ব্লকগুলি পৃথক পদ্ধতি হিসাবে সংকলিত হয় না; তাদের কোড প্রতিটি নির্মাণকারীর মধ্যে অনুলিপি করা হয়, তাই তারা প্রতিচ্ছবি এমনকি পৃথকভাবে অ্যাক্সেস করা যাবে না।
ডিফল্ট একটি কীওয়ার্ড যা পদ্ধতি এবং ভেরিয়েবলের অ্যাক্সেস সংশোধক হিসাবে ব্যবহৃত হয়।
এই অ্যাক্সেস মডিফায়ারটি ব্যবহার করে আপনার ক্লাস, পরিবর্তনশীল, পদ্ধতি বা কনস্ট্রাক্টরকে নিজের শ্রেণি বা প্যাকেজ থেকে অ্যাক্সেসযোগ্য করে তুলবে, অ্যাক্সেস মডিফায়ার উপস্থিত না থাকলে এটি সেট করা থাকবে।
Access Levels
Modifier Class Package Subclass EveryWhere
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
আপনি যদি কোনও ইন্টারফেসে ডিফল্ট ব্যবহার করেন তবে আপনি এই উদাহরণটির মতো কোনও পদ্ধতি প্রয়োগ করতে সক্ষম হবেন
public interface Computer {
default void Start() {
throw new UnsupportedOperationException("Error");
}
}
তবে এটি কেবল 8 টি জাভা সংস্করণ থেকে কাজ করবে
দেখুন এখানে আরো বিস্তারিত জানার জন্য। ডিফল্টটি ব্যক্তিগত / পাবলিক / সুরক্ষিত কোনও নয়, তবে সম্পূর্ণ আলাদা অ্যাক্সেসের বিশদকরণ। এটি ব্যাপকভাবে ব্যবহৃত হয় না এবং আমি আমার অ্যাক্সেস সংজ্ঞাগুলিতে আরও নির্দিষ্ট হতে পছন্দ করি।
জাভার স্রষ্টা জেমস গোসলিংয়ের একটি সাক্ষাত্কার থেকে প্যাকেজ স্তরের দৃশ্যমানতার বিষয়ে একটি উদ্ধৃতি এখানে দেওয়া হয়েছে:
বিল ভেনার্স : জাভাতে চারটি অ্যাক্সেস স্তর রয়েছে। ডিফল্ট প্যাকেজ হয়। আমি সর্বদা ভাবছিলাম যে প্যাকেজ অ্যাক্সেস ডিফল্ট তৈরি করা সুবিধাজনক কিনা কারণ সি ++ এর লোকেরা যে তিনটি কীওয়ার্ড ইতিমধ্যে জানত সেগুলি ব্যক্তিগত, সুরক্ষিত এবং সর্বজনীন ছিল। অথবা যদি আপনার কাছে কোনও নির্দিষ্ট কারণ থাকে যা আপনার মনে হয় যে প্যাকেজ অ্যাক্সেসটি ডিফল্ট হওয়া উচিত।
জেমস গোসলিং : একটি প্যাকেজ সাধারণত জিনিসগুলির এক সেট যা এক সাথে লেখার মতো। তাই সাধারণভাবে আমি দুটি কাজের একটি করতে পারতাম। একজন আপনাকে সর্বদা একটি কীওয়ার্ড রাখার জন্য বাধ্য করেছিল যা আপনাকে ডোমেন দেয়। অথবা আমি একটি ডিফল্ট মান থাকতে পারে। এবং তারপরে প্রশ্নটি হ'ল কোন বুদ্ধিমান ডিফল্টটি কী করে? এবং আমি সবচেয়ে কম বিপজ্জনক জিনিস কি জন্য ঝোঁক।
সুতরাং জনসাধারণকে ডিফল্টরূপে পরিণত করা সত্যিই খারাপ জিনিস হত। বেসরকারী সম্ভবত একটি ডিফল্ট করা খারাপ জিনিস হতে পারে, শুধুমাত্র কারণ মানুষ সাধারণত ব্যক্তিগত পদ্ধতি যে প্রায়শই না লিখেন। এবং সুরক্ষিত সঙ্গে একই জিনিস। এবং আমার কাছে থাকা একটি গুচ্ছ কোডটি দেখে আমি স্থির করেছিলাম যে সবচেয়ে সাধারণ জিনিস যা যুক্তিযুক্তভাবে নিরাপদ ছিল তা প্যাকেজে ছিল। এবং সি ++ এর জন্য একটি কীওয়ার্ড ছিল না, কারণ তাদের প্যাকেজগুলির ধারণা নেই।
তবে আমি এটি বন্ধুদের ধারণাগুলির চেয়ে পছন্দ করেছি, কারণ বন্ধুদের সাথে আপনার সমস্ত বন্ধু কে আছে তা গণনা করতে হবে এবং তাই আপনি যদি কোনও প্যাকেজে নতুন ক্লাস যুক্ত করেন তবে সাধারণত আপনি সমস্তটির সাথে যেতে হবে সেই প্যাকেজে ক্লাস করে এবং তাদের বন্ধুদের আপডেট করে, যা আমি সবসময় বাটটিতে সম্পূর্ণ ব্যথা পেয়েছি।
তবে বন্ধুদের তালিকা নিজেই এক ধরণের সংস্করণ সমস্যা তৈরি করে। এবং তাই একটি বন্ধুত্বপূর্ণ বর্গ এই ধারণা ছিল। এবং আমি যে সুন্দর জিনিসটি তৈরি করছিলাম সেটি ডিফল্ট - আমি সমস্যার সমাধান করব তাই কীওয়ার্ডটি হওয়া উচিত?
কিছুক্ষণের জন্য আসলে একটি বন্ধুত্বপূর্ণ কীওয়ার্ড ছিল। তবে অন্য সমস্ত "পি" দিয়ে শুরু করার কারণে এটি একটি "পিএইচ" দিয়ে "বন্ধুত্বপূর্ণ" হয়েছিল। তবে এটি সেখানে কেবল এক দিনের জন্য ছিল।
জাভা আপডেট করুন 8default
কীওয়ার্ডের ব্যবহার : অন্য অনেকে যেমন উল্লেখ করেছেন ডিফল্ট দৃশ্যমানতা (কোনও কীওয়ার্ড নেই)
বর্গের যে প্যাকেজের অন্তর্গত সেই একই প্যাকেজের ভিতরে থেকে ক্ষেত্রটি অ্যাক্সেসযোগ্য হবে।
নতুন জাভা 8 বৈশিষ্ট্য ( ডিফল্ট পদ্ধতি ) দিয়ে বিভ্রান্ত হওয়ার দরকার নেই যা কোনও ইন্টারফেসটিকে default
কীওয়ার্ডের সাথে লেবেলযুক্ত করার সময় একটি প্রয়োগকরণ সরবরাহ করতে দেয় ।
দেখুন: অ্যাক্সেস পরিবর্তনকারী
জাভাতে "ডিফল্ট" নামে একটি অ্যাক্সেস মডিফায়ার রয়েছে, যা কেবলমাত্র সেই প্যাকেজের মধ্যেই সেই সত্তার সরাসরি উদাহরণ তৈরি করতে দেয়।
এখানে একটি দরকারী লিঙ্ক:
সবার আগে আমি একটি কথা বলি জাভাতে "এক্সেস স্পেসিফায়ার" এর মতো কোনও শব্দ নেই। আমাদের প্রত্যেককে "মোডিফায়ারস" বলা উচিত। যেমনটি আমরা জানি যে চূড়ান্ত, স্ট্যাটিক, সিঙ্ক্রোনাইজড, অস্থির .... এটিকে সংশোধক হিসাবে ডাকা হয়, এমনকি পাবলিক, প্রাইভেট, সুরক্ষিত, ডিফল্ট, বিমূর্তটিকেও সংশোধক হিসাবে ডাকা উচিত। ডিফল্ট এমন একটি সংশোধনকারী যেখানে শারীরিক অস্তিত্ব নেই তবে কোনও সংশোধক স্থাপন করা হয় না তবে এটি ডিফল্ট সংশোধক হিসাবে গণ্য করা উচিত।
এটি ন্যায়সঙ্গত করার জন্য একটি উদাহরণ নিন:
public class Simple{
public static void main(String args[]){
System.out.println("Hello Java");
}
}
আউটপুট হবে: Hello Java
এখন সর্বজনীনকে প্রাইভেটে পরিবর্তন করুন এবং কী সংকলক ত্রুটি পাবেন তা দেখুন: এটিতে "এখানে মডিফায়ার প্রাইভেট অনুমোদিত নয়" কেউ কী উপসংহারে ভুল হতে পারে বা কিছু টিউটোরিয়াল ভুল হতে পারে তবে সংকলকটি ভুল হতে পারে না। সুতরাং আমরা বলতে পারি যে জাভাতে কোনও পদ অ্যাক্সেস স্পেসিফায়ার নেই সবকিছুই সংশোধক।