জাভাতে নাল রেফারেন্সে স্থির ক্ষেত্র


119

staticজাভাতে সদস্য ( staticক্ষেত্র বা staticপদ্ধতি) এই শ্রেণীর অবজেক্টের চেয়ে স্ব স্ব শ্রেণীর সাথে সম্পর্কিত। নিম্নলিখিত কোডটি একটি nullরেফারেন্সে একটি স্ট্যাটিক ফিল্ড অ্যাক্সেস করার চেষ্টা করে ।

public class Main
{
    private static final int value = 10;

    public Main getNull()
    {
        return null;
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        System.out.println("value = "+main.getNull().value);
    }
}

যদিও main.getNull()রিটার্ন null, এটি কাজ করে এবং প্রদর্শন করে value = 10। এই কোডটি কীভাবে কাজ করে?



4
মজা করার জন্য, চেষ্টা করুন Main main = null; main.getNull().value
মার্কো তোপোলনিক

1
এটি আমাকে new Thread[]{}[-1].sleep(10);কোথায় স্মরণ করিয়ে দেয় যে ঘুম () একটি স্থির পদ্ধতি। এটি কয়েকটি পুরানো জাভা সংস্করণে সাফল্য অর্জন করত।
হার্টজস্প্রং

উত্তর:


93

যে আচরণটি নির্দিষ্ট করা হয়েছে জাভা ভাষার নির্দিষ্টকরণে নির্দিষ্ট করা হয়েছে :

কোনও নাল রেফারেন্স ব্যতিক্রম ব্যতীত কোনও শ্রেণি (স্থির) পরিবর্তনশীল অ্যাক্সেস করতে ব্যবহৃত হতে পারে।

অধিক বিবরণের জন্য, একটি স্ট্যাটিক ক্ষেত্র মূল্যায়ন যেমন Primary.staticFieldকাজ অনুসরণ করে (জোর খনি) হিসাবে - আপনার ক্ষেত্রে, Primary = main.getNull():

  • প্রাথমিক অভিব্যক্তিটি মূল্যায়ন করা হয়, এবং ফলাফলটি বাতিল করা হয় । [...]
  • যদি ক্ষেত্রটি একটি খালি ফাঁকা চূড়ান্ত ক্ষেত্র হয়, তবে ফলাফলটি শ্রেণীর বা ইন্টারফেসে নির্দিষ্ট শ্রেণীর ভেরিয়েবলের মান যা প্রাথমিক প্রকাশের ধরণ। [...]

5
এই পছন্দটি কেন করা হয়েছিল সে সম্পর্কে কারও কাছে যদি তথ্য থাকে তবে তা আকর্ষণীয় হবে।

6
@ জোনফএলট্রেডস আমি মনে করি এটি সুস্পষ্ট: নাল রেফারেন্সের জন্য ফোন দেওয়ার সময় কোনও ব্যতিক্রম না ছড়িয়ে দেওয়া যুক্তিসঙ্গত কারণ পদ্ধতিটি স্থিতিশীল হওয়ার কারণে এটি গুরুত্বপূর্ণ নয়।
ম্যালকম

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

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

8
@ ফ্যালানউই এটি অনুমোদিত, তবে গ্রহদে একটি সতর্কতা উত্থাপন করেছে: "স্ট্যাটিক ফিল্ড মেইন.ভ্যালু একটি স্থিতিশীল উপায়ে অ্যাক্সেস করা উচিত"। কমপক্ষে আমরা যারা সতর্কতা সম্পর্কে পছন্দ করি (আমার মত) তারা এই জাতীয় কোড এড়িয়ে যাবে।
আর্টিয়াম

19

কারণ, যেমন আপনি বলেছেন, স্থির ক্ষেত্রগুলি কোনও উদাহরণের সাথে সম্পর্কিত নয়।

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

main.getNull(); 
Main.value

7
আমি এটিকে সিনট্যাকটিক চিনি বলব, সিনট্যাকটিক করাত ধূলির মতো;)
স্টিফেন সোয়েসেন

3

যখনই আপনি সংকলনের সময় কোনও স্ট্যাটিক ভেরিয়েবল বা পদ্ধতিতে অ্যাক্সেস করে ক্লাসের নামতে রূপান্তর করেন। উদাহরণ:

Main main = null;
System.out.println(main.value);

এটি স্ট্যাটিক ভেরিয়েবলের মান মুদ্রণ করবে কারণ সংকলন সময়ে এটি রূপান্তরিত হবে

System.out.println(Main.value);

প্রমাণ:

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


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

  2. কোনও nullবস্তু রেফারেন্স ভেরিয়েবলকে staticকোনও সংকলন বা রান টাইমে ব্যতিক্রম ছাড়াই কোনও শ্রেণি ভেরিয়েবল অ্যাক্সেসের অনুমতি দেওয়া হয়।


2

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

আরও বিস্তারিত জানার জন্য নীচের লিঙ্কটি দেখুন।

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

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