java - howtocode - বাংলায় জাভা pdf




জাভা মধ্যে পাবলিক, সুরক্ষিত, প্যাকেজ-ব্যক্তিগত এবং ব্যক্তিগত মধ্যে পার্থক্য কি? (16)

ব্যক্তিগত

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

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

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

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

বিঃদ্রঃ

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

রক্ষিত

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

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

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

বিঃদ্রঃ

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

প্রকাশ্য

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

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

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

তবে যদি আমরা যে জনসাধারণের ক্লাস অ্যাক্সেস করার চেষ্টা করছি তা ভিন্ন প্যাকেজে থাকে, তাহলে জনসাধারণের ক্লাসকে আমদানি করতে হবে।

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

ডিফল্ট- কোনও শব্দ নেই:

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

  • একই প্যাকেজ মধ্যে

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

বিঃদ্রঃ

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

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

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

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

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


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

ব্যক্তিগত

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

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

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

রক্ষিত

প্যাকেজ ব্যক্তিগত + subclasses বা প্যাকেজ সদস্য দ্বারা দেখা যায়।

প্রকাশ্য

সবাই এটা দেখতে পারেন।

Published

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

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

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

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

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

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

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

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


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

  • ব্যক্তিগত : বর্গ সুযোগ।
  • ডিফল্ট (বা প্যাকেজ-ব্যক্তিগত ): প্যাকেজ সুযোগ।
  • সুরক্ষিত : প্যাকেজ সুযোগ + শিশু (প্যাকেজ মত, কিন্তু আমরা বিভিন্ন প্যাকেজ থেকে এটি subclass করতে পারেন)। সুরক্ষিত সংশোধনকারী সবসময় "পিতামাতা-সন্তানের" সম্পর্ক রাখে।
  • সর্বজনীন : সর্বত্র।

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

  • (ডি) irect (একই ক্লাসের ভিতরে একটি পদ্ধতি থেকে আহ্বান)।
  • (R) আনুমানিক (ক্লাসের একটি রেফারেন্স ব্যবহার করে একটি পদ্ধতি আহ্বান করুন, অথবা "বিন্দু" সিনট্যাক্সের মাধ্যমে)।
  • (আমি) নেহেরিট্যান্স (subclassing মাধ্যমে)।

তারপর আমরা এই সহজ টেবিল আছে:

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

এখানে টেবিলের একটি ভাল সংস্করণ। (মডিউল জন্য একটি কলাম সঙ্গে ভবিষ্যত প্রমাণ।)

ব্যাখ্যা

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

  • কোন অ্যাক্সেস সংশোধনকারী ( j ) সহ সদস্য, একই প্যাকেজের ক্লাসগুলির মধ্যে কেবল অ্যাক্সেসযোগ্য।

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

  • একটি জনসাধারণের সদস্য ( l ) সমস্ত ক্লাসে অ্যাক্সেসযোগ্য (যদি না এটি এমন একটি module থাকে তবে এটি প্রকাশ করা প্যাকেজটি রপ্তানি না করে)।

কোন পরিবর্তনকারী চয়ন করতে?

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

উদাহরণ:

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

(*) এনক্যাপুলেশন ঠিক কি?


খুব সংক্ষিপ্ত

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

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

  • অনুমান করুন যে আমরা 2 ক্লাস আছে; FatherSon , প্রতিটি নিজস্ব প্যাকেজ:

    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 অবস্থিত এমন একটি বর্গের ভিতরে ( fatherpackage ):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. একটি উপশ্রেণী, ভিতরে বর্তমান বা 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
          }
      }
      

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

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

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

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


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

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

+ : accessible
blank : not accessible

জাভা অ্যাক্সেস modifiers।

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

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. সুরক্ষিত

শুধুমাত্র একই প্যাকেজ এবং subclasses ক্লাসে অ্যাক্সেসযোগ্য

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

// 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();
  }
}

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


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

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

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

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


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

  • অ-সদস্যের ধরন (অর্থাৎ, শ্রেণী, enums, ইন্টারফেস, এবং এনটাইটেশন ধরনের অন্য কোনও প্রকারের মধ্যে ঘোষণা করা হয় না) ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত হয়। ( জেএলএস §6.6.1 )

  • ক্লাস সদস্য এবং কন্সট্রাক্টরগুলি ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত। ( জেএলএস §6.6.1 )

  • Enum কন্সট্রাক্টর ডিফল্টরূপে ব্যক্তিগত হয় । (প্রকৃতপক্ষে, এনম কন্ট্রাক্টর অবশ্যই ব্যক্তিগত হতে হবে , এবং এটি তাদের জনসাধারণ বা সুরক্ষিত করার চেষ্টা করার একটি ত্রুটি)। Enum constants জনসাধারণ, এবং কোনো অ্যাক্সেস স্পেসিফিকেশন অনুমতি দেয় না। Enums অন্যান্য সদস্যদের ডিফল্টরূপে প্যাকেজ-ব্যক্তিগত হয়। ( জেএলএস §8.9 )

  • ইন্টারফেস এবং এনটাইটেশন প্রকারের সকল সদস্য ডিফল্টরূপে সর্বজনীন । (প্রকৃতপক্ষে, ইন্টারফেস এবং এনটাইটেশন প্রকারের সদস্যদের সার্বজনীন হতে হবে এবং এটি ব্যক্তিগত বা সুরক্ষিত করার জন্য এটি একটি ত্রুটি।) ( JLS §9.3 থেকে 9.5 )


এটি encapsulation সম্পর্কে সব (অথবা জো ফিলিপস হিসাবে বলা, অন্তত জ্ঞান )।

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

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

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

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

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

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


দ্রষ্টব্য: এটি শুধুমাত্র গ্রহণযোগ্য উত্তরের জন্য একটি পরিপূরক

এই জাভা অ্যাক্সেস Modifiers সাথে সম্পর্কিত ।

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

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

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

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

অ্যাক্সেস লেভেল সংশোধনকারী নির্ধারণ করে যে অন্যান্য ক্লাস কোনও নির্দিষ্ট ক্ষেত্র ব্যবহার করতে পারে বা কোনও নির্দিষ্ট পদ্ধতিতে প্রবেশ করতে পারে কিনা। অ্যাক্সেস নিয়ন্ত্রণ দুটি স্তর আছে:

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

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

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

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ 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     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

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

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


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

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

বিশ্বের দৃশ্যমান ( পাবলিক )।

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

পরিবর্তনশীল এবং পদ্ধতি বলা হয় যে কোন modifiers ছাড়া ঘোষণা করা যেতে পারে। ডিফল্ট উদাহরণ:

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(){
    }

}

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

public-> সব জায়গায় অ্যাক্সেসযোগ্য
private-> শুধুমাত্র একই ক্লাসের মধ্যে অ্যাক্সেসযোগ্য যেখানে এটি ঘোষণা করা হয়

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

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

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


                | 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         |       ✔       |     ✘     |       ✘       |   ✘    




access-modifiers