Dizi Java'da bir nesne midir?


94

Java'da, aşağıdakileri kullanarak bir dizi bildirebiliriz:

String[] array = new String[10]; 
int size = array.length; 

Bu, dizinin kendisinin bir nesne olduğu anlamına mı geliyor? Soruyorum, çünkü C ++ 'da bir dizi sadece bir göstericidir ve herhangi bir metodu yoktur.


5
Hayır, C ++ 'da dizi bir dizidir ve bir dizi değildir.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
Oh, ve C ++ 'da, hem diziler hem de işaretçiler nesnelerdir.
R. Martinho Fernandes

2
@ R.MartinhoFernandes Tüm C ++ dizileri gerçekten C ++ nesneleridir, ancak C ++ nesneleri olmayan C ++ işaretçileri, yani bir r değerinin değerlendirilmesinin sonucu olan tüm işaretçiler vardır. Örnekler &x, p+ive içerir new int(42).
fredoverflow

1
@skaffman Mesaj, aksi takdirde derlenemeyeceği için kesinlikle gerekli değildir.
shmosel

Yanıtlar:



60

Evet; Java Dil Spesifikasyonu şunları yazar :

Java programlama dilinde diziler nesnelerdir (§4.3.1), dinamik olarak oluşturulur ve Object (§4.3.2) türündeki değişkenlere atanabilir. Object sınıfının tüm yöntemleri bir dizi üzerinde çağrılabilir.


Dizi bir nesneyse, bu bir sınıfın örneği olduğu anlamına gelmez mi? Eğer öyleyse, bu dersi uzatabilir miyim?
Bir İki, 3

9
Hayır, olmaz: Java belirtimi şöyle yazar : "Bir nesne, bir sınıf örneği veya bir dizidir. Bir sınıf örneği, bir sınıf örneği oluşturma ifadesi tarafından açıkça oluşturulur (§15.9). Bir dizi, bir dizi oluşturma ifadesi tarafından açıkça oluşturulur (§15.10). ". Ve hayır, bir diziyi genişletemezsiniz çünkü extends cümlesinin bir ClassType içermesi gerekir .
meriton

36

Peki, Java'ya soralım!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

Çıktı:

true
true

1
int[] someIntegers = {42};Aynı sonuca da beyan edebilirsiniz .
Holger

7

Evet, Java'da bir nesnedir.

Ayrıca, bunu array.lengthyaptığınızda herhangi bir yöntemi çağırmadığınızı, sadece dizinin lengthalanına eriştiğinizi unutmayın . Arrays sınıfında birçok statik yöntem vardır .


3

Java'daki dizilerin nesnelerle paylaşmadıkları kendi bayt kodlarına sahip olduğuna dikkat etmek önemli olacaktır. Kesinlikle Nesnelerdir, ancak düşük düzeyde biraz farklı şekilde ele alınırlar.


2

Cevabın evet olduğunu söyleyebilirim, ancak şunu da ekleyebilirim, bir dizi de C ++ 'da bir nesnedir. Mevcut standardın (FDIS) §1.8 [intro.object] öğesinden:

Bir nesne , bir depolama bölgesidir.



1

Java'daki her dizi bir nesnedir ex int [] a = new int [2]; Yani new bir nesne oluşturmak için kullanılır ve bir nesne olduğu için sınıf adını sadece a.getClass () kullanarak kontrol edebiliriz. GetName ();


1
  1. Dizi, sınıf ağacında listelenen herhangi bir sınıfın örneği değildir, ancak her dizi bir nesnedir ve doğrudan java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Sınıf java.util.Arrays, yardımcı bir sınıftır ve diziler bu sınıfın örnekleri değildir.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Sınıf java.lang.reflect.Array, yardımcı bir sınıftır ve diziler bu sınıfın örnekleri değildir.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Diziler tüm üyelerini devralır java.lang.Object

  2. Diziler, clone()miras alınan yöntemi geçersiz kılar Object.

  3. Diziler length, dizinin bileşenlerinin sayısını içeren alanı uygular . uzunluk pozitif veya sıfır olabilir. Öyle publicve final.

  4. Diziler arabirimleri uygular Cloneableve java.io.Serializable.

8a. Diziler tarafından desteklenmektedir Class<T>. Örneği Class<T>bir dizi örneğinden alabilirsiniz

(new int[2]).getClass()

veya bir dizi türünden

int[].class

8b. java.lang.Class<T>Kodunuzdaki her farklı dizi türü için benzersiz bir yansıma sınıfı örneği (yani bir örneği ) oluşturulur. Örnekler

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Tekrarlamak gerekirse: Diziler nesnelerdir ancak sınıf ağacındaki herhangi bir sınıfın örnekleri değildir.

REFERANSLAR

Java spesifikasyonundan Bölüm 4.3.1 Nesneler

  • Bir nesne, bir sınıf örneği veya bir dizidir.

  • Bir sınıf örneği, bir sınıf örneği oluşturma ifadesi tarafından açıkça oluşturulur.

  • Bir dizi, bir dizi oluşturma ifadesi tarafından açıkça oluşturulur.

Gönderen java.util.Arrays

  • Bu sınıf, dizileri işlemek için çeşitli yöntemler içerir (sıralama ve arama gibi)

Gönderen java.lang.reflect.Array

  • Array sınıfı, Java dizilerini dinamik olarak oluşturmak ve bunlara erişmek için statik yöntemler sağlar.

Gönderen Bölüm 10.1 Nesneler

  • Bir dizi türünün doğrudan üst sınıfı Object.

  • Her dizi türü arabirimleri uygular Cloneableve java.io.Serializable.

Gönderen Bölüm 10.7 Dizi Üyeleri

Bir dizi türünün üyeleri aşağıdakilerin tümüdür:

  • Dizinin lengthbileşenlerinin sayısını içeren genel son alan . uzunluk pozitif veya sıfır olabilir.

  • cloneSınıfta aynı adın yöntemini geçersiz kılan Objectve hiçbir denetlenen istisna atmayan public yöntemi . Dönüş türü clonebir düzen tipinde bir yöntem T[]olup T[].

  • Çok boyutlu bir dizinin klonu sığdır, yani sadece tek bir yeni dizi yaratır. Alt diziler paylaşılır.

  • Object sınıfından miras alınan tüm üyeler; Nesnenin miras alınmayan tek yöntemi klon yöntemidir.


1

Her şeyin dizileri nesnelerdir. Bir gibi yöntemleri çağırabilir equals, hashcodevb:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

Yerel tipte yöntemler çağrılamaz.


0

Aşağıdaki kod parçacığını ve çıktısını inceleyin.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

açıkça dizi a , nesne olarak kabul edilir.


0

Evet, dokümanlar öyle diyor:

Dizi, tek tipte sabit sayıda değeri tutan bir kap nesnesidir.

İlkel türlerin dizi türlerinin ( int[]veya gibi char[]) kendilerinin de nesneler olduğunu unutmayın.

Her dizi doğrudan java.lang.Objectarabirimleri genişletir ve uygular javs.lang.Cloneableve java.io.Serializable. Bir dizinin çalışma zamanı türü imzası, [Lhemen bileşen türünün sınıf adını takip eder (örn. [Ljava.lang.String). İlkel tür dizileri aşağıdaki çalışma zamanı imzasına sahiptir:

  • [Biçin byte[];
  • [Siçin short[];
  • [Iiçin int[];
  • [Jiçin long[];
  • [Fiçin float[];
  • [Diçin double[];
  • [Ciçin char[].
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.