নাল কি একটি অবজেক্ট?


119

Objectজাভাতে কি নাল ?


41
না এটি নয়, এবং যারা এই জাতীয় প্রশ্ন কেন ভাবছেন, এমন ভাষা রয়েছে যেখানে নাল প্রকৃতপক্ষে কোনও বস্তুর মতো, উদাহরণস্বরূপ রুবি।
JRL

7
স্ক্যালায়, যা প্রকারগুলি সম্পর্কে খুব সাবধানী, সেখানে একটি টাইপ রয়েছে Null(একটি বৈশিষ্ট্য , আসলে) একক উদাহরণ রয়েছে null
কার্ল স্মোট্রিক্জ

1
@JRL: শুধু আউট কৌতুহল, আমি কিভাবে প্রভাব ভাবছি JRuby কাজ করে ... (আমি বাস্তবায়ন যে স্তর সঙ্গে পরিচিত যথেষ্ট নয় নিশ্চিত জানেন যে আছি।)
বেঞ্জামিন Oakes

@ JRL এর মন্তব্যের জুড়তে - রুবি এর রুক্ষ সমতুল্য করার nullনেই nil, যার মধ্যে একটি দৃষ্টান্ত হল NilClass
ইলিয়ট সাইকস

বা জাভাস্ক্রিপ্ট, যাতে null instanceof Objectমিথ্যা তবে typeof(null)ফিরে আসে 'object'। এটি কি এই ক্ষেত্রে একটি অবজেক্ট? কে জানে.
ডন হ্যাচ

উত্তর:


166

যদি নাল একটি অবজেক্ট হত তবে এটি এর java.lang.Objectমতো পদ্ধতিগুলিকে সমর্থন করবে equals()। যাইহোক, এটি কেস নয় - কোনও পদ্ধতির অনুরোধের ফলে নালীর ফলাফল প্রাপ্ত হয় NullPointerException

এবং জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনের এই বিষয়ে এই কথাটি বলতে হবে:

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

আমার মনে হয় এটিকে "নাল স্পেশাল" এ সিদ্ধ করা যেতে পারে।


1
তাই জাভা মধ্যে একটি বস্তুর শুধুমাত্র একটি বস্তু হলে এটি বা উপশ্রেণী সমান java.lang.Object। ব্যবহারিকভাবে - হ্যাঁ আপনি এমন কোনও শ্রেণি তৈরি করতে পারবেন না যা জাভা.লং.অবজেক্টের একটি সাবক্লাস নয়, তবে আমি এর চেয়ে দার্শনিক দৃষ্টিকোণ থেকে কখনই ভাবিনি
Andreas Dolk

মজার ব্যাপার হলো, সব কিছুর, জন্য API ডকNullPointerException তোলে একটি »এর উল্লেখ nullবস্তু« ... :) কিন্তু তারপর, এটি সম্পর্কে কথা বলতে ঠিক ছিল »নাল পয়েন্টার« ...
Lumi

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

1
@ শ্রীচক্রধর: হ্যাঁ, আমরা পারি! যা আপনি এখানে জিজ্ঞাসা করার চেয়ে কোডটিতে চেষ্টা করে আরও সহজে খুঁজে পেতে পারেন।
মাইকেল বর্গওয়ার্ট

1
"নাল রেফারেন্স হল নাল প্রকারের একটি অভিব্যক্তির একমাত্র সম্ভাব্য মান"। স্পেসিফিকেশন ডকটি পড়ার সময় হয়েছে। :)
sofs1

32

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


8
নাল একটি প্রকার এবং মান।
জোছিম সউর

5
nullনাম একটি এর "উদাহরণস্বরূপ" হয় nullধরন, দৃশ্যত।
স্টারগার

nullপরিবর্তনশীল নয়, এটি আক্ষরিক: জেএলএস, 3.10.7। দ্য নাল লিটারাল
গেরোল্ড ব্রোজার

রে " nullএমন এক ধরণের যা নির্ধারিত হতে পারে ": 1) null(কোডে) নাল আক্ষরিক , নাল টাইপ 2 নয়) জাভাতে সাধারণত ভেরিয়েবলগুলিকে প্রকারগুলি বরাদ্দ করা যায় না, জেএলএস ৪.১ দেখুন: " রয়েছে [... ] দুটি ধরণের ডেটা মান যা ভেরিয়েবলে সংরক্ষণ করা যায় [...]: আদিম মান (§4.2) এবং রেফারেন্স মান (§4.3)। " এটি নাল রেফারেন্স যা nullআক্ষরিক মাধ্যমে নির্ধারিত হতে পারে । ... তবুও ...
জেরল্ড ব্রোজার

3) বস্তুর "এ বস্তু পরিবর্তনশীল ", বর্গ পরিবর্তনশীল তুলনায় সাধারণত টাইপ কিন্তু জীবদ্দশায় পড়ুন না। প্রকারটি উল্লেখ করার সময় এটিকে সাধারণত একটি রেফারেন্স টাইপের ভেরিয়েবল বা সংক্ষেপে, রেফারেন্স (টাইপ) ভেরিয়েবল বলা হয়। আমি জাভা এপিআই-তে 4 টি ধরণের সম্পর্কে অবগত রয়েছি যা উদাহরণ / অবজেক্ট ভেরিয়েবলগুলি প্রকাশ করে (আরও কিছু থাকতে পারে): এরlength এবং এর সাবক্লাসগুলির সাথে অ্যারেগুলিjava.awt.geom.Point2D
জেরুল্ড ব্রোজার



12

নাল হ'ল কোনও জিনিসের অভাব।


তবে নাল টাইপ প্রতিটি রেফারেন্স টাইপের জন্য নির্ধারিত হয়।
টম হাটিন -

কোনও "নাল টাইপ" নেই; নাল হ'ল অ-আদিম এক্সপ্রেশনগুলির একটি নির্দিষ্ট মান ie
টমি ম্যাকগুইয়ার

3
টমি: জেএলএস ৪.১: "এখানে একটি বিশেষ নাল টাইপও রয়েছে, এক্সপ্রেশনটি নাল টাইপের, যার কোনও নাম নেই" "
কেন


12

জেআরএল লিখেছেন:

না এইটা না, ...

আপনি প্রায়শই এটির দিকে নজর রাখেন, আপনি কাকে বেশি বিশ্বাস করেন it

জেএলএসের মতে, হ্যাঁ, এটি । বিশেষত যদি আপনি এই প্রশ্নটি পুনরায় উত্তর দেন: "আসলেই কি nullটাইপ হয় Object?" উপরে মাইকেল বর্গওয়ার্ট দ্বারা উদ্ধৃত জেএলএস ৪.১ ছাড়াও :

জেএলএস 3.10.7 দেখুন :

একটি নাল আক্ষরিক সর্বদা নাল টাইপের হয়।

এবং জেএলএস 4.10 :

টি টাইপ টির উপপ্রকারগুলি হ'ল সমস্ত প্রকারের ইউ যেমন টি টি হ'ল একটি সুপার টাইপ , এবং নাল প্রকার।

বা জেএলএস 4.10.2 :

নাল টাইপের সরাসরি সুপারটাইপগুলি নাল টাইপ ব্যতীত অন্য সমস্ত রেফারেন্স টাইপ।

[আমার দ্বারা জোর দেওয়া।]

গ্রহনটি 2019-09 এর সংকলক অনুসারে এটি নয় :

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

ওপেনজেডিকে 12.0.1 অনুসারে javac এটি হ'ল :

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

কোণ বন্ধনীগুলি বোঝায় যে nullএটি আদিম ধরণের ব্যতীত অন্য কোনও। এবং জেএলএস ৪.১ অনুসারে :

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে দুই ধরণের প্রকার রয়েছে: আদিম ধরণের (...) এবং রেফারেন্স প্রকার (...)।

যদি এটি এক না হয় তবে এটি অন্যটি।


ক্লডিউ লিখেছেন:

নাল একরকম কুৎসিত।

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


জোছিম সৌর লিখেছেন:

নাল একটি প্রকার এবং মান।

আসলে আছে তিনটি সাথে আইটেম নাল (এছাড়াও দেখুন JLS 3.10.7 ):

  1. (অন্যথায় নামবিহীন) নাল টাইপ
  2. null আক্ষরিক
  3. নাল রেফারেন্স মান। (সাধারণত নাল মান বা কেবল নাল হিসাবে সংক্ষেপিত iated )

(১) উল্লেখ্য যে উপরে উল্লিখিত জেএলএস ৪.১০.২ অনুসারে নাল টাইপটি কেবলমাত্র ইন্টারফেসের জন্য নয়, ক্লাসগুলির জন্যও একাধিক উত্তরাধিকার ব্যবহার করে। যা আমরা সবাই জানি আমাদের অ্যাপ্লিকেশন প্রোগ্রামারদের পক্ষে সম্ভব নয়।

(2) নাল আক্ষরিক হিসাবে বর্ণিত হতে পারে একটি পরিবর্তনশীল হিসাবে কল্পনা করা যেতে পারে:

JVM_global final null_type null = new null_type();

জেএলএস 3.9 নোট করুন :

কীওয়ার্ড হওয়ার জন্য বিভিন্ন ধরণের চরিত্রের সিকোয়েন্সগুলি ভুলভাবে অনুমান করা হয়:


বিষয়ে null instanceof <any type>

জেএলএস ৪.১০.২ মাথায় রেখে (n নাল টাইপ প্রতিটি ধরণের একটি উপপ্রকার ") এর null instanceof <any type>মূল্যায়ন করার কথা ভাবা trueউচিত, তাই না? প্রথম দর্শনে, হ্যাঁ, তবে জেএলএস 15.20.2 অন্তর্দৃষ্টি উত্তর দেয়:

[...] ফলাফলের এর instanceofঅপারেটর হয় trueযদি মান এর RelationalExpression নয়null [...]। অন্যথায় ফলাফল হয়false

[আমার দ্বারা জোর দেওয়া।]

নিজেকে আরও জিজ্ঞাসা করুন কী আরও বোধ করে (কোনও অ্যাপ্লিকেশন প্রোগ্রামারের দৃষ্টিভঙ্গি থেকে):

  • প্রদান falseএবং এইভাবে ইঙ্গিত দেয় যে একটি রেফারেন্স এক্সপ্রেশন আমাদের কাছে প্রকাশিত প্রকারের নয়, অর্থাত্ ইঙ্গিত করে যে এটি আমাদের জন্য দরকারী কিছু উল্লেখ করা হচ্ছে না ating

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

     class Car implements Vehicle {  
     ...
     Vehicle car = null;
     ...
     boolean b = car instanceof Car;  // True? There's not even an instance
     ...                              // which could be of type Car.

যা এছাড়াও বাড়ে:

কেন instanceofকিছু বলার উপযুক্ত উপায় নয়null অবজেক্ট-নেস ?

এটা তোলে বলা হচ্ছে instanceofনা sameorsubtypeof। এর অর্থ আমরা একটি উদাহরণের ধরণের সাথে দুটি প্রকারের সাথে তুলনা করছি। এখন nullঅর্থ: "কোনও উদাহরণ নেই" এবং যদি কোনও উদাহরণ না থাকে তবে উদাহরণের ধরণ নেই। এটি সুস্পষ্ট যে কোনও কিছুর সাথে কোনও কিছুর তুলনা করা বাড়ে যাবার কথা false

বা একটি "আরও" বাস্তব বিশ্বের উদাহরণে:

  • আমার হাতে একটি আপেল ( = রেফারেন্স টাইপ ) এর একটি বাস্তব আকারের ছবি রয়েছে যার উপরে »বিগ অ্যাপল = ( = রেফারেন্স টাইপের নাম ) লেখা আছে written
  • আমার সামনে একটি টেবিল ( = গাদা ) রয়েছে।
  • টেবিলে যদি কোনও আপেল ( = উদাহরণ ) থাকে তবে এটির সাথে একটি কর্ড ( = রেফারেন্স ) সংযুক্ত রয়েছে।
  • আমি এই কর্ডের অন্য প্রান্তটি আমার হাতে ধরে রেখেছি ( = রেফারেন্স ভেরিয়েবল )।
  • আমি কর্ড বরাবর আপেল ট্রেস এবং এটি আমার ছবির সাথে তুলনা ( = উদাহরণস্বরূপ )।
  • আপেলটি যদি আকারের চেয়ে বড় আকারের বা বড় হয় তবে »বিগ অ্যাপল writing লেখাটি এটি প্রয়োগ করে ( = সত্য )।
  • যদি এটি ছোট হয়, তবে ( = মিথ্যা নয়) ) নয়।
  • যদি টেবিলে কোনও আপেল না থাকে (= কোনও উদাহরণ নেই ) এবং সুতরাং, কোনও কর্ড উপস্থিত নেই ( = নাল ) তবে লেখাটি ( = মিথ্যা ) প্রযোজ্য নয় । কারণ: কোনও আপেল বড় আপেল নয়? না এইটা না.


মাইকেল যেমন যোগফল দিয়েছেন: "নাল স্পেশাল" আসলেই।


2
আপেল এবং নাল? আপনি কি মামলা করতে ভয় পাচ্ছেন না? :)
গবার লিপটিক

9

না এটি কোনও ক্লাস বা ক্লাসের উদাহরণ নয়। এটা কিছুই রেফারেন্স।

সম্পাদনা করুন : অনুমানটি পড়েনি তাই উপরেরটি 100% সঠিক নাও হতে পারে।


5

৪.১ অধ্যায়টিতে যেমন জাভা ভাষা নির্দিষ্টকরণের ধরণ এবং মূল্যগুলির ধরণে ব্যাখ্যা করা হয়েছে , নাল একটি প্রকার যা এর একটি মান, নাল রেফারেন্স (এবং আক্ষরিক দ্বারা প্রদর্শিত হয় null):

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

যদিও আপনি নাল অবজেক্ট প্যাটার্নটি সম্পর্কে পড়তে চাইতে পারেন (তবে আমি এটি প্রস্তাব করি না)। দেখুন C2 এ উইকি বা উইকিপিডিয়া এই প্যাটার্ন সম্পর্কে আরো জানার জন্য।



4

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


3
আসলে, null instanceof <anytype>ফিরে আসবে false
বোম্বে

4

জাভা স্পেস অনুসারে ,

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


4

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


3

নাল একটি উদাহরণ java.lang.Object? না।

নাল কি একটি জিনিস ? এর "সংজ্ঞা উপর নির্ভর করে হয় "।


2
Object foo = null;
System.out.println(foo.toString()); 

প্রথম লাইন শো nullটাইপ করার জন্য বরাদ্দ করা যেতে পারে Object, তবে দ্বিতীয় লাইনটি এটি প্রদর্শিত হবে তা অবশ্যই দেখায় না Objectএবং শেষ পর্যন্ত a এর ফলাফল হয়java.lang.NullPointerException


1

না, কোনও nullঅবজেক্ট নয় t এটি একটি রেফারেন্স টাইপ এবং এর মান কোনও বস্তুকে উল্লেখ করে না এবং তাই nullমেমোরিতে কোনও উপস্থাপনা নেই ।


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