Czy null an Object
w Javie?
Null
( właściwie cecha ) mający tylko jedną instancję null
.
null instanceof Object
jest fałsz, ale typeof(null)
zwraca 'object'
. Czy w takim razie jest to przedmiot? Kto wie.
Czy null an Object
w Javie?
Null
( właściwie cecha ) mający tylko jedną instancję null
.
null instanceof Object
jest fałsz, ale typeof(null)
zwraca 'object'
. Czy w takim razie jest to przedmiot? Kto wie.
Odpowiedzi:
Gdyby null był obiektem, obsługiwałoby metody java.lang.Object
takie jak equals()
. Jednak tak nie jest - każde wywołanie metody dla wartości null powoduje utworzenie pliku NullPointerException
.
Oto, co na ten temat ma do powiedzenia specyfikacja języka Java :
Istnieje również specjalny typ null, typ wyrażenia null, który nie ma nazwy. Ponieważ typ null nie ma nazwy, nie można zadeklarować zmiennej typu null ani rzutować na typ null. Odwołanie o wartości null jest jedyną możliwą wartością wyrażenia typu null. Odwołanie o wartości null można zawsze rzutować na dowolny typ odwołania. W praktyce programista może zignorować typ null i po prostu udawać, że null jest tylko specjalnym literałem, który może być dowolnego typu referencyjnego.
Myślę, że można to sprowadzić do stwierdzenia, że „zero jest wyjątkowe”.
java.lang.Object
. Praktycznie - tak. Nie możesz stworzyć klasy, która nie jest podklasą java.lang.Object, ale nigdy nie myślałem o tym z bardziej filozoficznego punktu widzenia
NullPointerException
wspomina o » null
obiekcie«… :) Ale z drugiej strony można było również mówić o »zerowych wskaźnikach«…
Według Java specyfikacji , null
to typ, który może być przypisany do zmiennej obiektowej (jako wartość jak zauważono w komentarzu). Nie możesz jednak tworzyć instancji ani tworzyć zmiennych tego typu, musisz użyć literału null
dostarczonego przez kompilator.
null
Nazwa to „przypadek” w null
rodzaju, widocznie.
null
nie jest zmienną, jest literałem: JLS, 3.10.7. The Null Literal
null
to typ, który można przypisać ": 1) null
(w kodzie) to literał zerowy , a nie typ pusty 2) Typów nie można przypisać do zmiennych w języku Java w ogólności, patrz JLS 4.1: " Istnieją [... ] dwa rodzaje wartości danych, które mogą być przechowywane w zmiennych [...]: wartości pierwotne (§4.2) i wartości odniesienia (§4.3). " Jest to odwołanie zerowe, które można przypisać za pomocą null
literału. ... cd ...
length
i podklasy java.awt.geom.Point2D
.
Absolutnie nie: null instanceof Object
zwraca fałsz.
Nie, to nie jest przedmiot.
Brak jest brakiem obiektu.
JRL napisał:
Nie, nie jest, ...
Jak często, zależy to od tego, skąd na to patrzysz, w kogo bardziej wierzysz.
Według JLS tak, jest . Zwłaszcza jeśli przeformułujesz pytanie na: „Czy null
typ jest dosłowny Object
?”. Oprócz JLS 4.1 cytowanego powyżej przez Michaela Borgwardta:
Zobacz JLS 3.10.7 :
Literał null jest zawsze typu null.
i JLS 4.10 :
Podtypy typu T to wszystkie typy U takie, że T jest nadtypem U i typem zerowym.
lub JLS 4.10.2 :
Bezpośrednie typy nadrzędne typu null są wszystkimi typami odwołań innymi niż sam typ null.
[Podkreśla przeze mnie.]
Według kompilatora Eclipse 2019-09 to nie jest :
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
Według OpenJDKs 12.0.1 javac
jest to :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Gdzie nawiasy ostre sugerują, że null
jest to inny typ niż pierwotny. I zgodnie z JLS 4.1 :
W języku programowania Java istnieją dwa rodzaje typów: typy pierwotne (...) i typy referencyjne (...).
jeśli to nie to, to jest drugie.
Claudiu napisał:
null jest trochę brzydkie.
Au contraire, null
jest piękna. Co zamiast tego sugerowałbyś jako wartość domyślną dla zmiennej typu referencyjnego? Dowolna kombinacja bitów? Witamy w naruszeniu dostępu lub, co gorsza, w piekle wskaźnikowym!
Joachim Sauer napisał:
null to typ i wartość.
W rzeczywistości istnieją trzy elementy w połączeniu z wartością null (patrz także JLS 3.10.7 ):
null
Dosłowny .(1) Należy zauważyć, że zgodnie z cytowanym powyżej JLS 4.10.2 typ zerowy wykorzystuje wielokrotne dziedziczenie nie tylko dla interfejsów, ale także dla klas. Co wszyscy wiemy, nie jest możliwe dla nas, programistów aplikacji.
(2) Pusty literał można sobie wyobrazić jako zmienną zdefiniowaną jako:
JVM_global final null_type null = new null_type();
Zwróć też uwagę na JLS 3.9 :
Czasami błędnie zakłada się, że za słowa kluczowe są różne sekwencje znaków:
null
nie jest słowem kluczowym, ale raczej literałem zerowym ( §3.10.7 ).
null instanceof <any type>
Mając na uwadze JLS 4.10.2 („ typ null jest podtypem każdego typu”) null instanceof <any type>
powinno się oceniać true
, prawda? Na pierwszy rzut oka tak, ale JLS 15.20.2 daje wgląd w odpowiedź:
[...] wynikiem tego
instanceof
operatora jesttrue
, jeśli wartość w RelationalExpression nie jestnull
[...]. W przeciwnym razie wynik jestfalse
.
[Podkreśla przeze mnie.]
Zadaj sobie pytanie, co ma większy sens (z punktu widzenia programisty aplikacji):
Podanie false
i tym samym wskazanie, że wyrażenie referencyjne nie jest typem dla nas ujawnionym, tj. Wskazanie, że nie odwołuje się do niczego użytecznego dla nas
lub podając true
, w ten sposób informując nas, że wyrażenie zwraca się do specjalnego odniesienia, odniesienia zerowego , odnoszącego się do "obiektu", nie wiemy, czy on w ogóle istnieje i który jest specjalnego typu null, który nie ma nazwy, nie jest wystawiony my, ale czy poprzez literał null podtyp jest dowolnego typu, w tym dziedziczenie wielokrotne i czy i tak ma być ignorowany? Rozważ także bardziej praktyczny przykład:
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.
Co również prowadzi do:
instanceof
nie można powiedzieć czegoś o null
przedmiotowości we właściwy sposób ?Nazywa się instanceof
nie sameorsubtypeof
. Oznacza to, że porównujemy typ instancji z typem, a nie dwoma typami. Teraz null
oznacza: „Nie ma instancji”, a jeśli nie ma instancji, nie ma typu instancji. To oczywiste, że porównywanie niczego z czymś ma prowadzić false
.
Lub w „bardziej” realnym przykładzie:
Jak podsumowuje Michael: „null jest naprawdę wyjątkowe”.
Jak wyjaśniono w rozdziale 4.1 Rodzaje typów i wartości specyfikacji języka Java, null to typ, który ma jedną wartość, odwołanie zerowe (i jest reprezentowane przez literał null
):
Istnieje również specjalny typ null , typ wyrażenia
null
, który nie ma nazwy. Ponieważ typ null nie ma nazwy, nie można zadeklarować zmiennej typu null ani rzutować na typ null. Odwołanie o wartości null jest jedyną możliwą wartością wyrażenia typu null. Odwołanie o wartości null można zawsze rzutować na dowolny typ odwołania. W praktyce programista może zignorować typ zerowy i po prostu udawać, żenull
jest to tylko specjalny literał, który może być dowolnego typu referencyjnego.
Możesz jednak przeczytać o wzorcu obiektu zerowego (którego nie polecam). Zobacz C2 Wiki lub Wikipedia, aby uzyskać więcej informacji na temat tego wzorca.
Nie. Nawet gdyby tak było, jest bezużyteczne, ponieważ nie ma żadnych metod ani pól.
Nie, nie jest obiektem, ponieważ null instanceof Object zawsze zwróci false, również istnieje tylko jedna wartość null, a nie jedna dla każdej klasy.
null instanceof <anytype>
wróci false
.
Zgodnie ze specyfikacją Java ,
Istnieje również specjalny literał o wartości null, którego można użyć jako wartości dla dowolnego typu odwołania. null można przypisać do dowolnej zmiennej, z wyjątkiem zmiennych typu pierwotnego. Niewiele można zrobić z wartością zerową poza testowaniem jej obecności. Dlatego wartość null jest często używana w programach jako znacznik wskazujący, że jakiś obiekt jest niedostępny.
Java obsługuje obiekty za pośrednictwem odwołań. Null to podział OO-ności Javy, ponieważ spada poniżej poziomu OO. Nie, to nie jest przedmiot, to WARTOŚĆ odniesienia. I nie ma to nic wspólnego z paradygmatami obiektów, ale odnosi się do hydrauliki Javy, która umożliwia tworzenie obiektów.
Czy null jest wystąpieniem java.lang.Object
? Nie.
Czy null jest obiektem ? zależy od definicji „ jest ”.
Object foo = null;
System.out.println(foo.toString());
Pierwsza linia pokazuje null
może być przypisana do typu Object
, ale druga linia zademonstruje, że z pewnością nie jest Object
i ostatecznie daje w wynikujava.lang.NullPointerException
Nie, null
nie jest obiektem.Jest to typ referencyjny, a jego wartość nie odwołuje się do żadnego obiektu, więc nie ma reprezentacji null
w pamięci.
Object
, a nie obiekt (jak w przypadku typu ). A jeśli ktoś odpowiednio przeformułuje pytanie ...