SORU
19 Mart 2015, PERŞEMBE


Nasıl benim Java başlarken "SomeType olmadan nesne Yazdır@2f92e0f4" muyum;?

Bir sınıfı aşağıdaki gibi tanımlanmış

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

Benim sınıfın bir örneğini yazdırmak için çalıştı:

System.out.println(myPerson);

ama şu çıktıyı aldım: com.foo.Person@2f92e0f4. Benzer bir şey yapmaya çalışırken oldu Person nesneleri bir dizi yazdırmak için:

Person[] people = //...
System.out.println(people); 

Çıktıyı aldım: [Lcom.foo.Person;@28a418fc

Bu çıkış ne anlama geliyor? Nasıl kişinin adını içeren bu çıkış değiştirebilirim? Peki bu nesnelerin baskı koleksiyonları mı?

Notbu konu hakkında kurallı bir S&amaçlanmıştır.

CEVAP
19 Mart 2015, PERŞEMBE


Arka plan

Tüm Java nesneleri çalıştığınızda çağrılan toString() bir yöntem, ve nesne yazdırın.

System.out.println(myObject);  // invokes myObject.toString()

Bu yöntem Object sınıfı (Java nesnelerinin üst sınıf) olarak tanımlanır. Object.toString() yöntemi oldukça çirkin bir dize, sınıf adı, @ bir sembol ve onaltılık nesne hashcode oluşan döndürür. Bunun için kod gibi görünür:

// Code of Object.toString()
public String toString() {
    return getClass().getName()   "@"   Integer.toHexString(hashCode());
}

com.foo.MyType@2f92e0f4 gibi bir sonucu olarak açıklanabilir:

  • com.foo.MyType sınıf adı, yani sınıf paketi com.foo 23*.
  • @ - birlikte dize katıldı
  • 2f92e0f4 nesnenin hashcode.

Dizi sınıflar adına iyi Class.getName() için Javadocs anlatılan biraz farklı görünüyor. Örneğin, [Ljava.lang.String anlamına gelir:

  • [ tek boyutlu bir dizi ([[ [[[ karşıt olarak vb.)
  • L - dizi sınıf ve arabirim içerir
  • java.lang.String - dizideki nesne türü

Çıktı özelleştirme

System.out.println(myObject), sen aradığında farklı bir şey yazdırmak için 62* *mutlaka kendi sınıfında toString() yöntemi. Burada basit bir örnek:

public class Person {

  private String name;

  // constructors and other methods omitted

  @Override
  public String toString() {
    return name;
  }
}

Şimdi ise Person, com.foo.Person@12345678 yerine kendi adını gördüğümüz bir basıyoruz.

toString() sadece aklınızda bulunsunbirbir dizeye dönüştürmek için bir nesne için bir yol. Genellikle bu çıkış tamamen açık ve öz bir şekilde nesne tanımlamak gerekir. Daha iyi Person sınıfına toString() olabilir

@Override
public String toString() {
  return getClass().getSimpleName()   "[name="   name   "]";
}

Baskı, örneğin, 43**. O/sınama ve hata ayıklama için veri çok yararlı bir parça.

Nesne sadece bir yönü üzerinde odaklanmak istiyorum ya da süslü biçimlendirme çok dahil ederseniz, daha iyi ayrı bir yöntem yerine, örneğin String toElegantReport() {...} tanımlamak için olabilir.


Otomatik oluşturuluyor Çıktı

63 ** çok otomobil üreten toString() yöntemi için destek, sınıfta alanlara göre sunuyoruz. Örneğin Eclipse IntelliJ için dokümanlar bakın.

Birkaç popüler Java kütüphaneleri de bu özelliği sunuyoruz. Bazı örnekler:


Nesnelerin baskı grupları

Sınıf toString() bir güzel yarattın. Eğer bu sınıf bir dizi veya koleksiyon içine yerleştirilmiş olması durumunda ne olur?

Diziler

Eğer nesneleri bir dizi varsa, Arrays.toString() dizinin içeriğini basit bir temsilini üretmek için arayabilirsiniz. Örneğin, Person nesnelerin bu dizi düşünün:

Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));

// Prints: [Fred, Mike]

Not: Bu bir çağrıstatikyöntem yukarıda tartıştığımız ne kadar farklı Diziler sınıfı toString() denir.

Eğer varsaçok boyutlu bir dizi, Arrays.deepToString() çıktı aynı tür elde etmek için kullanabilirsiniz.

Koleksiyonları

En güzel koleksiyonları bir çıkış her öğe üzerinde .toString() arama dayalı üretecek.

List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));    
System.out.println(people);

// Prints [Alice, Bob]

Sadece listenizi sağlamak için tüm öğeleri yukarıda anlatıldığı gibi toString() güzel bir tanımlama.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fouseyTUBE

    fouseyTUBE

    21 Mart 2011
  • Living Waters

    Living Water

    9 AĞUSTOS 2006
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007