1.1 Sınıf tanımlamaları (Declare Classes)

Ne zaman Java’da kod yazarsanız yazın, aslında ya bir sınıf (class) ya da bir arayüz (interface) yazıyorsunuzdur. içlerinde de değişkenler, methodlar ve benzerleri olabilir. Fakat sizin Sınıfları, metodları, değişkenleri tanımlama yönteminiz, kodun gidişatını dramatik şekilde değiştirebilir. Örneğin bir değişken tanımlanırken önüne gelecek olan “public” anahtar kelimesi, değişkeni her taraftan çağrılabilir-erişilebilir hale getirecektir. Tam tersine “private” anahtar kelimesini kullandığınızda bulunduğu sınıf dışarısından erişilmesine imkan tanımayacaktır. Kulağınıza basit gelebilir fakat derine indiğimizde aslında ne kadar çok bilgimiz dışında kural olduğunu göreceğiz.

Kaynak kod dosyasının tanımlanma kuralları Source file declaration rule)

-> Bir kaynak kod dosyasında sadece bir tane public ile nitelenmiş sınıf olabilir.
-> Yorumlar sayfanın en başında ya da en sonunda ya da herhangi başka bir alanda da olabilir. Yorumlar, kodlardan tamamen bağımsızdır.
-> Eğer bir kaynak dosyada public anahtar kelimesi ile nitelenmiş bir sınıf varsa, o sınıf ile kaynak dosya adı eşleşmek zorundadır. Örneğin public class Araba[} şeklinde bir sınıf tanımlanmışsa, içinde bulunduğu kaynak kod dosyasının adı mutlaka ve mutlaka Araba.java olmak zorundadır.
-> Eğer bir sınıf, bir paketin içerisinde yer alıyorsa paketin adı ilk satırda tanımlanmak zorundadır.
-> Eğer sınıfımıza farklı paketler-sınıflar import edilecekse, bu tanımlamalar paket tanımlaması ile sınıf tanımlaması arasında yapılmalıdır.
-> Bir kaynak dosya birden fazla sayıda public olmayan java sınıfı içerebilir.

Değiştiriciler (Class Declarations and Modifiers)

İç sınıflar ( inner-nested classes ) dersinde zaten işleyeceğiz fakat bir sınıf değiştirici (modifier) olmadan da tanımlanabilir. Örneğin class Araba{ } tanımlanması, derleyici tarafından derlenir ve herhangi bir hata almaz.

Değiştiriciler ikiye farklı kategoriye ayrılır. Erişim değiştiricileri ( Access modifiers) ve Erişim olmayan değiştiriciler (Non-access modifiers)

Access Modifiers : public private, protected
Non-access modifiers : including strictfp, final, and abstract

Javada 4 farklı erişim seviyesi (level of access) vardır fakat 3 tane erişim değiştiricisi tanımlanmıştır. Dördünce erişim seviyesinin adı “Varsayılan erişim seviyesi (default access)” dir. Bir diğer adı da “package access” dir.

Diğer bir değişle her sınıf, her method, her örneklenmiş değişken (instance variable) bir erişim kontrolü ile tanımlanır. Siz bir tip belirtseniz de belirtmeseniz de.

Sınıf erişimi (Class access)

Soru: Bir sınıfın (A), diğer başka bir sınıfa (B) erişimi var denildiğinde bundan ne anlarsınız? Buradan A sınıfı ile ilgili 3 farklı sonuç çıkar.

1- B sınıfının bir örneğini (instance) oluşturmuştur.
2- B sınıfından extend olmuştur ( kalıtım dersinde işleyeceğiz )
3- B sınıfı içerisinde yer alan değişken ya da methodlar, dışarıya erişime açıktır.

Varsayılan erişim (Default access)

Varsayılan erişim ile tanımlanmış bir sınıfta bir ön tanımlamaya gerek ya da ihtiyaç yoktur. Üstelik default access seviyesi ile “package-level-access” yani paket seviyesi erişimi aynıdır. Bunun anlamı da varsayılan erişim düzeyindeki bir sınıf sadece aynı paketteki diğer sınıflar tarafından erişilebilir. Farklı pakette bulunan sınıflar, varsayılan erişim düzeyindeki sınıflara erişemezler.

Bir örnek ile açıklayacak olursa, farklı paketlerde bulunan A ve B sınıflarından A sınıfı varsayılan (default access) erişimine sahip iken, farklı pakette bulunan B sınıfı, A sınıfını göremez, erişemez.

Aşağıdaki kaynak kodu inceleyelim.

  1.     package cert;
  2.     class Beverage { }

Şimdide diğerini inceleyelim

  1. package exam.stuff;
  2. import cert.Beverage;
  3. class Tea extends Beverage { }

Eğer bu kodu çalıştırmayı denerseniz

“Can’t access class cert.Beverage. Class or interface must be
public, in same package, or an accessible member class.
import cert.Beverage;”

şeklinde bir yanıt alırsınız yani Tea sınıfını derleyemezsiniz.

Süper sınıf olan Beverage varsayılan erişim seviyesine sahip ve farklı bir pakette yer alıyor. Onları aynı pakete almalısınız…

Genel erişim (Public Access)

Bir sınıfa public ön tanımlaması yaparsanız, bu sınıf diğer tüm paketlerden ya da sınıflardan çağrılabilir, erişilebilir hale gelecektir. Fakat çağırdığınız sınıfı kaynak kodunuza import etmeyi unutmamalısınız.

Diğer erişimler (Nonaccess)

Bir sınıf final anahtar kelimesiyle tanımlanıyorsa, bir başka sınıf tarafından extends edilemez.. Kalıtım yoluyla olan erişimi, sınıf tanımlamalarında final anahtar kelimesi engeller.

Peki biz neden Final anahtar kelimesini, bir sınıf için kullanırız?

Sınıf içerisinde tanımlanan yordamların (methods) hiçbirinin overriden (geçersiz) olmayacağının garantisinin verilmesi istenildiği zamanlar için kullanılır.

Aynı şekilde hem final anahtar kelimesi hem de abstract anahtar kelimesi aynı sınıf için kullanılamaz. Aynı durum yordam (method) tanımlamaları için de geçerlidir. Eğer bir metodu, final olarak tanımlarsanız, bu method kendisinden kalıtılan (extend) hiçbir sınıf içerisinde değişikliğe(implementasyonu) uğratılamaz.

** String sınıfı final ile tanımlanmıştır. Final olmadığını ve kalıtılabildiğini düşünün, neler olabilirdi?

Not : Nesne tabanlı programlama diline pek uygun olmadığı için, bir sınıfın final anahtar kelimesiyle işaretlenmesi genellikle tavsiye edilmez

Bir başka sınıf erişimlerini tanımlayan anahtar kelime strictfp ‘tir. strictfp anahtar kelimesi, java kodunuzun farklı platformlarda aynı float değerinin oluşturulmasını sağlar. Eğer strictfp kullanmazsanız, bu konuda java virtual machnine (Java Sanal Makinası) bu değeri belirlemede serbesttir.

Soyut sınıflar (Abstract Classes)

Soyut sınıfların erişim bölümünde bilinmesi gereken ilk kural, Abstract sınıfların örneklendirilmesini (instantiated) yapılamayacağı. Yani abstract olarak tanımlanmış SoyutNesne sınıfı, “new SoyutNesne()” cümleciği ile “instantiated” edilemez.

Peki neden “istantiated” edilmeyen bir sınıf var? İsterseniz bu durumu örnekle açıklayalım. Bir araba sınıfınız var fakat fakat farklı Vehicle(araçlarda) farklı davranması gereken jenerik metodlarınız(yordamlarınız) mevcut. Eğer Abstract sınıflar olmasaydı, implementasyonlar nasıl yapılabilirdi ?

  1.  
  2. abstract class Car {
  3.  private double price;
  4.  private String model;
  5.  private String year;
  6.  public abstract void goFast();
  7.  public abstract void goUpHill();
  8.  public abstract void impressNeighbors();
  9. }

Yukarıda oluşturduğumuz adı “Car” olan sınıfı “new Car()” cümleciği ile yeni bir örneğini oluşturduğunuzda aşağıdaki hatayı alırsınız.

  1.  
  2. AnotherClass.java:7: class Car is an abstract
  3. class. It can't be instantiated.
  4. Car x = new Car();
  5. 1 error

Burada dikkat etmemiz gereken diğer durum ise, methodların tanımları yapılmadan noktalı virgül ile sonlandırılmaları. Bu metodların içerikleri, bu sınıftan kalıtılan diğer sınıflar tarafından belirlenecektir.

Unutmamamız gereken bir husus da soyut (abstract) olarak bir method tanımlanacaksa, bu mutlaka soyut bir sınıf içerisine olmalıdır. Aksi durumda hata alınır fakat tam tersi, soyut olan bir sınıfa, soyut olmayan bir method eklenebilir.

Son olarak bir sınıf hem soyut(abstract) hem de final anahtar kelimesiyle birlikte tanımlanamaz. Zaten tanımlanabiliyor olması anlamsız olurdu çünkü final olan kendisinden kalıtılmasına müsaade etmezken, abstract sınıf tam da tersi için var



*** *** Rica*** ***

Merhaba, cep telefonları için bir uygulama yazdım. Uygulamamın başarılı olması için onu android marketten indirir misiniz? Kesinlikle virüs ya da benzeri tehlikeler içermemektedir.
Aslında faydasız bir uygulama da değil. Allah korusun, acil durumlarda kan ararsanız eğer, şehre ve kan grubuna göre kan arama uygulaması. indirmek için lütfen : tıklayınız

*** *** Rica*** ***