Merhaba.static metodun override edilememesinin sebebi nedir?aşağıdakı kodu incelersek şu neticeye geliriz: static bir metod override edilmeye çalışıldığında metod gizletiliyor ama override edilmiyor.

public class A {
    public static void something () {
      System.out.println("A class");
    }
}

public class B extends A {
    public static void something () {
        System.out.println("B class");
    }
    public static void main(String args[]){
        A ref = new B ();
        ref.something (); 
    }
}

consolda : A class yazacak.Demek ki,override edilmemiş eğer override edilseydi consolda B class çıkardı.metodlardan static kelimelerini silip run edersek bunu göre biliriz.peki metodun override edilmemesine sebep nedir?derinlemesine anlatırsanız çok sevinirim.Teşekkürler

soruldu: 07 Eki '12, 08:47

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

değiştirildi: 07 Eki '12, 11:02

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


Gercek hayattan bir örnek vererek aciklamaya calisayim. Banka subenize gidip, para cekmek istediginizde her seferinde baska bir veznedar ile karsilasabilirsiniz, cünkü sube calisanlari veznedar olarak ta görev alabilirler. Siz bankaya gitmeden önce (program calismaya baslamadan; runtime) hangi veznedarla karsilasacaginizi bilemessiniz. Bu yüzden veznedarin calisma tarzini kestirmeniz mümkün olamaz. Buna Java gibi dillerde dynamic ya da late binding ismi veriliyor. Sinif tipine göre istenilen metot kosturulur. Hangi sinif icin hangi metodunun kosturulacagina program calismaya basladiktan sonra karar verilir, cünkü bu bilgi sinif tipine göre degismektedir. Bu yüzden late binding...

Veznedar degisse de, sizin icin degismeyen subenin nerede oldugudur. Örnegin subeye girmek icin binanin kapisini kullanirsiniz. Bu bilgi sizin icin sabittir, degismez. Kapinin nerede oldugunu bilirsiniz. Buna Java gibi dillerde early binding ismi verilmektedir. Static bir metoda sadece sinif ismini kullanarak erisebilirsiniz. Yani sube kapisi gibi static metodun yeri, yurdu bellidir. Bu bilgiyi degistiremessiniz, cünkü derleyici (compiler) bu bilgiye sahip oldugu icin early binding mekanizmasi ile hangi metodun kosturulacagini tayin etmistir. Bu yüzden static metotlari tekrar reimplemente etmeniz mümkün degildir. Programi kosturan mantik her zaman sinifin sahip oldugu static metodu kosturacaktir, bu metodu alt sinifta reimplemente etmis olsaniz bile.

EOF (End Of Fun)

Özcan Acar

permanent link

cevaplandı: 07 Eki '12, 11:42

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183
cevap kabul oranı: 52%

eger B ref=new B(); ref.something(); yazsaydim program nerden bile bilir ki,hangi metodu cagirsin.A clasindan extend olani mi yoksa B clasindaki metodumu.denedim ve B clasindakini cagiriyor.ama isimler farkli olsaydi A-dakini cagiracakti.yani normalde her iki metodu ref referansi ile gore biliyor.ama cagirdigi zaman B-deki metodu cagiriyor

(07 Eki '12, 12:45) Serxan Serxan's gravatar image

B ref = new () olsaydi B'nin something() metodu kosturulurdu. A ref; olarak tanimlandigi icin A'nin something() metodu kosturuluyor. Önemli olan burada degiskenin hangi veritipi ile tanimlandigi. Hangi veritipi (sinif) kullanildi ise, o sinifin static metodu kosturulur.

(07 Eki '12, 12:49) özcanacar ♦♦ %C3%B6zcanacar's gravatar image

Inheritence OOP(Object Oriented Programming) konseptlerinden(Abstraction, Polymorphism, Inheritance, Encapsulation) bir tanesidir. Bir sınıftan instance oluşturduğumuzda o sınıfa ait örnek bir nesne oluşturmuş oluruz, ki bu nesne ile OOP kapsamında her şeyi yapabiliriz. Yani sınıfa ait static olmayan metod veya fieldlara -erişim belirleyicileri kısıtında- erişebilir, iş yaptırabiliriz.

Static field veya metodlar ise çağırılırken bir sınıf instance'ı oluşturmaya gerek yoktur. Çünkü static metodlar sınıf örneği üzerinde değil de sınıfın kendine direk bağlıdır. @özcanacar hocanın'da dediği gibi bu early binding ile sağlanır. (Yani sınıf içinde önce static alanlar çalıştırılır). Dolayısıyla bir bakıma OOP dışındadır. OOP dışında olan bir konu için ise tam anlamıyla Inheritance'dan(miras alır ancak yeni özellik ekleyemez), dolayısıyla da metod overriding'ten bahsedilemez.

Buradaki 42-45 arası soruların cevabını incelemeni tavsiye ederim.

permanent link

cevaplandı: 09 Eki '12, 05:52

mabulgu's gravatar image

mabulgu ♦
2.8k43040
cevap kabul oranı: 26%

değiştirildi: 09 Eki '12, 05:58

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×13

Soruldu: 07 Eki '12, 08:47

Görüntüleme: 1,815 kez

Son güncelleme: 09 Eki '12, 05:58

powered by BitNami OSQA