Kategoriler


SON YORUMLAR
Ömer
Bloguma bi göz atar mısınız? Nasıl? bitkideryasi.blogspot.com
Ahmet
Hocam ben sorumsuz bi insanım ders çalışamıyorum yapımdan dolayı egitim sisteminden yakınıyorum bu meslek için gerekli olmayan dersleri bile görmekten hep nefret ediyorum. belki çok iyi bi üniverste kazanamayabilirim ama oldum olası bu iş benim işim diyorum yani bilgisayarda oyun oynamakdan başka yaptıgım bişey yok henüz lise ögrencisiyim ama bu işten başkada işim olamaz benim yani ortalama bir üniversite den mezun olarak kendimi geliştirebilirmiyim sizce?
Bilg. Müh.
Moloz
Atesh
Gercekten mukemmel yazilmis elinize saglik bende allahin izniye birinci sinif olucam bu sene cok tesekkur ederim
Tatar Ramazan
Benden başka yorum yazan yok ki. Çok sıkııcı!..Bilgisayar mühendisliğini kimse umursamıyor site sahibinden başka..vah vah
Tatar Ramazan
LINQ to XML var sorgu = from fakulte in fakulteler.Descendants("Fakülte") from bolum in bolumler.Descendants("Bölüm") from ogrenci in ogrenciler.Descendants("Öğrenci") where (int)ogrenci.Element("bno") == (int)bolum.Element("bno") && (int)fakulte.Element("fno") == (int)bolum.Element("fno") group fakulte by new { Fadı = fakulte.Element("fadı").Value } into fgrup where fgrup.Count() b= (from bolum in bolumler.Descendants("Bölüm") from ogrenci in ogrenciler.Descendants("Öğrenci") where (int)ogrenci.Element("bno") == (int)bolum.Element("bno") group bolum by bolum.Element("fno").Value into bgrup select bgrup.Count()).Max() select new { _fakultead = fgrup.Key.Fadı, }; ListkOgrenciTablob liste = new ListkOgrenciTablob(); foreach (var item in sorgu) { liste.Add(new OgrenciTablo { Fakulte = item._fakultead }); }
Tatar Ramazan
Bilişim Uzmanlığım Aşağıdadır : Programlama Dili : C#, Java, ASP.NET, Silverlight, WPF, WCF, LINQ, XML, XSL, HTML, Javascript, CSS, JQuery, Ajax, Web Servisleri. Veritabanı : SQL Server, T-SQL, ADO.NET, Oracle 11g-PL/SQL, Reporting Services. Metodoloji : Nesne Yönelimli Programlama ve Üç Katmanlı Mimari Program : Ms Office, Adobe Reader. KPDS (Kamu Personeli Dil Sınavı) (89 Puan) 12.2010 YDS (Yabancı Dil Sınavı) (72 Puan) 09.2015 C# : Fundamentals of Programming, Functions, Object-Oriented Programming, Class, GUI Programming, Recursion, LINQ, Event-Delegate, Collections-Generic, Windows Forms, XML, File-Directory, Date Time, Reflection, WPF, WCF, Ado.Net, vs.. ASP.NET : Silverlight, Asp.Net-Html Controls, Response, Sessions, Cookie, Roles and Profiles, Configuration, Data Binding, Page Lifecycle, Validation, Authentication, Authorization, HttpWebRequest, Communication between Silverlight and Javascript vs.. TRANSACT SQL : SQL, View, Procedure, Function (scalar, table-valued), Trigger, Transaction, Index, Constraints, Cursor, String Functions, Analytical Functions, Data Convert Functions, T-SQL commands (If, Else, While vs), Set operations, Sequence Identity, Handling Errors vs..
Tatar Ramazan
Bilişim kadar güzel meslek mi var. Her yerinden meslek, uzmanlık fışkırıyor. Ofis programları mı dersin, .NET, Oracle, Java mı dersin, sistem-network mü dersin, Grafikerlik mi dersin, Çizim programları mı dersin...Gıcır gıcır renkli teknolojiler..Yaptığın ürünü iç piyasaya satamazsan yurtdışına satarsın..Gençler için yığınla iş ve uzmanlık alanı. Oturun çalışın işte..Hem para hem keyif...java2s.com diye site var..Bütün teknolojilerin bütün konularıyla ilgili A dan Z ye örnek koymuş adamlar. Bizim öğrenciliğimizde yoktu...Oturun çalışın bahane üretmeyin. Yeniden görüşüciiz...
EZS
Paylaştığınız bilgiler için teşekkürler. qushevaksesuar.blogspot.com
77.245.150.214
Amacım bu dünyaya yararlı olabilmek.Biliyorum derslerim kötü ama insan hedefine ulaşmak için elinden geleni yapar.Lise 3.sınıf öğrencisiyim evet çok kafam çalışmayabilir ama bu çalışmıcak anlamına gelmez.İnsan kendini geliştirebilir.Bu makale için çok teşekkür ederim.Gerçekten bakış açım değişti ve bir genci daha kurtardınız.İlerde iyi bir yere gelirsem unutmuyacağım.Cümleleri yazarken biraz saçmalamış olabilirim her neyse ADIMI IP niz yapıverdim. İLERDE ŞUNU DEMEK İSTİYORUM ZİRVEDEYİM CANIM DUYULMUYOSUN.:D
Tatar Ramazan
Kaç zamandır bilgisayar mühendisliğine saldırıyorum site sahibi ağzını açıp mesleğini savunamıyor. Sükut ikrardan gelir tabi..
Nur
Dokuz eylül ve özyeğin arasında kaldım. Lütfen yardım edin . Bana katkıları eğitimi iş olanağı vs açısından sizce hangisini seçmeliyim
Tatar Ramazan
Başlarım sizin boğaziçinize de bilkentinize de odtünüze de.. hiç biri bi bok olamıyor. Ali AĞAOĞLU gibi hödükler malı, kızları götürüyor. Millet sevgilisiyle fink atar siz de abaza abza gezersiniz. Mezun olunca da kızlar zıpırları tercih edecek zaten size vermeyecekler. Her şey görüntü bu devirde, diplomanız bi boka yaramaz. Kocaeli elektroniği bitirmiş bi adam vardı. 28 yaşında işsiz olarak askere gitmişti.
From Tatar Ramazan To Boun
He he kolaydı öyle kendi işini kurmak. Kolay olsaydı insanlar devlete ve özele girmek için birbirlerini ezercesine yarışmazlardı. Mezun olunca bilg. mühendisliğini, yazılımı övenlere, size boş vaatler sunanlara gıcık olacaksınız merak etmeyin. 70 bin bilişim uzmanı varmış, yok güzel meslekmiş de bilmem ne. Hepsi palavra. 10 tane teknolojiyi A dan Z ye biliyor olmama rağmen hala beni mülakatta afra tafra yapıyorlar diyorum anlamıyor musunuz? Bizim kuruma canavar gibi yazılımcılar özelden kaçtı geldi. 7-10 yıllık deneyimli olanlar bile. Ege mezunu, ODTÜ mezunu ilk 2000 girmiş adamlar vs.. Zamanında memur olduk da yırttık. Özel firmaların kucağına düştün yandın. Yanlış konuşuyorsam çevrenizden 30 yaş üstü yazılımdan köşeyi dönen adamları gösterin bana o zaman..Yeniden görüşüciiz.

Bilgisayar Mühendisleri
Here is the website inspired me to use 
it as a guide when I tried to define 
myself as an engineer candidate a few 
years ago. It really helped me to work
 and study feeling in confidence with 
being on the right way. I suggest this 
website to whom it may direct her/his 
to find the right career path. It 
includes many articles varies from 
real life experiences to detailed 
software engineering issues. But the 
most dignified parts for me are the 
articles in general and career titles.
Son okunan makaleler:
Online Java Dersleri - Polimorfizm
Java'nın kurucusu Google'a transfer oldu
Neden Bilgisayar Mühendisliği?
Üniversitelerin akademik yayın karşılaştırması
Facebook Developer Toolkit ile Örnek Program
AJAX ve Şahane Ajax Örnekleri
Akıllı İstemci & Web Uygulamaları
Yazılım Mühendisliği ve Bilgisayar Mühendisliği arasındaki farklar
Introduction to making multithreaded VB.NET Apps
Bilgisayar mühendisliği öldü?
Online Java Dersleri - Interface and Inner Classes
Windows Workflow Foundation Conditions
C#: Nitelikleri Kavramak (Attributes)
Bir bakışta Java ve C# karşılaştırması
Windows Workflow Foundation'a Giriş
SQL Server - SP için önemli ipuçları
SSIS’ in güzellikleri 1
SSIS’ in güzellikleri 2
SQL SERVER 2005 'DE FILLFACTOR KAVRAMI
Kurumsal Yazılım Geliştirmede C# ve Java Savaşı, IDE’lerin Önemi

Bilgisayar Mühendisleri Portalı

Online Java Dersleri - Polimorfizm

 
BÖLÜM 6
 
Altuğ B. Altıntaş
© 2004
Polimorfizm
Polimorfizm, nesneye yönelik programlamanın önemli kavramlarından biridir ve sözlük anlamı olarak "bir çok şekil" anlamına gelmektedir. Polimorfizm ile kalıtım konusu iç içedir. Kalıtım konusunu geçen bölüm incelenmişti; kalıtım konusunda iki taraf bulunmaktadır, ana sınıf ve bu sınıftan türeyen alt sınıf/sınıflar. )
6.1. Detaylar
Alt sınıf, türetildiği ana sınıfa ait tüm özellikleri alır; yani, ana sınıf ne yapıyorsa türetilen alt sınıfta bu işlemlerin aynısını yapabilir ama türetilen alt sınıfların kendilerine ait bir çok yeni özelliği de olabilir. Ayrıca türetilen alt sınıfa ait nesnenin, ana sınıf tipindeki referansa bağlamanın yukarı doğru (upcasting) işlemi olduğu geçen bölüm incelenmişti. Burada anlatılanları bir örnek üzerinde açıklarsak; ()
Örnek:PolimorfizmOrnekBir.java ()
 
class Asker {
 public void selamVer() {
      System.out.println("Asker Selam verdi");
 }
} 
 
class Er extends Asker {
 public void selamVer() {
      System.out.println("Er Selam verdi");
 }
}
 
class Yuzbasi extends Asker {
 public void selamVer() {
      System.out.println("Yuzbasi Selam verdi");
 }
}
 
public class PolimorfizmOrnekBir {
 public static void hazirOl(Asker a) {
      a.selamVer(); // ! Dikkat !
 }
 
 public static void main(String args[]) {
      Asker a = new Asker();
      Er e = new Er();
      Yuzbasi y = new Yuzbasi();
      hazirOl(a); // yukarı cevirim ! yok !
      hazirOl(e); // yukarı cevirim (upcasting) 
     hazirOl(y); // yukarı cevirim (upcasting)
 }
}
 
Yukarıdaki örnekte üç  kavram mevcuttur, bunlardan biri yukarı çevirim (upcasting) diğeri polimorfizm ve son olarak da geç bağlama (late binding). Şimdi yukarı çevirim ve polimorfizm kavramlarını açıklayalım. Bu örneğimizde ana sınıf Asker sınıfıdır; bu sınıfdan türeyen sınıflar ise Er ve Yuzbasi sınıflarıdır. Bu ilişki "bir" ilişkisidir ; ()
·       Er bir Askerdir, veya 
·       Yüzbası bir Askerdir, diyebiliriz. 
Yani Askersınıfının yaptığı her işi Er sınıfı veya Yuzbasi sınıfı da yapabilir artı türetilen bu iki sınıf kendisine has özellikler taşıyabilir, Asker sınıfı ile Er ve Yuzbasi sınıflarının arasında kalıtımsal bir ilişki bulunmasından dolayı, Asker tipinde parametre kabul eden hazirOl()yordamına Er ve Yuzbasi tipindeki referansları paslayabildik, bu özelliğinde yukarı çevirim (upcasting) olduğunu geçen bölüm incelenmişti. ()
Polimorfizm ise hazirOl()yordamının içerisinde gizlidir. Bu yordamın (method) içerisinde Asker tipinde olan a referansı kendisine gelen 2 değişik nesneye (Er ve Yuzbasi) bağlanabildi; bunlardan biri Er diğeri ise Yuzbasi’dır. Peki bu yordamın içerisinde neler olmaktadır? Sırası ile açıklarsak; ilk önce Asker nesnesine bağlı Asker tipindeki referansı, hazirOl()yordamına parametre olarak gönderiyoruz, burada herhangi bir terslik yoktur çünkü hazirOl()yordamı zaten Asker tipinde parametre kabul etmektedir. ()
Burada dikkat edilmesi gereken husus, hazirOl() yordamının içerisinde Asker tipindeki yerel a değişkenimizin, kendi tipinden başka nesnelere de (Er ve Yuzbasi) bağlanabilmesidir; yani, Asker tipindeki yerel a değişkeni bir çok şekle girmiş bulunmaktadır. Aşağıdaki ifadelerin hepsi doğrudur: ()
·       Asker a = new Asker() ;
·       Asker a = new Er();
·       Asker a = new Yuzbasi();
Yukarıdaki ifadelere, Asker tipindeki adeğişkenin açısından bakarsak, bu değişkenin bir çok nesneye bağlanabildiğini görürüz, bu özellik polimorfizm 'dir -ki bu özelliğin temelinde kalıtım (inheritance) yatar. Şimdi sıra geç bağlama (late binding) özelliğinin açıklanmasında.... ()
6.2.Geç Bağlama (Late Binding)
Polimorfizm olmadan, geç bağlamadan bahsedilemez bile, polimorfizm ve geç bağlama (late binding) bir elmanın iki yarısı gibidir. Şimdi kaldığımız yerden devam ediyoruz, Er nesnesine bağlı  Er tipindeki referansımızı (e) hazirOl() yordamına parametre olarak gönderiyoruz. ()
Gösterim-6.1:
hazirOl(e); // yukari dogru cevirim (upcasting)
Bu size ilk başta hata olarak gelebilir, ama arada kalıtım ilişkisinden dolayı (Er bir Askerdir) nesneye yönelik programlama çerçevesinde  bu olay doğrudur. En önemli kısım geliyor; şimdi, hangi nesnesin selamVer() yordamı çağrılacaktır? Asker nesnesinin mi? Yoksa Er nesnesinin mi ? Cevap: Er nesnesinin selamVer() yordamı çağrılacaktır. Çünkü Asker tipindeki yerel değişken (a) Er nesnesine bağlanmıştır. Eğer Er nesnesinin selamVer() yordamı olmasaydı o zaman Asker nesnesine ait olan selamVer()yordamı çağrılacaktı fakat Er sınıfının içerisinde, ana sınıfa ait olan (Asker sınıfı)selamVer() yordamı iptal edildiğinden (override) dolayı, Java,  Er nesnesinin selamVer()yordamını çağırılacaktır. Peki hangi nesnesininselamVer()yordamının çağrılacağı ne zaman belli olur? Derleme anında mı  (compile-time)? Yoksa çalışma anında mı (run-time)? Cevap; çalışma anında (run-time). Bunun sebebi, derleme anında hazirOl()yordamına  hangi tür nesneye ait referansın gönderileceğinin belli olmamasıdır. ()
Son olarak,  Yuzbasi nesnesine bağlı  Yuzbasi tipindeki referansımızı hazirOl() yordamına parametre olarak gönderiyoruz. Artık bu bize şaşırtıcı gelmiyor... devam ediyoruz. Peki şimdi hangi nesneye ait selamVer() yordamı çağrılır? Asker nesnesinin mi? Yoksa Yuzbasi nesnesinin mi? Cevap Yuzbasi nesnesine ait olan selamVer() yordamının çağrılacağıdır çünkü Asker tipindeki yerel değişkenimiz heap alanındaki Yuzbasi nesnesine bağlıdır ve selamVer() yordamı Yuzbasi sınıfının içerisinde iptal edilmiştir (override). Eğer selamVer() yordamı Yuzbasi sınıfının içerisinde iptal edilmeseydi o zaman Asker sınıfına ait (ana sınıf)selamVer() yordamı çağrılacaktı. Aynı şekilde Java hangi nesnenin selamVer() yordamının çağrılacağına çalışma-anında (run-time) da karar verecektir yani geç bağlama özelliği devreye girmiş olacaktır. Eğer bir yordamın hangi nesneye ait olduğu çalışma anında belli oluyorsa bu olaya geç bağlama (late-binding) denir. Bu olayın tam tersi ise erken bağlamadır (early binding); yani, hangi nesnenin hangi yordamının çağrılacağı derleme anında bilinmesi. Bu örneğimiz çok fazla basit olduğu için, "Niye !  derleme anında hangi sınıf tipindeki referansın hazirOl()yordamına paslandığını bilemeyelim ki, çok kolay, önce Asker sınıfına ait bir referans sonra Er sınıfına ait bir referans ve en son olarak da Yuzbasi sınıfına ait bir referans bu yordama parametre olarak gönderiliyor işte..." diyebilirsiniz ama aşağıdaki örneğimiz için aynı şeyi söylemeniz bu kadar kolay olmayacaktır ()
 
Örnek: PolimorfizmOrnekIki.java ()
 
class Hayvan {
 public void avYakala() {
      System.out.println("Hayvan avYakala");
 }
}
 
class Kartal extends Hayvan {
 public void avYakala() {
      System.out.println("Kartal avYakala");
 }
}
 
class Timsah extends Hayvan{
 public void avYakala() {
      System.out.println("Timsah avYakala");
 }
}
 
public class PolimorfizmOrnekIki {
  public static Hayvan rasgeleSec() {
      int sec = ( (int) (Math.random() *3) ) ;
      Hayvan h = null ;
      if (sec == 0) h = new Hayvan();
      if (sec == 1) h = new Kartal();
      if (sec == 2) h = new Timsah();
      return h;
 }
  public static void main(String args[]) {
      Hayvan[] h = new Hayvan[3];
      // diziyi doldur
      for (int i = 0 ; i < 3 ; i++) {
       h[i] = rasgeleSec(); //upcasting
      }
      // dizi elemanlarini ekrana bas
      for (int j = 0 ; j < 3 ; j++) {
       h[j].avYakala(); // !Dikkat!
      }
 } 
}
 
 Yukarıdaki örnekte bulunan kalıtım (inheritance) ilişkisini, UML diyagramında gösterirsek:
Şekil-6.1. Kalıtım, Polimorfizm ve Geç Bağlama
PolimorfizmOrnekIki.java örneğimizde rasgeleSec()yordamı, rasgele Hayvan nesneleri oluşturup geri döndürmektedir. Geri döndürülen bu Hayvan nesneleri, Hayvan tipindeki dizi içerisine atılmaktadır. Hayvan dizisine atılan Kartal ve Timsah nesnelerine Java’nın kızmamasındaki sebep kalıtımdır. Kartal bir Hayvan'dır diyebiliyoruz aynı şekilde Timsah bir Hayvandır diyebiliyoruz; olaylara bu açıdan bakarsak Hayvan tipindeki dizi içerisine eleman atarken yukarı çevirim (upcasting) olduğunu fark edilir. ()
Geç bağlama ise, Hayvan dizisinin içerisindeki elemanlara ait avYakala() yordamını çağırırken karşımıza çıkar. Buradaki ilginç nokta hangi nesnenin avYakala() yordamının çağrılacağının derleme anında (compile-time) bilinemiyor olmasıdır. Nasıl yani diyenler için konuyu biraz daha açalım. rasgeleSec() yordamını incelersek, Math.random() yordamının her seferinde 0 ile 2 arasında rasgele sayılar ürettiği görülür. Bu üretilen sayılar doğrultusunda Hayvan nesnesi Kartal nesnesi veya Timsah nesnesi döndürülebilir; bu sebepten dolayı uygulamamızı her çalıştırdığımızda Hayvan tipindeki dizinin içerisine değişik tipteki nesnelerin, değişik sırada olabilecekleri görülür. Örneğin PolimorfizmIki uygulamamızı üç kere üst üste çalıştırıp çıkan sonuçları inceleyelim; Uygulamamızı  çalıştırıyorum. ()        
 
Gösterim-6.2:
java  PolimorfizmIki 
Uygulamanın çıktısı aşağıdaki gibidir;
 
Kartal avYakala
Hayvan avYakala
Kartal avYakala
Aynı uygulamamızı tekrardan çalıştırıyorum;
Timsah avYakala
Timsah avYakala
Hayvan avYakala
Tekrar çalıştırıyorum;
Timsah avYakala
Hayvan avYakala
Kartal avYakala
 
Görüldüğü üzere dizi içerisindeki elemanlar her sefersinde farklı  olabilmektedir, dizi içerisindeki elemanlar ancak çalışma anında (runtime) belli oluyorlar. h[j].avYakala()derken, derleme anında (compile-time) hangi nesnenin avYakala() yordamının çağrılacağını Java tarafından bilinemez, bu olay ancak çalışma anında (run-time) bilinebilir. Geç bağlama özelliği bu noktada karşımıza çıkar. Geç bağlamanın (late-binding) diğer isimleri, dinamik bağlama (dynamic-binding) veya çalışma anında bağlamadır. (runtime-binding). ()
6.3. Final ve Geç Bağlama
5. bölümde, finalözelliğinin kullanılmasının iki sebebi olabileceğini belirtmiştik. Bunlardan bir tanesi tasarım diğeri ise verimliliktir. Verimlilik konusu geç bağlama (late binding) özelliği ile aydınlamış bulunmaktadır, şöyle ki, eğer biz bir sınıfı final yaparsak, bu sınıfa ait tüm yordamları final yapmış oluruz veya eğer istersek tek başına bir yordamı da final yapabiliriz. Bir yordamı final yaparak şunu demiş oluruz, bu yordam, türetilmiş olan alt sınıfların içerisindeki diğer yordamlar tarafından iptal edilemesin (override) Eğer bir yordam iptal edilemezse o zaman geç bağlama (late binding) özelliği de ortadan kalkar. ()
Uygulama içerisinde herhangi bir nesneye ait  normal bir yordam  (final olmayan) çağrıldığında, Java, acaba doğru nesnenin uygun yordam mu çağrılıyor diye bir kontrol yapar, daha doğrusu geç bağlamaya (late-binding) ihtiyaç var mı kontrolü yapılır. Örneğin Kedi sınıfını göz önüne alalım. Kedi sınıfı final olmadığından dolayı bu sınıftan türetilme yapabiliriz. ()
 Örnek: KediKaplan.java  ()
 
class Kedi {
      
    public void yakalaAv() {
       System.out.println("Kedi sinifi Av yakaladi");
    }
      
}
 
class Kaplan extends Kedi {
 
 public static void goster(Kedi k) {
      k.yakalaAv(); 
  }
 
 public void yakalaAv() {
       System.out.println("Kaplan sinifi Av yakaladi");
 }
 
 public static void main(String args[] ) {
       Kedi k = new Kedi() ;
       Kaplan kp = new Kaplan();
       goster(k); 
        goster(kp); // yukari dogru cevirim (upcasting)       
 } 
}
 
Kaplan sınıfına ait statik bir yordam olan goster()  yordamının içerisinde Kedi tipindeki kyerel değişkene bağlı olan nesnenin, yakalaAv() yordamı çağrılmaktadır ama hangi nesnenin yakalaAv() yordamı? Kedi nesnesine ait olan mı? Yoksa Kaplan nesne
Bu makaleyi beğendin mi? Yorumunu Yaz!







Sizden Gelen Yorumlar:

Yorum Yazın

smtha(31.05.2010 08:02:16)
Çok güzell teşekkürler
%64 %20 %16
Katılıyorum Çekimserim Katılmıyorum



cücü :)(05.01.2010 20:54:26)
çok begendimm abiiii eywallahh gurban olurumm senaaa beynnn :)) heheee
%62 %10 %28
Katılıyorum Çekimserim Katılmıyorum





Yazılan yorumlar tek sayfaya sığmadı. Daha fazlasını okumak için aşağıda sayfa numarasına tıklayın:
1   > 2 

Copyright© 2001-2017. Bilgisayar Mühendisleri Portalı | Bütün hakları saklıdır.