it-swarm-tr.com

Java'da null nedir?

null nedir?

null bir şeyin örneği midir?

null hangi gruba ait?

Hafızada nasıl temsil edilir?

234
unj2

Boş bir şeyin örneği mi?

Hayır, null öğesinin instanceof olduğu bir tür yoktur.

15.20.2 Tip Karşılaştırma Operatörü instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

Çalışma zamanında, RelationalExpression değeri instanceof değeri değilse ve başvuru, ReferenceType öğesinin altına alınabiliyorsa true operatörünün sonucu null olur. ClassCastException dosyasını yükseltmeden. Aksi takdirde sonuç false olur.

Bu, herhangi bir E ve R tipi için, E o için, o == null, o instanceof R'nin her zaman false olduğu anlamına gelir.


'Null' hangi kümeye aittir?

JLS 4.1 Tür ve Değerlerin Çeşitleri

Özel bir null türü de vardır, null ifadesinin türü, adı yoktur. null türünün adı olmadığından, null türündeki bir değişkeni bildirmek veya null değerini kullanmak imkansızdır. türü. null başvurusu, null türündeki bir ifadenin tek olası değeridir. null referansı her zaman herhangi bir referans türüne atılabilir. Uygulamada, programcı null türünü görmezden gelebilir ve null öğesinin yalnızca herhangi bir başvuru türünde olabilecek özel bir hazır bilgi olduğunu farz edebilir.


Null nedir?

Yukarıdaki JLS alıntılarının dediği gibi, pratikte "bunun yalnızca herhangi bir referans türünde olabilen özel bir hazır bilgi" olduğunu iddia edebilirsiniz.

Java'da, null == null (bu her zaman diğer dillerde geçerli değildir). Ayrıca, sözleşmeyle, bu özel özelliğe de sahip olduğunu unutmayın (--- Java.lang.Object ):

public boolean equals(Object obj)

-_null referans değeri x, x.equals(null), return false olmalıdır.

Ayrıca tüm referans türleri için varsayılan değerdir (bunlara sahip değişkenler için):

JLS 4.12.5 Değişkenlerin İlk Değerleri

  • Her sınıf değişkeni, örnek değişkeni veya dizi bileşeni, oluşturulduğunda bir varsayılan değeri ile başlatılır:
    • Tüm referans türleri için varsayılan değer null'dir.

Bunun nasıl kullanıldığı değişir. Bir alanın başlangıçtaki null başlangıç ​​değerine sahip olduğu alanların tembel olarak başlatılması alanını etkinleştirmek için kullanabilirsiniz. hesaplamak için pahalı olabilir).

Başka kullanımlar da var. Gerçek bir örnek alalım Java.lang.System :

public static Console console()

Döndürür : Varsa sistem konsolu, aksi takdirde null.

Bu çok yaygın bir kullanım şeklidir: null, bir nesnenin var olmadığını belirtmek için kullanılır.

İşte başka bir kullanım örneği, bu sefer Java.io.BufferedReader :

public String readLine() throws IOException

Döndürür : Herhangi bir satır sonlandırma karakteri içermeyen satır içeriğini içeren bir String veya akışın sonuna ulaşılmışsa null.

Yani, burada, readLine(), her bir satır için instanceof String değerini, nihayet sonu belirtmek için null değerini döndürene kadar döndürür. Bu, her satırı aşağıdaki gibi işlemenizi sağlar:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

Biri API'yi sonlandırma koşulu readLine() döndüren null'ye bağlı olmayacak şekilde tasarlayabilir, ancak bir kişi bu tasarımın özlü hale getirme avantajına sahip olduğunu görebilir. Boş satırlarla ilgili sorun olmadığını unutmayın çünkü boş bir satır "" != null.

Başka bir örnek alalım, bu sefer Java.util.Map<K,V> :

V get(Object key)

Belirtilen anahtarın eşlendiği değeri veya bu harita anahtar için eşleme içermiyorsa null değerini döndürür.

Bu harita null değerlerine izin veriyorsa, null dönüş değeri mutlaka haritanın anahtar için eşleme içermediğini göstermez; Ayrıca harita açıkça anahtarı null ile eşleştirir. Bu iki durumu ayırt etmek için containsKey işlemi kullanılabilir.

Burada null 'nin kullanılmasının işleri nasıl karmaşıklaştıracağını görmeye başlıyoruz. İlk deyim, anahtar eşlenmezse, null işlevinin döndürüldüğünü söylüyor. İkinci ifade, anahtar eşlense bile, null öğesinin ayrıca döndürülebileceğini söylüyor.

Buna karşılık, Java.util.Hashtablenull anahtarlarına ve değerlerine izin vermeyerek işleri basitleştirir; V get(Object key), null değerini döndürürse, açıkça anahtarın eşlenmemiş olduğu anlamına gelir.

API'lerin geri kalanını okuyabilir ve nerede ve nasıl null'nin kullanıldığını bulabilirsiniz. Her zaman en iyi uygulama örnekleri olmadığını unutmayın.

Genel olarak, null, işaret etmek için özel bir değer olarak kullanılır:

  • Başlatılmamış durum
  • Fesih durumu
  • Var olmayan nesne
  • Bilinmeyen bir değer

Hafızada nasıl temsil edilir?

Java’da mı? Endişenlerin hiçbiri. Ve en iyisi bu şekilde tutulması.


null iyi bir şey midir?

Bu şimdi sınırda öznel. Bazı insanlar null öğesinin kaçınılabilecek birçok programcı hatasına neden olduğunu söylüyor. Bazıları, Java gibi NullPointerException'yi yakalayan bir dilde, programcı hatalarında hızlı bir şekilde başarısız olacağınız için onu kullanmanın iyi olduğunu söylüyor. Bazı insanlar Null nesne kalıbı , vs. kullanarak null öğesinden kaçınırlar.

Bu başlı başına büyük bir konudur, bu yüzden en iyisi başka bir sorunun cevabı olarak tartışılır.

Bunu, null 'nin kendisinin mucidinden bir alıntı ile bitireceğim, C.A.R Hoare (quicksort şöhretinden):

Milyar dolarlık hatam diyorum. 1965'te null referansının icadıydı. O zaman ilk kapsamlı tip sistemi tasarlıyordum. nesne yönelimli bir dilde referanslar için (ALGOL K). Amacım, derleyici tarafından otomatik olarak yapılan kontrollerle referansların tüm kullanımının kesinlikle güvenli olmasını sağlamaktı. Ancak, uygulanması çok kolay olduğu için, null referansına girme eğilimine karşı koyamadım. Bu, son kırk yılda muhtemelen bir milyar dolarlık acı ve hasara neden olan sayısız hata, güvenlik açığı ve sistem çökmesine neden oldu.

bu sunumun videos daha derinlere gider; önerilen bir saat.

298

Boş bir şeyin örneği mi?

Hayır. Bu nedenle null instanceof X, tüm sınıflar için false değerini döndürür X. (Türünü bir nesne türü olan bir değişkene null atayabileceğiniz gerçeği kanmayın, bu atama kesin bir tür dönüşümü içerir; aşağıya bakın.)

'Null' hangi kümeye aittir?

Boş türün şu şekilde tanımlandığı boş türün tek ve tek üyesidir:

"Özel bir boş tür de var, boş ifadenin türü, ad yok. Boş boş adın adı olmadığı için boş tür bir değişken tanımlamak imkansız null türüne atılmak için null başvuru, null türündeki bir ifadenin tek olası değeridir.Null başvuru her zaman herhangi bir başvuru türüne atılabilir. sadece herhangi bir referans türünde olabilen özel bir hazır bilgidir. "JLS 4.1

Null nedir?

Yukarıyı görmek. Bazı bağlamlarda, null "nesne yok" veya "bilinmeyen" veya "kullanılamıyor" anlamına gelir, ancak bu anlamlar uygulamaya özeldir.

Hafızada nasıl temsil edilir?

Bu uygulamaya özeldir ve saf bir Java programında null gösterimini göremezsiniz. (Ancak null, tümü Java uygulamasının tümü değilse, sıfır makine adresi/işaretçisi olarak gösterilir.)

30
Stephen C

null nedir?

Bu hiçbir şey değil.

null herhangi bir şeyin örneği midir?

Hiçbir şey olduğu gibi hayır Hiçbir şeyin örneği olamaz.

null değeri hangi gruba aittir?

Set yok

Bellekte nasıl temsil edilir?

Bazı referanslar şöyle gösteriyorsa:

Object o=new Object();

Yığın hafızasında yeni oluşturulan nesneye atanan bir alan var. Ve o bellekteki atanmış alana işaret edecektir.

Şimdi o=null;

Bu şimdi o nesnenin o hafıza alanına işaret etmeyeceği anlamına gelir.

14
Sanjay Jain

Hayır, hiçbir şeyin örneği değil, anında her zaman yanlış olacak.

9
Tom

Null anahtar sözcüğü, null bir başvuruyu temsil eden bir hazır bilgidir, herhangi bir nesneyi ifade etmeyen . null, başvuru türü değişkenlerinin varsayılan değeridir.

Ayrıca belki bir göz atın

null: Java Sözlük

7
Adriaan Stander

Java'da boş (tm)

C ve C++ 'da "NULL", bir başlık dosyasında tanımlanan bir sabittir;

    0

veya:

    0L

veya:

    ((void*)0)

derleyici ve hafıza modeli seçeneklerine bağlı olarak. NULL, kesinlikle konuşmuyor, C/C++ 'ın bir parçası değil.

Java (tm) 'da "null" bir anahtar kelime değil, null türünün özel bir değişkenidir. Herhangi bir referans türüne atılabilir, ancak int veya boolean gibi herhangi bir ilkel tür için kullanılamaz. Boş değer değişkeni mutlaka sıfır değere sahip değildir. Ve null türüne yayın yapmak veya bu tür bir değişken bildirmek imkansızdır.

6
p27

Boş, herhangi bir sınıfın örneği değil.

Bununla birlikte, herhangi bir (nesne veya dizi) türdeki değişkenlere null atayabilirsiniz:

 // this is false   
 boolean nope = (null instanceof String);

 // but you can still use it as a String
 String x = null;
 "abc".startsWith(null);
6
Thilo

Bayt kodu gösterimi

Java'nın null doğrudan JVM desteğine sahiptir: uygulamak için üç komut kullanılır:

  • aconst_null: ör. null olarak bir değişken ayarlamak için Object o = null; içinde olduğu gibi
  • ifnull ve ifnonnull: ör. bir nesneyi null ile if (o == null) içinde olduğu gibi karşılaştırmak için

Bölüm 6 "Java Sanal Makine Talimat Seti" daha sonra null'ın diğer talimatlar üzerindeki etkisinden bahseder: birçoğu için NullPointerException 'ı atar.

2.4. "Referans Türleri ve Değerleri" ayrıca genel terimlerle null ifadesini kullanır:

Bir referans değeri ayrıca, burada null ile gösterilecek olan hiçbir nesneye referans olmayan özel null referans olabilir. Boş başvuru başlangıçta çalışma zamanı türüne sahip değildir, ancak herhangi bir türe atılabilir. Bir referans türünün varsayılan değeri null.

null özel bir değerdir, hiçbir şeyin örneği değildir. Açıkçası bir nedenden ötürü instanceof hiçbir şey olamaz.

4
fastcodejava

null, herhangi bir sınıfın örneği olmayan özel bir değerdir. Bu, aşağıdaki program tarafından gösterilmektedir:

public class X {
   void f(Object o)
   { 
      System.out.println(o instanceof String);   // Output is "false"
   }
   public static void main(String[] args) {
      new X().f(null);
   }
}
3
Itay Maman

Java içindeki null, C++ 'daki nullptr benzeri/benzer.

C++ programında:

class Point
{
    private:
       int x;
       int y;
    public:
       Point(int ix, int iy)
       {
           x = ix;
           y = iy;
       }
       void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
    Point* p = new Point(3,5);
    if (p != nullptr)
    {
       p->print();
       p = nullptr;
    }
    else
    {
        std::cout << "p is null" << std::endl;
    }
    return 0;
}

Java da aynı program:

public class Point {
    private int x;
    private int y;
    public Point(int ix, int iy) {
        x = ix;
        y = iy;
    }
    public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
    public static void main(String[] args) {
        Point p = new Point(3,5);
        if (p != null)
        {
            p.print();
            p = null;
        }
        else
        {
            System.out.println("p is null");
        }
    }
}

Şimdi yukarıdaki kodlardan Java'da null değerinin ne olduğunu anlıyor musunuz? Eğer hayır ise, C/C++ ile işaretçileri öğrenmenizi tavsiye ederim ve sonra anlayacaksınız.

C++ 'ta C++' dan farklı olarak, nullptr undefined un, ancak NULL 'un onun yerine C++' da da kullanılabileceğini unutmayın, ancak C++ nullptr 'de NULL' dan daha çok tercih edilir, çünkü C 'deki NULL her zaman işaretçilerle ilgilidir ve bu C++ 'da "ptr" soneki, Word'ün sonuna eklenmiştir ve ayrıca tüm harfler şimdi küçük harftir, ancak bu daha az önemlidir.

Java öğesinde, ilkel olmayan her tür sınıf değişkeni, her zaman bu tür nesneye başvurur veya kalıtsaldır ve boş, boş sınıf nesne başvurusudur, ancak boş gösterici değildir, çünkü Java var böyle bir "pointer" gibi bir şey yoktur, fakat bunun yerine sınıf nesnelerine referanslar kullanılır ve Java içindeki null sınıf nesne referanslarıyla ilişkilidir, bu nedenle "nullref" veya "nullrefobj" olarak da adlandırılabilir, ancak bu uzun, bu yüzden sadece "boş" deyin.

C++ 'da isteğe bağlı members/değişkenler için işaretçileri ve nullptr değerini kullanabilirsiniz; yani, değeri olmayan üye/değişken ve değeri yoksa o zaman nullptr değerine eşittir, bu yüzden null =Java örneğin kullanılabilir.

2
user2133061

Java'da iki ana tür kategori vardır: ilkel ve başvur. İlkel bir tür depo değeri bildirilen değişkenler; başvuru türü mağaza başvuruları bildirilen değişkenler.

String x = null;

Bu durumda, başlatma ifadesi “x” değişkenlerini bildirir. “X” String referansını saklar. Burada null. Her şeyden önce, null geçerli bir nesne örneği değil, bu nedenle ayrılan bellek yok. Bu sadece nesne referansının şu anda bir nesneye göndermediğini gösteren bir değerdir.

1
Anand

Tüm sorularınızı JLS'den resmen yanıtlayan kısa ve kesin cevap:

3.10.7. Boş Literal

Null türü bir değere sahiptir, null değişmezi null ile temsil edilen null başvurusu, ASCII karakterinden oluşur.

Bir boş değişmez her zaman boş tiptir.

Yalnızca null'a atanmış bir tür referansı atanır. Referansa herhangi bir değer (nesne) atamazsınız. Bu tahsisat JVM'ye ne kadar referans alacağına ve hangi hafıza alanına tahsis edileceğine özeldir.

0

Bence bence Java içinde boş görmenin ilginç bir yolu, bilginin eksikliğini göstermeyen, sadece herhangi bir tür referansa atanabilecek değişmez bir değer olarak görmesidir. Eğer bu bilgi eksikliğini gösterirse, a1 == a2 'nin doğru olup olmadığını düşünürseniz, gerçekten HİÇ bir nesneye işaret edebildikleri için (her ikisine de null değeri verilmişse) mantıklı gelmez. hangi nesnelere işaret etmeleri gerektiğini bilmiyorum) ... null == null bu arada Java’da doğru. Eğer Java ör. SQL gibi olacaktı: 1999 sonra null == null bilinmeyecek şekilde geri dönecekti (SQL'de boolean bir değer: 1999 üç değer alabilir: doğru, yanlış ve bilinmeyen ancak pratikte bilinmeyen gerçek sistemlerde boş olarak uygulanır) ... http://en.wikipedia.org/wiki/SQL

0
Bat0u89