Object
Java'da null an mı ?
Null
( aslında bir özellik ) vardır null
.
null instanceof Object
yanlış olan ancak typeof(null)
geri dönen javascript 'object'
. Bu durumda bir nesne mi? Kim bilir.
Object
Java'da null an mı ?
Null
( aslında bir özellik ) vardır null
.
null instanceof Object
yanlış olan ancak typeof(null)
geri dönen javascript 'object'
. Bu durumda bir nesne mi? Kim bilir.
Yanıtlar:
Null bir Object olsaydı, java.lang.Object
gibi yöntemleri desteklerdi equals()
. Ancak, durum böyle değildir - bir boş değerdeki herhangi bir yöntem çağrısı, bir NullPointerException
.
Ve bu, Java Dil Spesifikasyonunun bu konuda söylediği şey:
Ayrıca, adı olmayan null ifadesinin türü olan özel bir boş tür vardır. Boş tipin adı olmadığı için, boş tipte bir değişken bildirmek veya boş tipe dönüştürmek imkansızdır. Boş başvuru, boş tipteki bir ifadenin olası tek değeridir. Boş başvuru her zaman herhangi bir başvuru türüne dönüştürülebilir. Uygulamada, programcı boş türü görmezden gelebilir ve null'ın yalnızca herhangi bir referans türünde olabilen özel bir değişmez değer olduğunu varsayabilir.
Sanırım bu, "boş özeldir" olarak özetlenebilir.
java.lang.Object
. Pratik olarak - evet. Java.lang.Object'in alt sınıfı olmayan bir sınıf oluşturamazsınız, ancak daha felsefi bir bakış açısıyla düşünmedim
NullPointerException
bir » null
nesneden« söz ediyor … :) Ama sonra, »boş işaretçilerden« bahsetmek de uygun oldu…
Java spesifikasyonuna göre , null
bir nesne değişkenine atanabilen bir türdür (yorumda belirtildiği gibi bir değer olarak). Bu türden değişkenleri örnekleyemez veya oluşturamazsınız, ancak null
derleyici tarafından sağlanan değişmezi kullanmanız gerekir .
null
Adı bir "örneği" dir null
görünüşe göre, tip.
null
bir değişken değil , birebirdir
null
atanabilen bir türdür ": 1) null
(kodda) boş değerdir , boş tür değil 2) Tipler genel olarak Java'da değişkenlere atanamaz, bkz. JLS 4.1: " [... ] [...] değişkenlerinde saklanabilen iki tür veri değeri: ilkel değerler (§4.2) ve referans değerleri (§4.3). " Değişken aracılığıyla atanabilen boş referanstırnull
. ... devamı ...
length
ve alt sınıflarını içeren dizilerjava.awt.geom.Point2D
.
Kesinlikle hayır: null instanceof Object
yanlış döndürür.
Hayır, bu bir nesne değil.
Null, bir nesnenin olmamasıdır.
JRL şunu yazdı:
Hayır değil, ...
Sıklıkla, nereye baktığınıza, kime daha çok inandığınıza bağlıdır.
JLS'ye göre evet, öyle . Özellikle soruyu şu şekilde yeniden ifade ederseniz: " null
Yazı tipi Object
mi?". Yukarıda Michael Borgwardt tarafından alıntılanan JLS 4.1'e ek olarak :
Bkz. JLS 3.10.7 :
Boş bir değişmez değer her zaman boş türdendir.
ve JLS 4.10 :
T türünün alt türlerinin tümü U türleridir, öyle ki T, U'nun bir süper türü ve boş türdür.
veya JLS 4.10.2 :
Null türünün doğrudan süper türleri , boş türün kendisi dışındaki tüm başvuru türleridir .
[Benim tarafımdan vurgular.]
Eclipse 2019-09'un derleyicisine göre şu değil :
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
OpenJDKs göre 12.0.1 javac
öyle :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Köşeli parantezlerin null
bunun ilkel bir türden farklı olduğunu ima ettiği yerde. Ve JLS 4.1'e göre :
Java programlama dilinde iki tür tür vardır: ilkel türler (...) ve başvuru türleri (...).
eğer biri değilse, diğeri.
Claudiu şunu yazdı:
null biraz çirkin.
Au contraire, null
güzeldir. Bunun yerine bir referans türü değişkeni için varsayılan değer olarak ne önerirsiniz? Keyfi bit kombinasyonu? Erişim ihlaline veya daha da kötüsü işaretçi cehennemine hoş geldiniz!
Joachim Sauer şunu yazdı:
null bir tür ve değerdir.
Aslında null ile bağlantılı üç öğe vardır (ayrıca bkz. JLS 3.10.7 ):
null
Değişmezi .(1) Yukarıda belirtilen JLS 4.10.2'ye göre , boş tipin yalnızca arayüzler için değil sınıflar için de çoklu kalıtım kullandığına dikkat edin. Hepimizin bildiği gibi uygulama programcıları için mümkün değildir.
(2) Boş değişmez , şu şekilde tanımlanan bir değişken olarak düşünülebilir:
JVM_global final null_type null = new null_type();
Ayrıca JLS 3.9'a dikkat edin :
Çeşitli karakter dizilerinin bazen yanlış bir şekilde anahtar kelime olduğu varsayılır:
null
bir anahtar kelime değil, boş değişmezdir ( §3.10.7 ).
null instanceof <any type>
JLS 4.10.2 akılda tutularak (" boş tip, her türden bir alt tiptir") null instanceof <any type>
değerlendirilmeli true
, değil mi? İlk bakışta evet, ancak JLS 15.20.2 içgörü cevabını veriyor:
[...] sonuç ait
instanceof
operatörü olantrue
değeri ise bir RelationalExpression değilnull
[...]. Aksi takdirde sonuç olurfalse
.
[Benim tarafımdan vurgular.]
Kendinize neyin daha mantıklı olduğunu sorun (bir uygulama programcısının bakış açısından):
Verilmesi false
ve böylece bir referans ifadesi bize maruz bir tür olmadığını belirten bize yararlı bir şey başvuran değil belirten yani
ya da true
bize ifadenin özel bir referansa göre değerlendirildiğini bildiren boş referans , var olup olmadığını bilmediğimiz ve adı olmayan özel boş tipte olan bir "nesneye" atıfta bulunur , maruz kalmaz. bize ancak boş literal aracılığıyla, çoklu kalıtım içeren herhangi bir türden bir alt tür midir ve yine de göz ardı edilmelidir? Daha pratik bir örneği de düşünün:
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.
Bu da şunlara yol açar:
instanceof
hakkında bir şeyler söylemenin uygun bir yolu değil null
?instanceof
Değil denir sameorsubtypeof
. Bu, bir örneğin türünü iki türle değil, bir türle karşılaştırdığımız anlamına gelir. Şimdi şu null
anlama gelir: "Örnek yoktur" ve örnek yoksa, örneğin türü yoktur. Hiçbir şeyi bir şeyle karşılaştırmanın yol açacağı açık false
.
Veya "daha" gerçek dünya örneğinde:
Michael'ın özetlediği gibi: "boş değer özeldir".
Bölüm 4.1 Java Dil Spesifikasyonunun Türleri ve Değerleri bölümünde açıklandığı gibi , null, tek bir değere sahip bir türdür, boş referans (ve değişmez değerle temsil edilir null
):
İfadenin adı olmayan özel bir boş tip
null
de vardır. Boş tipin adı olmadığı için, boş tipte bir değişken bildirmek veya boş tipe dönüştürmek imkansızdır. Boş başvuru, boş tipteki bir ifadenin olası tek değeridir. Boş başvuru her zaman herhangi bir başvuru türüne dönüştürülebilir. Uygulamada, programcı boş türü görmezden gelebilir ve sadecenull
herhangi bir referans türünde olabilen özel bir değişmez değermiş gibi davranabilir .
Yine de (benim önermediğim) Boş Nesne Kalıbı hakkında okumak isteyebilirsiniz . Bu kalıp hakkında daha fazla bilgi için C2 Wiki veya Wikipedia'ya bakın.
Hayır. Öyle olsa bile, herhangi bir yöntemi ve alanı olmadığı için faydasızdır.
Hayır, bir nesne değildir, çünkü null nesnesi her zaman yanlış döndürür, ayrıca her sınıf için bir tane değil, yalnızca bir boş değer vardır.
null instanceof <anytype>
geri dönecek false
.
Göre Java Spec ,
Ayrıca, herhangi bir başvuru türü için bir değer olarak kullanılabilecek özel bir boş hazır bilgi de vardır. null, ilkel türlerin değişkenleri dışında herhangi bir değişkene atanabilir. Varlığını test etmenin ötesinde boş bir değerle yapabileceğiniz çok az şey var. Bu nedenle, null genellikle programlarda bazı nesnelerin kullanılamaz olduğunu belirtmek için bir işaretçi olarak kullanılır.
Java, nesneleri referanslar yoluyla işler. Null, sizi OO seviyesinin altına düşürdüğü için Java'nın OO -luğunun bir dökümüdür. Hayır, bir nesne değil, referansın DEĞERİ. Ve nesne paradigmalarıyla hiçbir ilgisi yoktur, ancak nesneleri etkinleştiren Java tesisatıyla ilgilidir.
Null bir örneği java.lang.Object
mi? Hayır.
Null bir nesne mi? " eşittir " tanımına bağlıdır .
Object foo = null;
System.out.println(foo.toString());
İlk satır şovları null
yazıya atanabilir Object
, ancak ikinci satır bunun kesinlikle bir olmadığını gösterecek Object
ve sonunda birjava.lang.NullPointerException
Hayır, null
bir nesne değildir, bir referans türüdür ve değeri herhangi bir nesneye atıfta bulunmaz ve dolayısıyla null
bellekte temsili yoktur .
Object
, nesneyi değil ( bir tür örneğinde olduğu gibi ) (türü) istedi . Ve soruyu buna göre yeniden ifade edersek ...