04 Declare Class Members – 01

Merhaba Arkadaslar
Bu yazimda Java’da Class Members (methods , instance (non-local) variable) tanimlanmasi hakkında bilgi vereceğim.

Access Modifiers

Methodlar ve instance variable’lara 3 access modifier da uygulanir.
public
private
protected
ve tabi ki bunlardan biri kullanilmazsa varsayilan olarak package level (default) uygulanir.

Bunlardan default ve protected birbiriyle neredeyse aynidir. Ilerleyen kisimlarda farkından bahsedecegim.

public uyeler

Halka acik public metotlara ve değişkenlere tum siniflardan erişim mumkundur. Tabiki ulasacagimiz metodun veya değişkenin sinifina ait bir referans değişkenimiz araciligiyla ulaşabiliriz.
ikinci olarak siniflar farkli paketlerde ise mutlaka ulasilan sinifi import etmek gerekir. Dolayisiyla Java ayni paket altinda ayni isimde iki sinif tanimlanmasina izin vermez.

A.java

package purejava;

import purejava2.B;

public class A {

	public static void main(String[] args) {

		B b = new B();
		System.out.println("Class A - " + b.var2 + " " + b.var1);
		b.method1();

	}

}

B.java

package purejava2;

public class B {
	public int var1=1995;
	public String var2="Java";

	public void method1() {
		System.out.println(var2+" "+var1);
	}
}

A ve B siniflari farkli paketlerde olmasina ragmen, A sinifi B sinifinin public sinif degiskenlerine ve metotlarina ulasabilir ulasabilir.

private uyeler
private metotlara ve sinif degiskenleri sadece ayni sinifta kullanabiliriz. Disaridan herhangi bir ulasim soz konusu degildir.  Bir sinif diger bir sinifin ozelliklerini kalitim ile alsa private degiskenlere ve metotlara ulasim soz konusu olamaz. Yani private degiskenler ve metotlar kalitilamazlar.

B sinifindaki degiskenleri ve metodu private yapalim,

B.java

package purejava2;

public class B {
	private int var1=1995;
	private String var2="Java";

	private void method1() {
		System.out.println(var2+" "+var1);
	}
}

A sinifi ile B sinifi ayni pakette olmalarina ve A sinifi B sinifini extends etmesine ragmen yine de private uyelere ulasim
saglanamayacaktir bununla birlikte private metotu override etmemize izin vermeyecektir.

A.java

package purejava;

import purejava2.B;

public class A extends B{

	public static void main(String[] args) {

		B b = new B();
		System.out.println("Class A - " + b.var2 + " " + b.var1);
		b.method1();

		private void method1() {
			System.out.println(var2+" "+var1);
		}

	}

}

protected ve default uyeler

protected ve default erisim seviyeleri genellikle aynidir. Bir default uyeye sadece ayni paket icerisindeki bir siniftan ulasilabilir ayni sekilde bir protected uyeye de. Peki fark nerede ortaya cikmaktadir , kalitimin soz konusu oldugu yerlerde .

Ornek siniflarimiz uzerinde inceleyelim…
B sinifimizda protected ve default uyeler var.

B.java

package purejava2;

public class B {
	protected int var1 = 1995;
	protected String var2 = "Java";
	int var3=15;

	protected void method1() {
	}
	void method2() {
	}
}



A.java

package purejava;

import purejava2.B;

public class A extends B {

	public void test() {
		B b = new B();
		System.out.println(var1 + " " + var2);
		method1();
		// System.out.println(var3);
		// method2(); default metoda ulasilamaz - compile error

		// System.out.println(b.var1+ " " +b.var2); compile error
		// b.method1(); referans degisken ile ulasilamaz
		// b.method2(); referans degisken ile default metoda ulasilamaz

	}

}

class C extends A {
	public void getProtectedC() {
		method1();
		var1 = 20;
		// var3=10;  // compile error
		// method2();  // compile error
	}
}

class D {
	public void getProtectedD() {
		// method1();
		// method2();
		// var1=20;
		// var3 = 10;
	}
}

A sinifindaki kodlari inceleyim..

  • A ve B siniflari farkli paketlerdedir ve A sinifi B sinifini kalitmaktadir.
  • A sinifinda kalitim araciligiyla B sinifinda protected olarak tanimlanan var1 ve var2 degiskenlerine erisim saglanabilir.
  • Ayni sekilde protected metoda kalitim araciligiyla erisim saglanabilir.
  • Buna ragmen default degiskenlere ve default metotlara kalitim araciligiyla erisim saglanamaz.
  • Referans degisken araciligiyla ( b , referans degiskeni )  protected degiskenlere ve metotlara erisim saglanamaz.
  • Referans degisken araciligiyla default degiskenlere ve metotlara erisim saglanamaz.
  • C sinifi A sinifini extends ettigi icin , B sinifinda bulunan protected degerlere kalitim vasitasiyla ulasabilir. ( C sinifi A sinifini extends ettigi surece, farkli paketten dahi bu degerlere ulasabilir ) . Buna ragmen default degiskenlere ve metotlara erisim saglanamaz.
  • D sinifi A sinifiyla ayni pakette olmasina ragmen , A sinifinin B sinifindan kalitim araciligiyla kalittigi , eristigi degisken ve metotlara erisim saglayamaz. Normal sartlarda protected degiskenlerlere ayni pakette ulasim saglanabilirken burada neden ulasim saglanamadi ? Cunku A sinifi kalitim ile aldigi bu protected degisken ve metotlar, A sinifi disinda( D sinifi icin) private duruma gelir.

Durumu ozetleyen tablomuz
java-access-to-class-member

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*
*