Java’da Sınıfları String Olarak Gösterme (toString Metodu)

Daha önceki yazılarımdan birisinde Java’da her sınıfın aslında bir String karşılığı olduğunu belirtmiştim. Bu yazıda bu konuyu genişçe ele almaya çalışalım.

Öncelikle, mevcut durumda neler oluyor görmek için Java’nın mevcut sınıflarının print metodunda nasıl gözüktüğüne bir göz atalım.

// Öncelikle bilinen birkaç sınıftan nesne yaratalım
Integer int1 = new Integer(10);
Double double1 = new Double(25.36);
int arr[] = {1, 2, 4};
ArrayList list = new ArrayList();
list.add(3);

// Bu nesneleri konsola yazdıralım
System.out.print("int1: ");
System.out.println(int1);
System.out.print("double1: ");
System.out.println(double1);
System.out.print("arr: ");
System.out.println(arr);
System.out.print("list: ");
System.out.println(list);

Yukarıdaki kod parçasın bilinen birkaç Java sınıfının nesnelerini konsola yazdırıyor. Konsol çıktısı;

int1: 10
double1: 25.36
arr: [I@42e816
list: [3]

Ben konsola yazdırmak istemiyorum programımın içerisinde String olarak kullanmak istiyorum diyenler için bir örnek;

String listStr = list.toString();

Bu örnek aslında konunun özünü vermiş oldu. Evet, Java’da ister mevcut sınıflar, ister kendi tanımladığımız sınıflar olsun, kullandığımız her sınıf bir toString metoduna sahip. Metodun kaynağı ise her sınıfın en tepesindeki ata sınıfı olan Object sınıfı. toString metodu kalıtımsal olarak tüm sınıflara taşınıyor.

Bazı sınıflar toString metodunu kendince yeniden düzenlerken, bazı sınıflar hiç değiştirmeden Object sınıfının toString metodunun içeriğini kullanabiliyor.

Object sınıfının toString metodunun içeriği ise şöyle;

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Görüldüğü üzere String nesnesi, sınıf ismi, ‘@’ karakteri ve sınıfın hash kodunun birleşiminden oluşuyor.

Şimdi kendimiz bir sınıf oluşturalım ve sınıfın String gösterimine bakalım;

public class Person {
	public String name;
	public int age;
}

Görüldüğü üzere 2 elemana sahip basit bir Person sınıfı. Hemen nesnesini yaratıp şu haliyle String gösterimine bakalım.

Person mert = new Person();
mert.name = "Mert";
mert.age = 15;
String mertStr = mert.toString();

System.out.print("Mert'in String Gösterimi: ");
System.out.println(mertStr);

// Doğrudan
// System.out.println(mert);
// şeklinde de kullanılabilir.

Kod parçasının konsol çıktısı;

Mert'in String Gösterimi: Person@190d11

Görüldüğü gibi Object sınıfının toString metodu çalıştı. Şimdi toString metodunu kendimize göre yeniden yazalım (Object sınıfının toString metodunu Person sınıfında Override etmiş oluyoruz).

public class Person {

	// ... Sınıfın diğer kısımları

	public String toString() {
		return name + "in yaşı " + age + "'tir.";
	}
}

Önceki kod parçasının yeni konsol çıktısı artık şöyle oluyor;

Mert'in String Gösterimi: Mertin yaşı 15'tir.

Tüm anlattıklarımın geçerli olmadığı kavramlar da var tabii ki. Tüm primitif tipler (int, double vs.) bu konunun dışında kalmakta. Sebebi çok basit; primitif tipler Object sınıfından türemezler. Birer sınıf değillerdir, dolayısıyla nesneleri de oluşmaz. Object sınıfından türemedikleri için toString metoduna da sahip değillerdir (aslında sınıf olmadıkları için herhangi bir metodları da yoktur :)). Sonuç olarak, primitif tiplerin String gösterimleri yukarıda bahsettiğim yollarla olmaz.

Peki primitif tipler nasıl String haline dönüşür? Hemen bir örnekle sonlandıralım;

int int2 = 3;
String int2Str = "" + int2;
double double2 = 2.5;
String double2Str = "" + double2;

System.out.print("int2: ");
System.out.println(int2);
System.out.print("double2: ");
System.out.println(double2);

ve konsol çıktısı;

int2: 3
double2: 2.5

Ve sanırım bu kadar 🙂

Bu yazıda Java’da sınıfların String gösterimlerini elimden geldiğince anlatmaya çalıştım. Umarım herkes için faydalı bir yazı olmuştur.

Java İpucu #2 – Java Konsola Yazı Yazdırma

Biraz da Java’ya yeni başlayan arkadaşlarımız için kısa bilgilendirme amaçlı yazılar yazmak istedim. Bir programlama dilini öğrenirken ilk öğrendiğimiz konudan başlayalım: Konsola yazı yazdırma.

Bir yazıyı ekrana nasıl basacağımızı gösteren küçük bir kod parçası yazalım;

System.out.println("Konsola basılacak ilk yazı");
String printTxt = "Konsola basılacak ikinci yazı";
System.out.println(printTxt);
System.out.print("Bundan sonra yazılacak yazı yanına gelecek - ");
System.out.print("Bir önceki yazının yanına gelecek yazı");

1. satırda println metodu doğrudan stringi argüman alarak konsola basıyor ve alt satıra geçiriyor. İngilizce açılımını print line (satır yaz) olarak düşünebiliriz. 3. satırda println metoduna 2. satırda oluşturduğumuz string nesnesini argüman olarak veriyoruz. 1. satırla benzer sonuç doğuruyor. 4 ve 5. satırlardaki print metodunun println metodundan farkı, gelen argümanı konsola bastıktan sonra alt satıra geçmeden bir sonraki ekrana yazma işleminin aynı satırdan devam etmesi.

Kod parçasının konsol çıktısı şu şekilde;

Konsola basılacak ilk yazı
Konsola basılacak ikinci yazı
Bundan sonra yazılacak yazı yanına gelecek - Bir önceki yazının yanına gelecek yazı

print ve println metodları String parametresinin yanında, diğer tüm primitive (int, char vb.) tipleri parametre olarak alabiliyor. Ayrıca bu metodlara Java kütüphanelerinde bulunan ya da kendi oluşturduğunuz tüm sınıfları da argüman olarak verebiliyorsunuz. Nasıl mı? Java’da tüm sınıfların ata sınıfı Object sınıfıdır. Ve bu sınıf çok sihirli bir metoda sahiptir: toString. Yani, tüm sınıflarınızın bir String karşılığı var. Bu metodu isterseniz kendi sınıfınızda override ederek içeriğini siz yazabilirsiniz. Bu işlemi yapmazsanız Object sınıfı sizin için bir gösterim yapıyor. Çok da anlamlı olmayabilir sizin için tabi 🙂

Hemen örnek kod;

Object o = new Object();
System.out.println(o);

ve konsol çıktısı;

java.lang.Object@42e816

Çıktının içeriği çok da önemli değil (meraklıları için söyleyeyim; sınıfın paket ismiyle beraber ismi ve hash kodu). Ama her sınıfın bir String karşılığı var bunu bilin yeter 🙂

Uyarı!

Bu noktadan sonrası tamamen meraklı ve usta kullanıcılar içindir. Uyarmadı demeyin 🙂

Örnek kod parçalarındaki

System.out.println

satırını irdeleyelim biraz. Bu satırda aslında, System sınınıfın out alanının println metodunu çağırıyoruz. System sınıfı nesnesi oluşturulamayan ve türetilemiyen bir sınıf  (final class). out, System sınıfının static bir alanı (değişkeni) ve PrintStream tipinde. print ve println metotları ise aslında PrintStream sınıfının metodları. Kendileri de static tabii ki 🙂

Uyarı Sonu

Basit bir konuyu çok da karmaşıklaştırmamak için daha detaya girmek istemiyorum. Diğer yazılarda yeri geldikçe yeniden değinmeye çalışırım. Herkese iyi çalışmalar.