Daha önceden biliyoruz ki sınıflarda private olan bir değişken ya da metod sadece kendi sınıfının diğer metodları
tarafından erişilebilir haldedir. Bununla beraber public sınıf elemanları, hem bu sınıfın diğer metodları, hem de bu
sınıf türünden yaratılmış olan nesneler tarafından, yani dışarıdan erişilebilir haldedir.
Eğer bir sınıfın veri elemanı sadece bu sınıfın kendi metodları ya da bu sınıftan türetilmiş sınıfların metodları ile
erişilebilir ancak dışarıdan erişilemez olsun isteniyorsa, böyle veri elemanlarının protected veri elemanı olarak
bildirilmesi gerekir. Bu durumda protected veri elemanlarının erişim bakımından public ve private veri elemanları
arasında bir seviyede olduğunu söyleyebiliriz.
Protected Metodlar
Bir sınfıfın bazı metodları protected olarak tasarlanabilir. Böyle metodlar da sadece sınıfı türeten alt sınıflar
içerisinde kullanılabilir ancak dışarıdan kullanılamazlar. Böylece sadece türetme yapan sınıflara güveniliyorsa ve
dışarıya kapatılmak isteniyora bir metod protected olarak tasarlanabillir. Bunun bir örneğini ileriki konularda
göreceğimiz Object sınıfının protected metdu olan “clone” metodunu incelreken göreceğiz.
Object Sınıfı
Şu ana kadar sınıfların türetilmesine ilişkin birçok şey öğrendik. O halde artık Java da temel bir sınıf olan Object
sınıfını da inceleyebiliriz. Java’da her şey bir nesnedir. Aslında bu tanım hem kavramsal hem de teknik anlamda
doğrudur.
Kavramsal olarak Java’da herşeyin bir nesne olduğunu zaten bu noktaya kadar tartıştık. Teknik olarak da Java’da
herşeyin bir nesne olması, Java’daki tüm tanımlı sınıfların aslında “Object” adı verilen özel bir sınıftan türemesi
anlamına gelmektedir.
Öyle ki sizin yazdığınız bir sınıf da aslında öntanımlı olarak Object isimli sınıftan türemiştir. 77
Object Sınıfının Metodlarının Yeniden Yazılması
Ayrıca daha önce öğrenmiş olduğumuz “function overriding” kendi yarattığımız sınıflarda Object sınıfının bazı
metodlarını kendi isteğimize göre sınıfımız içerisinde değiştirerek yazabiliriz. Aslında toString isimli metodun böyle
bir metod olduğunu bu noktada belirtmek gerekir.
Object sınıfının toString Metodu
toString metodu Object sınıfında yazılmış olan bir metoddur. Ancak daha önce de söylediğimiz gibi Java’da yazılan
her sınıf, hatta bizim kendi yazdığımız sınıflar da dahil, birer Object sınıfı kabul edildiğinden (yani otomatik olarak
bu sınıftan türediğinden), Object sınıfına ait olan bu metodları kendi başımıza yazabiliriz.
Object sınıfının finalize Metodu
finalize() isimli metod da Object sınıfına ait bir metoddur. Bu metodu da kendi sınıfımıza göre yazabiliriz. Ancak
daha önce bu metodun ne işer yaradığını bilmekte fayda var.
Önceden öğrendiğimiz gibi bir sınıf yaratıldığı zaman otomatik olarak uygun olan başlangıç metodu (constructor)
çağrılmaktadır. Ayrıca sistemde kullanılmayan nesnlerin de garbage collector yapısı ile otomatik olarak ortadan
aldırıldığını da söylemiştik.
İşte sınıflarda benzer şekilde bir sınıf ortadan kaldırılırken, yani işlevi sonlandırılırken de otomatik olarak çalğrılan bir
metod vardır. Bu metod finalize() isimli bir metoddur. O halde nasıl başlangıç metodu içerisine sınıfımızın birtakım
ilk işlemlerini yazıyorsak, finalize metodu içerisine de bir sınıf sonlanırken yapılması gereken son işlemleri
tanımlayabiliriz. Bu son işlemlere örnek olarak:
a) Daha önce açılmış bir dosyanın kapatılması
b) Daha önce yapılmış bir veri tabanının sonlandırılması
c) Daha önce açılmış bir session’ın sonlandırılması
d) Daha önceden kullanılan birtakım geçici değişkenlerin sonlandırılması
verilebilir.
Ancak şunu da belirtmek gerekir ki Java’da finzlize metodu Garbage Collector devreye girdiği zaman çağrıldığı için
bu metodu tam olarak ne zaman çağrılacağı bilinemez. Bu nedenle bazen öngörülemeyen sonuçlar ortaya çıkabilir.
O halde sonuç olarak kullanıcı aslında kendi istediği zaman çağırabileceği birtakım son işlemleri yapacak bir metodu
yine kendisi başka bir isimle yazabilir. Böylece son işlemler doğru sırada ve kullanıcının isteğine bağlı olarak
yapılacaktır. Bu da finalize metoduna olan gerekliliği ortadan kaldırmaktadır.
Bunun dışında Object sınıfında başka metodlar da vardır. Ancak bu metodlar ilerde öğreneceğimiz bazı kavramları
gerektirdiğinden şimdilik Object sınıfına bu kadar değineceğiz.
Object Sınıfına Her Nesne Atanabilir
Java’da herşeyin bir Object olduğunu tekrar hatırlayalım. Aslında Object isimli sınıf türünden bir değişkenin bu
nedenle her türden nesneyi tutabileceğini de söyleyebiliriz.
public class ObjectOrnek {

public static void main(String[] args) {

Object dizi[] = new Object[3];

dizi[0] = “string nesnesi”;
dizi[1] = new Integer(13);
dizi[2] = new Deneme();

} 78
}
class Deneme {

}
Yukarıdaki örnekte Object türünden bir dizi yarattık. Bir dizi içerisinde tüm elemanların aynı türden olması gerektiği
halde birbirinden farklı türleri nasıl oluyor da bir dizide saklayabiliyoruz? İşte bunun nedeni az önce söyledğim gibi
aslında her türün aynı zaman bir Object olmasından kaynaklanmaktadır.
class ObjectDeneme {

public static void main(String arg[]) {

Object ar[] = {new Deneme(), “String ekledik”, new Integer(12), new BaskaBirSinif()};
BaskaBirSinif temp = (BaskaBirSinif)ar[3];
System.out.println(temp.methodX());
/*Olmaz!*/
//ar[3].methodX();
}
}
class Deneme {
public static void methodY() {
System.out.println(“Deneme sinifi”);
}
}
class BaskaBirSinif {

public static String methodX() {
return “12″;
}
}
Soyut sınıflar
Soyut sınıf kavramı aslında tamamen türetme ile ilişkilidir. Bu nedenle soyut sınıfların anlamlı kullanılması aslında bir
türetme işleminin yapılmasını gerektirir. Türetme işlemini hatırlayacağımız gibi bir sınıf başka bir sınıfının değişken
ve metodlarını alabilmektedir. Böylece önceden yazılmış birtakım metod ve değişkenlerin yeraldığı bir sınıf varsa ve
biz de bu metod ve değişkenlere ihtiyaç duyuyor ve aynı zamanda yeni metod ya da değişkenler de eklemek
istiyorsak, mevcut sınıftan bir türetme yaparak sadece yeni eklemek istediğimiz metod ve değişkenleri yazmamız
yeterli olacaktır.
Bir sınıf içerisinde daha önce görmüş olduğumuz metod tanımlamalarından farklı olarak “soyut metod” denilen bir
metod şekli daha vardır. Bir metod soyut olarak yazılacaksa metod prototipinde public, private ya da protected 79
anahtar sözcüğünden sonra “abstract” anahtar sözcüğü yazılmadır. Ayrıca sınıf içerisinde bu şekilde prototipi
yazılan soyut metodun içerisine de hiçbirşey yazılmaz. Örneğin:
public abstract String ismiVer();
Yukarıdaki örnekte bir soyut metod bildirimi yapılmış ve içerisi yazılmadan noktalı virgül ile bildirim tamalanmıştır.
İkinci kural olarak da içerisinde soyut metod barındıran bir sınıftan türetilen yeni bir sınıf, bu soyut metodun
içerisini kendi içinde yazmak zorundadır. Aksi takdirde türetme işlemi hatalı sayılır. Sonuç olarak:
Soyut bir metodun temel sınıf içerisinde sadece prototipi yazılır.
Bu temel sınıftan türeyen bir sınıf sadece prototipi yazımış olan bu soyut metodu kendi içerisinde tamamen
yazmak zorundadır.
İçerisinde soyut metod barındıran sınıflara soyut sınıf denilir ve böyle bir sınıfın bildiriminin başına Class
anahtar sözcüğünden önce “abstract” yazılmak zorundadır.
Peki ama soyut metodların bu kullanımı ne işe yarar?
Sınıf bildirimi içerisinde yazılmış olan soyut metodların nasıl çalışacağı, ancak bu sınıftan türetilen sınıflar içerisinde
yazılmaktadır. Temel sınıf içerisinde bu metodların nasıl işleyeceklerinden ziyade geri dönüş değerlerinin ve
parametrelerinin ne oldukları yazılır. O halde içerisinde soyut metodlar barındıran bir sınıftan türetme yapıldığında,
ondan türeyen her sınıf içerisinde bu metodun yeniden yazılması gerekecek ve dolayısıyla bu sınıftan türeyen tüm
sınıfların böyle bir metod barındıracağı garanti edilmiş olacaktır.
Böylece birçok kişinin görev aldığı büyük bir projede yazılması kesinlikle gerekli olan ancak sadece işleyişi
değişebilen metodları temel bir sınıf içerisinde soyut olarak tanımlarsak ve yazılacak tüm yeni sınıfların da bu temel
sınıftan türetilerek yazılmasını şart koşarsak, herhangi bir kontrole gerek kalmaksızın yazılması zorunlu olan bu
metodların birbirinden bağımsız kişilerin tasarlayacağı tüm sınıflarda kesinlikle yer alacağından emin olabiliriz. Bu
durum aşağıdaki şekilde de özetlenmiştir:
Böylece kavramsal olarak soyut metod ve soyut sınıfın ne olduğunu yeterince incelediğimizi düşünüyorum. Şimdi
yukarıda okuduklarımız pekiştiren bir örnek yapalım. Bu örnekte soyut metod kullanımını içeridiği gibi aslında
türetme işleminin de güzel bir kullanımını göstermektedir.
Örneğimizde en temel olarak “Sekil” adında bir sınıf yeralmaktadır. Bu sınıf tüm geometrik şekillerin temelini teşkil
ettiğinden içerisinde yer alacak olan alanHesapla, cevreHesapla, kenarSayisiVer gibi metodların yazılması
anlamsızdır. Ancak bir geometrik şekil bu metodlara sahip olmalıdır. O halde biz “Sekil” sınıfınının bu metodlarını
soyut olarak tasarlayıp gerekli olan geometrik şekile ilişkin bir sınıfı da bu sınftan türetirsek, soyut olan bu metodları 80
ilgili şeklin özelliklerine göre yeniden yazabiliriz. Bu düşünceyle de örneğimizde “Sekil” sınıfından türeyen “Kare”,
“Ucgen” ve “Daire” sınıflarını da yazmaktayız: 81
Java ile Programlama
Arayüzler
Arayüzler aslında teknik olarak bir sınfın ne yapması gerektiğini anlatmaktadır. Yani aynen soyut sınıflarda olduğu
gibi, temel bir sınıfın operasyonlarını tanımlamak amacıyla tüm metodlarının soyut olması soncunda arayüzler
meydana gelir.
Bu bakış açısıyla ir arayüzün aslında tam anlamıyla bir sınıf olmaktan ziyade “yapılması gerkenler listesi” olarak
tanımlanması da mümkündür.