+ Konu Cevaplama Paneli
1. Sayfa - Toplam 2 Sayfa var 1 2 SonuncuSonuncu
Gösterilen sonuçlar: 1 ile 10 ve 13

Konu: HTML-WEB Programlama ve Java Script

  1. #1
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Lightbulb HTML-WEB Programlama ve Java Script

    Web Programlama
    Önsöz
    Html
    Html'e Giriş
    Html' de Yazı
    Liste
    Link
    Tablo
    Form
    Frame
    Object(Image,Applet)
    Style Sheet
    Script
    CSS (Cascading Style Sheet)
    CSS'e Giriş
    CSS'in Yapısı ve Selector'lar
    Text ve Font
    Box Modeli
    Görsel Biçimlendirme
    Javascript
    JavaScript'e Giriş
    Javascript Dili
    Events-Olaylar
    Nesneler
    Java
    Uygulamalar
    Web Book (Style Sheet)
    Tree (javascript)
    Form Validator (javascript)

    Önsöz


    Kitap Hakkında
    Bu kitap bir web programcısının bilmesi gereken konulardan bahsediyor. HTML, CSS, JavaScript, Java, gibi teknolojiler hakkında bilgi sahip olmanıza yardımcı olacaktır. HTML-CSS-JavaScript yerine genellikle DHTML denmektedir. Bu kitabı DHTML kitabı olarak düşünebilirsiniz.
    Kitap 5 bölümden oluşmaktadır. Birinci bölümde HTML , ikinci bölümde CSS, üçüncü bölümde Javascript anlatılmaktadır. 4. bölümdeki tek bir java dökümanı içermektedir ve javaya hakkında temel bir bilgi verilmektedir. 5. bölüm ise uygulamalar bölümüdür. İlk uygulama Web Book uygulamasıdır. Bu uygulamada HTML-CSS kullanılarak web için bir kitap style'lı oluşturulmuştur. Bu uygulama ile CSS'nin gücünü farkedeceksiniz. İkinci uygulama şu bir tree(ağaç) uygulamasıdır. Bu projede javascript ve css'nin birlikte kullanımıştır. Üçüncü proje ise form doğrulama projesidir. Bu projede formun doğru şekilde doldurulup doldurulmadığını kontrol edilmektedir

    Html'e Giriş

    HyperText Markup Language (hypertext işaret dili) Nedir ?
    Hypertext terimi bir text'en başka bir text'e zıplamanızı(jump) sağlayan linklerin bulunduğu text'ler için kullanılır. Normal bir yazıda hiçbir zaman başka bir yazıya atlama yapamazsınız. Bilgisayar dünyasında başka bir dosyaya, metine vs.. atlamanıza(zıplamanıza) imkan veren metinlere hypertext denir.
    Her dil bazı işaretler kullanır. Html dili de işaretlerden oluşmuştur. Html ile hazırlanan sayfaları kullanıcılara gösteren tarayıcı(Browser) denilen programlar vardır (Netscape, İnternet Explorer vs..). Html işaretleri ile tarayıcıya web sayfasının nasıl gözükeceğini belirtirsiniz. Yani html işaretleri ile tarayıcıya yazıların rengini kırmızı yap, resmi sola koy, link koy gibi komutlar verirsiniz. Tarayıcılar bu işaretlere göre sayfanızı oluşturduğu için html bir markup (işaretleme) dilidir.
    Tag(etiket) ve Attribute(özellik)
    Html tag(etiket) denilen birimlerden oluşmuştur. Tag'ler < (küçük) işareti ile başayıp > (büyük) işareti ile biten elemanlardır. Açılış tag'i arasındaki elemanlar ve kapanış tag'i hepsi birden bir elementi oluşturur. Her tag bir komut gibidir yani tarayıca bir şeyler belirtir. Yazı yazmak için bir tag ,resim koymak için bir tag kullanılır. <img> tag'i resim koymak için, <a> tag'i link (tıklandığında başka sayfaya gitmenizi sağlayan yazı) koymak için , <table> tablo koymak için , <font> yazıların biçimini değiştirmek için kullanılır. Html'de çok sayıda tag bulunur. Bazı tag'ler açıldığı zaman kapatılması gerekir. Her html sayfasının başında mutlaka olması şart olan <html> tag'i mutlaka sayfanın sonunda </html> ile kapatılmalıdır. Kapatma işlemi </tag> ile yapılır. Taglar açılıp kapandığı yerde yani arasındaki bölgede etkilidir.
    Bazı tagların yardımcı ekleri vardır. Bunlara attribute (özellik) denir. Genel yapısı <tag attribute1="value1" attribute="value2"> etkilenen bölge </tag> şeklindedir. Örneğin resim.gif diye bir resim dosyasını web sayfanıza koymak istiyorsanız <img> tag'inin src özelliğini kullanacaksınız. resim.gif dosyasını <img src="resim.gif"> </img> ile gösterebilirsiniz.
    Global Tag'ler-Genel Yapı
    Html'de elementler (açılış tag'i+arasındaki bölge+kapanış tag'i) hiyerarşik bir yapıdadır. Yani elementler içiçe kullanılabilir. Bir web sayfasında bütün elementler <html></html> tag'leri arasındadır. Bu tag'in dışında başka bir tag kullanılamaz. Her tag bu tag'in arasında açılır ve kapanır. Genel <tag1> <tag2> <tag3> </tag3> </tag2> </tag1> şeklinde bir alt üst ilişkisi vardır. Açılan bir tag kapanmadan üst tag kapanamaz. En alttaki tag kapatılmalıdır. Html'de içiçe elementlerde alt element ile üst element aynı özelliğe değer veriyorlarsa alttaki elementin değeri geçerli olur. Örneğin üstteki element yazıların rengini kırmızı yap diyorsa ve altındaki element yeşil yap diyorsa alttaki elementin arasındaki yazılar yeşil olur.
    HTML hoşgörülü bir dildir. Açılan bir tag kapatılmamışsa da browser sayfayı gösterir. Ancak tag kapatılmadığı için açıldıktan sonraki tüm bölüme etkili olur. Bu da istenmeyen bir görünüm oluşturabilir. O yüzden her zaman açılmış bir tag'i kapatınız.
    Bir html kodu iki bölüme ayrılmıştır. Birinci bölüm sayfa hakkında genel bilgilerin bulunduğu head tag'i, ikinci bölümse sayfanın görünen kısmının bulunduğu body tag'idir. Aşağıda bu yapı görülmektedir.
    HtmlGlobal.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 sayfa hakkında genel bilgiler buraya....
    4 </head>
    5 <body>
    6 sayfanın görünecek olan kısmı buraya....
    7 </body>
    8 </html>

    Görüldüğü gibi html tag'i iki ana bölüme ayrılıyor. head ve body.
    Comment-Yorum
    Browser bir web sayfasındaki tüm yazılanları değerlendirir. Eğer siz bazı yazıları veya tag'leri browser'in değerlendirmesini istemiyorsanız comment kullanırsınız. Html yorum <!-- ile başlar ve --> ile biter. Aşağıda bir örnek görülüyor.
    HtmlComment.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <!--bu sayfa sadece yorum için yapılmıştır.-->;
    4 </head>
    5 <body>
    6 <!--
    7 <h1>bu başlık görülmeyecek. çünkü yorum</h1>
    8 -->
    9 </body>
    10 </html>

    Html Yazış Stili
    Html elementleri yukarıdaki örneklerde görüldüğü gibi hiyerarşik bir yapı sergilerler. Yaptığın sayfanın html kodu bu hiyerarşiyi rahat görmenizi sağlamalıdır. Bir kodu aşağıdaki gibi yazsaydık anlayabilir miydiniz?
    HtmlBadSpelling.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html><head>
    2 <title>welcome</title></head>
    3 <body><center><font color="red" size="12">hello world</font>
    4 </center>
    5 </body></html>

    Eğer bir etiket başka bir etiketin içindeyse bir tab mesafesinde içeride olması çok iyi olur. Bu her zaman kullanmayabilirsiniz. Örneğin head ve body'yi içeriye almayabilirsiniz. Yine eğer etiket açılışı ve kapanışı bir satıra sığacak kadar küçükse tek satırda yazılabilir. Şimdi bu söylediklerimi koda uyguluyalım
    HtmlGoodSpelling.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head><title>welcome</title></head>
    3 <body>
    4 <center><font color="red" size="12">hello world</font></center>
    5 </body>
    6 </html>

    Görüldüğü gibi html etiketini yok kabul ettik. Yine head ve title tek satıra sığdığı için tek satır haline getirdik. Ayrıca center ve font etiketinden oluşan grupta tek satır haline getirilmiştir. Bu yazışın yararı hem hiyerarşik yapıyı görebilirsiniz hem de çok az satır kullanmış olursunuz. Ancak eğer head etiketi içine başka bir etiket eklediğinizde tek satıra sığmaz ve okunaklılık azalır. Tekrar eski şekilde yazarsınız.
    Yazı ile etiket nasıl yazılacağıda önemlidir. <title>welcome</title> şeklinde görüldüğü gibi etiket ile yazı arasında boşluk bırakılmamıştır. Aşağıda ki örnekte gereksiz boşluklar vardır.
    HtmlGood2Spelling.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <title>
    4 welcome
    5 </title>
    6 </head>
    7 <body>
    8 <center>
    9 <font color="red" size="12">
    10 hello world
    11 </font>
    12 </center>
    13 </body>
    14 </html>

    yazılar ile etiketler arasında boşluk, tab, enter yapmayın. Etiket biter bitmez yazıya başlayın ve biter bitmez kapatın.
    Dosya Listesi
    · HtmlGlobal.html
    · HtmlComment.html
    · HtmlBadSpelling.html
    · HtmlGoodSpelling.html
    · HtmlGood2Spelling.html

    Html'de Yazı


    White space karekterler
    White space boşluk,tab gibi yazıya dahil olmayan karekterler için kullanılır. Html'de bu karakterler dikkate alınmaz. Sadece pre etiketinde bu karekterler dikkate alınır. Aşağıdaki kodda'ki boşluklar dikkate alınmayacaklardır.
    HtmlWhiteSpace.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <p>
    4 aglasam sesimi duyar misiniz misralarim da?
    5 dokunabilir misin ellerinizle göz yaslarima?
    6 </p>
    7 </body>
    8 </html>

    Sonuç olarak browser tek satırlık ağlasam sesimi duyar mısınız mısralarım da? dokunabilir misini ellerinizle göz yaşlarıma yazısını yazar. Çünkü p tag'i yeni satır karekterini ve tab karekterini dikkate almaz. Ancak p yerine pre tag'i kullanırsa istenen görüntü elde edilir.
    Paragraf-P Tag'i
    Html'de paragraf yazmak için p tag'i kullanılır. Ancak p tag'i yeni satır karekterini tanımadığı için tüm yazıları tek bir satıra yazar. Eğer yeni bir satıra geçmek istiyorsak br tag'i kullanılmalıdır. br tag'i yazının alt satırdan devam etmesini sağlar. Aşağıda üç satırlık bir paragraf yazı yazıyoruz.
    HtmlPTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <p>Html'de white space denilen karekterler dikkate alinmaz. O yüzden br etiketi kullanacagim <br> artik alt satirdan yazima devam ediyorum. yeni bir satir açaçagim zaman yine <br> kullaniyorum. Simdi üçüncü satirdayim.</p>
    4 </body>
    5 </html>

    test.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1


    2


    3

    dfsd




    4


    5


    Pre Tag'i
    Yukardaki şiir örneğinde yazdığımız şiiri p tag'i tek bir satılık yazı haline getirmişti. Eğer şiir'in biçimini korumak istiyorsak pre tag'i kullanmalıyız. pre etiketi white space denilen karekterler dikkate alır. Yazdığınız yazı aynen görünür. Aşağıda kullandığımız pre tag'i ile istediğimiz görüntüyü elde ederiz.
    HtmlPreTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <pre>
    4 aglasam sesimi duyar misiniz misralarim da?
    5 dokunabilir misin ellerinizle göz yaslarima?
    6 </pre>
    7 </body>
    8 </html>

    Dosya Listesi
    · HtmlWhiteSpace.html
    · HtmlPTag.html
    · test.html
    · HtmlPreTag.html

    Html'de Liste


    Liste'lere Giriş
    Html'de üç tip liste vardır. Birinci tip unordered list-kuralsız liste, ikinci tip ordered list-kurallı liste, üçüncü tipse definitions-tanımlamalar'dır. Unordered list'de her yeni eleman ekleyişinizde sizin istediğiniz bir işareti koyar. Örneğin yıldız,nokta vs.. Ordered list'te ise her eleman eklendiğinde list sayısını veya sırasını bir artırır. Örneğin 1 ise 2, a ise b, A ise B yapar. Siz her eleman eklediğinizde o bu artımı gerçekleştirir. Definitions'larda ise bir terim verilir ve sonra onun açıklaması verilir. her terim ve açıklamasını eklediğinizde aynı biçimde gözükecektir. Şimdi ayrı ayrı bu üç listeyi kullanıcaz.
    Unordered Liste
    Bu listede her eleman eklediğinizde elamanın başına bir disk işareti koyar. Aşağıda bir unordered liste yapıyoruz.
    HtmlUlTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <ul>
    4 <li>ali
    5 <li>veli
    6 <li>züleyha
    7 </ul>
    8 </body>
    9 </html>

    Listenin başına koyacağı işareti değiştirebiliriz. Aşağıda listenin başına bir kare ekliyoruz. Üç tip'te olabilir: square-kare,disc-siyah disk,circle-çember
    HtmlUlWithType.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <ul type="square">
    4 <li>ali
    5 <li>veli
    6 <li>züleyha
    7 </ul>
    8 </body>
    9 </html>

    Listelerin işaretlerini değiştirmek için artık CSS(Casceding Style Sheet) kullanılmaktadır. CSS çok daha iyi özellikler sağlamaktadır. O yüzden listelerdeki type özelliğini kullanmayın.
    Ordered Liste
    Bu listede her eleman eklediğinizde daha önceki işaret bir artırılır. Bu işeret 2 ise bir sonraki 3 olur. Eğer A ise bir sonraki B olur. Orderd listede beş tip vardır. 1 2 3..,a b c..,A B C...,i ii iii ...,I II II IV ... Aşağıda bir ordered liste yapıyoruz. Type'ni vermediğimiz zaman 1 2 3 şeklinde artar.
    HtmlOlTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <ol>
    4 <li>ali
    5 <li>veli
    6 <li>züleyha
    7 </ol>
    8 </body>
    9 </html>

    Şimdi a b c şeklinde artıralım.
    HtmlOlWithType.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <ol type="a">
    4 <li>ali
    5 <li>veli
    6 <li>züleyha
    7 </ol>
    8 </body>
    9 </html>

    Yukarda verdiğimiz uyarı geçerlidir. Artık listeleri biçimlendirmek için CSS kullanılmaktadır.
    İç içe Liste kullanımı
    Listelerin içinde başka listeler bulunabilir. Örneğin bir unordered listenin elamanları ordered liste olabilir. Aşağıda ki örnekte bunu yapıyoruz.
    HtmlTreeList.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <ul>
    4 <li>Ali
    5 <ol>
    6 <li>akıllı
    7 <li>iyi
    8 </ol>
    9 <li>veli
    10 <ol>
    11 <li>inatçı
    12 <li>kibirli
    13 </ol>
    14 <li>züleyha
    15 <ol>
    16 <li>korkak
    17 <li>uyanık
    18 <li>iyi
    19 </ol>
    20 </ul>
    21 </body>
    22 </html>

    Dosya Listesi
    · HtmlUlTag.html
    · HtmlUlWithType.html
    · HtmlOlTag.html
    · HtmlOlWithType.html
    · HtmlTreeList.html

    Html'de Link


    Link'lere Giriş
    Web sayfasında üzerine tıklandığında başka bir sayfaya bağlanmanızı sağlayan yazılara link deniyor. Link koymak için a tag'i kullanılır. href attribute'si ile bağlanılacak sayfanın adresi verilir. Aşağıda bir link yapılıyor.
    <a href="http://w3.org">tıklayın w3'e bağlanın </a>

    bağlanılacak sayfa default-varsayılan olarak linkin bulunduğu pencereye yüklenecektir. Başka bir browser penceresinde gözükmesini istiyorsanız a tag'inin target attribute'sini kullanacaksınız. Aşağıda bağlanılan sayfayı yeni bir pencerede gösteren link vardır.
    <a href="http://w3.org" target="_blank">tıklayın w3'e bağlanın </a>

    Target attributesi için tanımlı 4 değer vardır. Bunlar _blank,_self,_parent,_top'dır. _blank sayfayı yeni bir pencerede açar. _self sayfayı link'in bulunduğu frame'de açar. _parent ise link'in frame'nin bulunduğu frameset'te açar. _top ise sayfayı en tepede tüm frame'lerin bulunduğu frameset'te açar. İstediğiniz bir frame'de açması için ise target attribute'sine frame'nin adını yazmanız yeterlidir.
    Image'dan da link yapılabilir. Image'a tıklayarak başka bir sayfaya bağlanılabilir. Şimdi bir image link'i yapıyoruz.
    <a href="http://w3.org"><img src="image.gif"></img></a>

    Anchor-Doküman İçinde Link
    Eğer sayfanız fazla uzunsa sayfanızın içinde link yapabilirsiniz. Örneğin sayfanızın sonunda adres bilgisi var. Sayfanızın başından tıklandığında bu adresin bulunduğu yere gelinmesini istiyorsunuz. Şunu yapmalısınız. Adres'in yazıldığı yere bir isim vermelisiniz. Sonra sayfanın başında o isme bağlanan bir link yapacaksınız. Aşağıda biz bunu yapıyoruz.
    HtmlAnchor.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <a href="#adress">adress bilgisi</a>
    4 <p>...........
    5 ..........
    6 .............
    7 ..............
    8 .............
    9 sayfanın sonundayız.</p>
    10 <a name="adress">Hacıyatmaz mah. Fahriye Abla Sok No:007</a>
    11 </body>
    12 </html>

    Görüldüğü gibi sayfanın sonundaki adres bölümüne adress ismini verdik. En yukardaki link'te #adress ile bu bölüme link sağladık. Bu link tıklandığında adress bölümüne gelinecektir. Bu başka sayfaların da belirli bir bölümüne link sağlanabilir. test.html sayfasının adress bölümüne ulaşmak için href="test.html#adress" yazmak yeterli olacaktır. Başka bir sitedeki sayfanın bir bölümünede aynı şekilde ulaşılabilir. Örneğin www.godoro.com/test.html sayfasının adress bölümüne ulaşmak için href="http:www.godoro.com/test.html#adress" yazmanız gerekir.
    Base
    Sayfanızda http://www.godoro.com/test klasörünün bulunduğu yere 10 link olduğunu düşünün. Her link eklediğinizde href attributesine http://www.godoro.com/test/t1.html,h...m/test/t3.html şeklinde her defasında http://www.godoro.com/test/ ifedesini yazmak zorundasınız. Bunun yerine http://www.godoro.com/test/ ifadesini base yapıyosunuz. Bundan sonra href="t2.html" kullandığınızda http://www.godoro.com/test/t2.html sizin için çağırılıyor. Siz her defasında http://www.godoro.com/test/ ifadesini yazmanız gerekmiyor. Aşağıda bu işlemi yapıyoruz.
    HtmlBase.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <base href="http://www.godoro.com/test">
    4 </head>
    5 <body>
    6 <a href="t1.html">godoro t1</a>
    7 <a href="t2.html">godoro t2</a>
    8 <a href="t1.html">godoro t3</a>
    9 <a href="t2.html">godoro t4</a>
    10 <a href="t1.html">godoro t5</a>
    11 <a href="t2.html">godoro t6</a>
    12 </body>
    13 </html>

    Aynı işlemi target içinde yapabilirsiniz. Sayfanızdaki tüm linklerin main adında bir frame'de açılacağını düşünün. Eklediğiniz her link için target="main" yazmanız gerekir. Bunun yerine <base target="main"> yazarsanız bundan sonra her linke eklemeniz gerekmez. Daha sonra linkleri main'de değil de test frame'inde açmak isterseniz yanlızca base tag'in target attribute'sini değiştirmeniz yeterli olacaktır.
    Dosya Listesi
    · HtmlAnchor.html
    · HtmlBase.html
    Html'de Tablo

    Tablolara Giriş

    Tablolar normal anladığımız manasındaki tablolar için kullanılmakla birlikte web sayfasının genel yerleşimi için de kullanılır. Bir resmin solda yazınında sağda olması için tek satırlı bir tablo yapıp ilk hücreye resmi, ikinci hücreyede yazıyı koyabilirsiniz. Tablolarda yeni satır için tr kullanılır. yeni satı açtıktan sonra hüçre eklemek için td tag'i kullanılır. Aşağıda iki satır ve sütunlu tablo yaratılıyor.
    <table> <tr><td> 11 eleman <td> 12 elemen <tr><td> 21 eleman <td> 22 eleman</table>
    colspan ve rowspan

    Hücrelerin genişliği ve yüksekliği değişik olabilir. Örneğin bir hücrenin genişliği yanındaki hücrenin genişliğinin iki katı olabilir. Bunun için colspan ve rospan kullanılır. Şimdi aşağıdaki örneğe bakalım.
    <table> <tr><td colspan="2">1111<td>12 elemen <tr><td>21<td>22</table>
    Eğer colspan 2 denmesse 1111 hücresi ile 21 hücresi aynı genişlikte olurlar. halbuki 1111'in 21'in 2 katı genişliğinde olmasını istersek 1111'in altında hem 21 hemde 22 görülür. colspan=2 şu anlama gelir. En küçük hücrenin boyunun iki katı. Aynı şey rowspan içinde geçerlidir. En küçük satırnın boyunun kaç katı olacağını verirsin. Örneğin bir resim solda ve sağdada 4 hücre olacak. Bunun için resmin bulunduğu hücrenin rowspan'ı 4 yapılır. Solda bir resim gözükür. Sağdada yukardan aşağıya 1, 2, 3, 4 görülür.
    <table> <tr> <td rowspan="4"><img src="test.gif"> <td>1 <tr> </tr> <td>2 </tr> <tr> <td>3 </tr> <tr> <td>4 </tr> </table>

    Html'de Form


    Form Nedir ?
    Form web sayfasını ziyaret eden kullanıcıdan bilgi almak için kullanılır. Kullanıcının girdiği bilgiler bir CGI programına gönderilir. Bu CGI programı form bilgilerini alır, değerlendirir ve cevap olarak bir HTML üretir. Form bilgilerini hangi programa gönderileceği form tag'inin action property'si ile verilir.Örneğin
    <form action="test.jsp" name="test">
    .........
    </form>

    Form bilgileri test.jsp adında bir programa gönderilmektedir.
    Action Method'u
    Form bilgisi CGI programına iki şekilde gönderilir. GET ve POST. GET'te form bilgileri cgıProgram?element1=value&element2=value şeklinde gönderilir. Eğer formun action property'si test.jsp ise ve kullanıcı name'i ali ve surname="dayioglu" girilmişse CGI programı şu şekilde çağrılır.
    test.jsp?name=ali&surname=dayioglu

    test.jsp form tag'nin action property'sinde girilen değerdir. form bilgileri ? işaretinden sonra ve aralarında & işareti alarak gönderilir. Tabi ki bunu browser yapmaktadır. Browser form elementlerinin adını ve value'sini alarak bu string'i üretmektedir.
    <form action="test.jsp" method="GET">
    .........
    </form>
    <form action="test.jsp" method="POST">
    .........
    </form>

    GET method'unun bir sakıncası vardır. Kullanıcı browser adres bar'ına http://www.bilmemne.com/test.jsp?name=veli&surname=dayi yazarak direkt olarak CGI programını çağırabilir. Eğer formun önce doldurulduktan sonra CGI programını çağırmak istiyorsanız GET method'unu kullanamazsınız. Bunun yerine POST methodunu kullanmak gerekmektedir.
    POST methodunda form bilgileri HTTP'in Post methodu kullanılılarak gönderilir. Halbuki GET metodunda tüm form bilgisi URL'eye eklenmişti. Eğer value çok büyükse GET methodu zaten kullanılamaz. Örneğin bir resim dosyasının içeriği gönderilmek istenirse POST method'u kullanılmalıdır.
    Submit Düğmesi
    Form bilgilerini CGI programına göndermek için forma submit düğmesi konulur. Submit düğmesi tıklandığında fomr bilgileri karşı tarafa gönderilir. Submit düğmesi eklemek için input tag'inin type attributesi submit olmalıdır.
    <input type="submit" value=" Tamam "></input>

    value özelliği ile submit düğmesini üzerindeki yazı verilmiştir.
    Text Field-Text Alanları
    Formlarda tek satırlık yazı girmek için input tag'inin type property'si kullanılır. aşağıdaki örnekte bir text alanı yaratıyoruz.
    <input type="text" size="10" name="surname"></input>

    Text alanı için type property'sine text değeri verilir. Size ise text alanının boyudur. Name property'si text alanaı isim vermek içindir. İsim verildiği zaman CGI programı bu ismi kullanarak text alanına girilen yazıyı alabilir.Yazı girmek için diğer element textarea tag'idir. TextArea tag'i birden fazla satırlık yazıları almak için kullanılır
    <textarea cols="10" rows="10" name="message"></textarea>

    cols kaç sütun olacağı rows ise kaç satır olacağıdır.
    Şifre girmek için kullanılan tag'de input tag'idir. type="password" yazarsanız şifre girilen bir text alanı elde edersiniz.
    <input type="password" size="10" name="pass"></input>

    Onay Kutusu
    Kullanıcının bir bilgiyi evet veya hayır diye cevap verebilmesini sağlayan elementlerdir. beyaz bir dikdörtgen şeklindedir. Tıklandığı zaman onay işareti gözükür. Bir kere daha tıklanırsa onay işareti kalkar.
    <input type="checkbox" name="smoking" value="yes">sigara içer misiniz ?</input>

    Eğer kullanıcı bu onay kutusunu tıklarsa CGI programına smoking(Sigara içme) değişkeninin değeri yes olarak gönderlir. Çünkü value property'si yes yazılmıştır. Eğer onaylanmazsa hiç bir değer gönderilmez.
    Seçenek Kutusu
    Kullanıcının birden fazla seçenekten birini seçmesini sağlayan elementlerdir. Bir seçenek seçildiğinde daha önce seçili olanın seçiçiliği kalkar. Yani yanlızca bir tane seçilebilir.
    <input type="radio" name="sex" value="fame">bayan</input>
    <input type="radio" name="sex" value="male">bay</input>

    Örnekte kullanıcıdan cinsiyet seçilmesi istenmektedir. İki element'in isminin aynı olduğuna dikkat etmeniz gerekir. Eğer isimleri aynı olmassa hiç bir anlamı kalmaz. Hangisi seçiliyse CGI programına o elementin value'si gönderilecektir. Örneğin kullanıcı bay'ı seçmişse karşı tarafa sex=male gönderilecektir.
    Düğmeler-Reset,Button
    Rest düğmesi formda doldurulan bilgilerin temizlenmesi için kullanılır.
    <input type="reset" value="Temizle"></input>

    Button ise normal bir düğme eklemek içindir. Bu düğme tıklandığında bir javascript kodu çalıştırlıması içindir. Aşağıdaki örnekte tıklandığında ekrana mesaj gösteren bir düğme ekliyoruz.
    <input type="button" value="Tıklayın" onClick="alert('Tıkladız. Aferin')"></input>

    onClick ile düğme tıklanma olayını yakalarsınız. Ve alert ile mesaj gösterirsiniz.
    File Element
    Kullanıcının bilgisayarından bir file almak için bu tag kullanılır. Bu tag koyulduğunda ekranda bir text alanı ve bir browse düğmesi görülür. Browse düğmesi ile verilmek istenen file seçilir. Bu düğme File seçmek için kullanılan pencereyi açmaktadır. Seçilen file text alanında görülür. Form submit edildiğinde seçtiğiniz file'in bilgisi CGI programına gönderilir.
    <input type="file" name="selectFile"></input>

    Hidden Element
    Hidden elementler web sayfasında görülmezler. Bunlar zaten belli olan verileri CGI programına göndermek için kullanılırlar.
    <input type="hidden" name="mailaddress" value="tekzaf@yahoo.com"></input>

    burada mailaddres adlı elementin value'si bellidir. Form CGI programına gönderildiğinde bu bilgi gönderilir.
    Bir Basit Form Örneği
    Aşağıda tüm bu elementleri kullanan bir form görülmektedir.
    HtmlFormExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <form action="test.jsp" method="GET" name="testform">
    4 <input type="hidden" name="count" value="3"></input>
    5 Kullanici Ad:
    6 <input type="text" name="username" size="10"></input><br>
    7 Sifre:
    8 <input type="text" name="pass" size="10"></input><br>
    9 Cinsiyet:
    10 <input type="radio" name="sex" value="fale">bayan</input>
    11 <input type="radio" name="sex" value="male">bay</input> <br>
    12 Hangi Müzisyenleri Seviyorsunuz ?<br>
    13 <input type="checkbox" name="music" value="nesetertas">Neset Ertas</input><br>
    14 <input type="checkbox" name="music" value="orhangencebay">Orhan Gencebay</input><br>
    15 <input type="checkbox" name="music" value="zekimuren">Zeki Müren</input><br>
    16 File Seç:
    17 <input type="file" name="selectFile"></input><br>
    18 Mesaj Yaz:<br>
    19 <textarea name="message" cols=20 rows=20></textarea><br>
    20 <input type="submit" value="Tamam"></input>
    21 <input type="reset" value="Temizle"></input>
    22 </form>
    23 </body>
    24 </html>

    Dosya Listesi
    · HtmlFormExample.html

    Html'de Frame


    Frame'e Giriş
    Browser penceresi birden fazla sayfanın gösterilebilmesi için frame'lere ayrılabilir. Örneğin solda menuleri gösteren bir sayfa ortada içeriğin gösterildiği bir sayfa bulunabilir. Frame yerleştirmek için önce frameset yerleştirmek gerekir. Frameset iki frame'in yerleştirildiği frame'dir. örneğin 3 frame koymak istiyorsanız önce sayfaya bir frameset ekleyerek ikiye böleceksiniz. İki bölümden birine frame değil başka bir frameset yerleştireceksiniz. Şimdi örnek olarak sol'da ve sağ'da olamak üzere iki frame yaratıyoruz.
    HtmlFrameAsCols.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <frameset cols="30%,*">
    3 <frame src="left.html" name="left">
    4 <frame src="right.html" name="right">
    5 </frameset>
    6 </html>

    Sol frame'in adı left, sağ frame'in adı right yaptık. Frameset'in cols özelliği ile soldaki frame'in genişliği tüm genişliğin %30'u olduğunu belirttik. * ile geri kalan genişliğin yani %70'in sağ frame'e ayrıldığını söylemiş olduk. Şimdi yukarıda bir frame ve aşağıda bir frame yapıyoruz.
    HtmlFrameAsRows.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <frameset rows="30%,*">
    3 <frame src="top.html" name="top">
    4 <frame src="bottom.html" name="bottom">
    5 </frameset>
    6 </html>

    Burada da yukarıdakine benzer şekilde tüm yüksekliği %30'u top.html'e geri kalan ise bottom.html'e verilir. İstinirse % cinsinden değil de pixsel olarakta verilebilir.
    İkiden fazla frame yerleştirmek için frameset içinde frameset kullanmamız gerekir. Şimdi solda bir frame, sağda ise üst'te ve ortada bir frame yapalim. Bunun için önce sol ve sağ diye ikiye bölmemiz gerekir. Sonra sağ bölgeyede üst ve ortadaki olarak iki frame ekleyeceğiz.
    HtmlFramesetInFrameset.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <frameset cols="30%,*">
    3 <frame src="left.html" name="left">
    4 <frameset rows="20%,*">
    5 <frame src="rightTop.html" name="rightTop">
    6 <frame src="rightBottom.html" name="rightBottom">
    7 </frameset>
    8 </frameset>
    9 </html>

    Görüldüğü gibi sol'a left.html yerleşir. Sağ üste rightTop.html sağ alta ise rightBottom.html gösterilecektir.
    IFrame
    İstediğiniz yere, istediğiniz genişlikte bir frame yerleştirmek için iframe kullanılır. Şimdi aşağıda bir iframe ekliyoruz.
    HtmlInnerFrame.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <iframe src="test.html" width="200" height="300" scrolling="yes" frameborder="1">
    3 </iframe>
    4 </html>

    Dosya Listesi
    · HtmlFrameAsCols.html
    · HtmlFrameAsRows.html
    · HtmlFramesetInFrameset.html
    · HtmlInnerFrame.html
    Html'de Object'ler

    Html'de Object'ler

    Image,applet ve iframe'ler bir object'tir. Object etiketi ile eklenebilirler. Applet etiketi artık deprecated olmuştur. (Html'in bir daha ki sürümde bu etiket olmayacak. Şu anda desteklenmektedir.)
    Image Ekleme

    Image object tag'i veya img tag'i ile eklenebilir. img tag'i ile ekleyelim
    <img src="test.html"></img>
    image eğer görünmediği zaman ekranda görülecek yazı alt attribute'si ile verilebilir.
    <img src="test.html" alt="bu resim önemlidir"></img>
    Applet Ekleme

    Applet'ler browser'larda çalışan java programcıklarıdır. Bunları web sayfasına eklemek için applet etiketi kullanılır. Aşağıda Test.class appletini sayfaya ekliyoruz.
    <applet code="Test.class" width="500" height="500"></applet>
    Eğer applet dışarıdan parametre alıyorsa bu param tag'i ile verilir. Aşağıda parametre alan bir applet örneği bulunmaktadır.
    <applet code="Test.class" width="500" height="500"> <param name="test" value="a"> <param name="color" value="red"></applet>

    Cascading Style Sheet


    Style Etiketinin Kullanımı
    Tüm stiller head etiketi içinde style etiketi ile yazılabilir. Aşağıda örnek görülmektedir.
    HtmlStyleTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 ...stiller buraya yazılır....
    5 </style>
    6 </head>
    7 <body>
    8 ...stiller kullanılır....
    9 </body>
    10 </html>

    İnline Kullanım
    Style'ler yanlızca tek bir element için bir attribute ile yaratılabilir.
    HtmlInlineStyle.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <body>
    3 <p style="color:red;font-size:12pt">inline stil kullanılmış paragraf</p>
    4 </body>
    5 </html>

    Stillerin Ayrı Dosyadan Kullanılması
    Stiller .css ile ayrı bir dosyaya yazılabilir. Aşağıdaki örnekte test.css adlı dosyadaki css kullanılmaktadır. Bu link etiketi ile test.css dosyasının sayfaya bağlanması ile yapılır.
    HtmlLinkStyle.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <link href="test.css" type="text/css" rel="stylesheet"></link>
    4 </head>
    5 <body>
    6 ...test.css dosyasındaki stiller kullanılır....
    7 </body>
    8 </html>

    Dosya Listesi
    · HtmlStyleTag.html
    · HtmlInlineStyle.html
    · HtmlLinkStyle.html

    Script


    Script
    Html dinamik değildir. Yani kullanıcıya göre kendini değiştiremez. Bunun için scriptler kullanılır. Script dilleri javascript,jscript,vbscript'tir.
    Script etiketi
    Script'ler script etiketinin içine yazılırlar. Script etiketinin language özelliği ile hangi script dilininin kullanılacağı belirtilir. Langauge html 4.0 ile yerini type özelliğine bırakmıştır. Aşağıda scriptlerin sayfaya eklenmesi görülmektedir.
    HtmlScriptTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <script language="javascript">
    4 ...script buraya yazılır....
    5 </script>
    6 </head>
    7 <body>
    8 ......
    9 <script language="javascript">
    10 ...script buraya yazılır....
    11 </script>
    12 </body>
    13 </html>

    Genellikle scriptler head etiketinin içine koyulurlar. Ancak bu şart değildir. Script kodları ayrı bir dosyaya yazılabilir. Javascript'te bu ayrı dosyaların uzantısı .js olur. Aşağıdaki sayfada test.js dosyasının kodları kullanılmaktadır
    HtmlExternalScript.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <script src="test.js" language="javascript"></script>
    4 <script language="javascript">
    5 ...burada test.js dosyasındaki script kullanılabilir...
    6 </script>
    7 </head>
    8 <body>
    9 ......
    10 <script language="javascript">
    11 ...burada test.js dosyasındaki script kullanılabilir...
    12 </script>
    13 </body>
    14 </html>

    Eğer browser scripti desteklemiyorsa noscript etiketi kullanılır. Script desteklenmediği için noscript etiketi ile kullanıcıya bir açıklama yapılır. Aşağıda örnek görülmektedir.
    HtmlNoScriptTag.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <script language="javascript">
    4 ...script kullanılabilir...
    5 </script>
    6 <noscript>browser scripti desteklemiyor</noscript>
    7 </head>
    8 <body>
    9 </body>
    10 </html>

    Eğer browser scripti desteklemiyorsa tüm script etiketinin içini yazı olarak ekranda gösteririr. Script kodlarını ekranda görmek kullanıcının normal olarak hoşuna gitmez. Bunu engellemek için script etiketi html yorumu(comment) içine alınır. Böylece scripti tanımayan javascript kodlarını ekranda göstermez. Artık tarayıcılar script etiketini desteklediği için böyle bir şeye gerek yoktur. Aşağıda örnek görülüyor.
    HtmlScriptComment.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <script language="javascript">
    4 <!--
    5 ...burada test.js dosyasındaki script kullanılabilir...
    6 ...yorum haline getirilmiş
    7 -->
    8 </script>
    9 </head>
    10 <body>
    11 </body>
    12 </html>

    Dosya Listesi
    · HtmlScriptTag.html
    · HtmlExternalScript.html
    · HtmlNoScriptTag.html
    · HtmlScriptComment.html

  2. #2
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Lightbulb

    Cascading Style Sheet-CSS

    CSS'e Giriş

    CSS'in Yapısı ve Selector'lar

    Text ve Font

    Box Modeli

    Görsel Biçimlendirme

    CSS'e Giriş

    Cascading Style Sheet Nedir?

    Web sayfanızın içeriğini hazırladınız, yani yazılar yazdınız,gösterilecek resimler tamam, tablo içerikleri belli. Tüm bu içerikler kullanıcıya hangi biçimde gösterilecek. Yazıların rengi ne olacak. Resimler sağa mı sola mı yerleştirlecek, Tabloların kenarları kalın mı olacak. Bu kararları verdikten sonra bu işi html ile yapmanız çok zordur. Html'in yetersiz olduğu sayfayı biçimlendirme işlemi artık css(cascading style sheet)'nin işidir
    Css'nin Önemi

    Web sitenizde yüzlerce link olduğunu düşünün. Bu linklerin rengini kırmızı yapmak isterseniz nasıl yaparsınız. Html'de bunu ancak font etiketi ile yapalirsiniz. Linkleri kırmızı yapmak için tüm linklerin font etiketini değiştirmeniz gerekir. Css'de bu işlem çok kolaydır. Tek bir satırı değiştirmek yeterli olacaktır. Sonuç olarak CSS kullanmak kolaydır
    Yaptığınız bir stili ayrı bir css dosyasına yazarsanız tüm sitenizde aynı stili kullanabilirsiniz. Halbuki Html'de yaptığınız hiç bir stili başka yerde kullanamazsınız. CSS'in en büyük yaralarından bir yeniden kullanılabilmesidir
    CSS stillerini ayrı bir dosyaya koyabilirsiniz. Bu sayede yanlızca aynı sayfada değil istediğiniz her yerde stillerinizi kullanabilirsiniz.
    Html'in stilleme yeteneği çok azdır. Fakat CSS ile çok zengin biçimlendirme yapabilirsiniz.
    Comment-Yorum

    CSS'de /* ile */ işaretleri arasındakiler dikkate alınmaz. Buraları yorum için kullanılır.
    a{ color:Red; /*burası yorumdur*/ font-size:10pt;}

    CSS'in Yapısı ve Selector'lar


    Css'nin Yapısı
    Css yapı(rule)'lardan oluşur. Yapı'ların temeli Selector(seçiçi) denilen yapılardır. Aşağıda h3 ile kullanılan başlığın rengini kırmızı yapıyoruz.
    CssSimpleExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 h3{
    5 color:red;
    6 }
    7 </style>
    8 </head>
    9 <body>
    10 <h3>Bu başlık kırmızı olur</h3>
    11 <h4>Bu başlık kırmızı olmaz</h4>
    12 </body>
    13 </html>

    h3{color:red;}, rule'dır. {'den önce yazılan bölüme selector denir. Burada h3 selector'dür. {}'in içindeki property:value çiftleri de decleration'dır. Decleration'larda birden fazla value kullanılabilir. örneğin
    p{
    font:10pt Times
    }

    olduğu gibi 10pt ve Times value'leri kullanılabilir. 10 pt font'un boyu, Times'sa font tipidir.
    selector'lar gruplandırılabilirler. Örneğin
    h1,h2,h3{
    font-size:10pt;
    }

    Çağlayan Yapısı ve Inheritance
    Html elementlerin hiyerarşilerinden oluşur. Tüm elementlerin en tepesinde html elementi vardır. Onun içinde head, head'in içinde ise title elementi kullanılır. Yine h1 elementi body elementinin içinde kullanılır. body'in stilinde renk olarak kırmızı verilsin, h3'ün rengi mavi yapılsın. h3 içindeki yazılar kırmızı mı mavi mi olurlar. h3 mavi istiyor ancak body kırmızı istiyor. h3 içindeki yazıların rengi mavi olur. Her zaman en alttaki etiket etkili olur. h3'teki yazı h3'ün içinde olduğunda h3'ün dediği olur. Aşağıda bu örneği görüyorsunuz.
    CssInheritanceExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 body{
    5 color:red;
    6 }
    7 h3{
    8 color:blue;
    9 }
    10 </style>
    11 </head>
    12 <body>
    13 <h3>bu başlık mavi olur</h3>
    14 <p>bu yazı kırmızı olur</p>
    15 </body>
    16 </html>

    Bir tag'in biçimini başka bir tag'e göre verebilirsiniz. örneğin <i> tag'i p tag'in içinde red, h1 tag'inin içinde blue olması için şunu yapmamız gerekir.
    CssContextualExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 p i{
    5 color:red;
    6 }
    7 h1 i{
    8 color:blue;
    9 }
    10 </style>
    11 </head>
    12 <body>
    13 <h4>buradaki yazıda <i>renk değişmeyecek</i> olacak</h4>
    14 <h1>buradaki yazıda <i>mavi</i> olacak</h1>
    15 <p>buradaki yazıda <i>lırmızı</i> olacak</p>
    16 </body>
    17 </html>

    Eğer selector1 selector2{...} şeklinde bir yapı varsa şu anlama gelir. selector2 eğer selector1 tag'in içinde ise bu stili uygula. Bu birden fazla selector için de kullanılabilir. Örneğin
    div p i{....}

    şeklinde kullanılırsa div tag'inin içindeki p tag'inin içinde i varsa bu stil uygulanır.
    Class ve İd selector
    Yukarıdaki örneklerde selector olarak h3,body gibi elementler kullanılmıştır. Class ve id selector kullanmak çok yararlıdır. Class selector .isim,id selector #isim ile yaratılır. Aşağıda redHead ve blueHead adlı iki class yaratılmakta ve kullanılmaktadır. Bu class'lar renk özelliği olan tüm elementlere uygulanabilir(body,h1...,h6,p vs..). İd kullanımında . yerine #,class yerine id yazmak yeterlidir.
    CssClassExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 .redHead{
    5 color:red;
    6 }
    7 .blueHead{
    8 color:blue;
    9 }
    10 </style>
    11 </head>
    12 <body>
    13 <h3 class="redHead">bu başlık kırmızı olur</h3>
    14 <h1 class="blueHead">bu yazı mavi</h1>
    15 </body>
    16 </html>

    id'li kullanım
    CssIdExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 #redHead{
    5 color:red;
    6 }
    7 #blueHead{
    8 color:blue;
    9 }
    10 </style>
    11 </head>
    12 <body>
    13 <h3 id="redHead">bu başlık kırmızı olur</h3>
    14 <h1 id="blueHead">bu yazı mavi</h1>
    15 </body>
    16 </html>

    id'ler sadece bir kere kullanılabilirler. class'lar ise istenildiği kadar kullanılabilir.
    Pseudo Elements ve Pseudo Class
    Pseudo elementler veya classların başında : işareti bulunur. Aşağıda bir link üzerine gelindiğinde stilini değiştirmek için :hover pseudo classı kullanılmaktadır. Fare ile linkin üzerine gelindiğinde linki kırmızı renkte yapıyoruz.
    CssHoverExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 a:hover{
    5 color:red;
    6 }
    7 </style>
    8 </head>
    9 <body>
    10 <a href="bilmemne.html">tıkla</a>
    11 </body>
    12 </html>

    :link pseudo class'ı henüz tıklanmamış linklerin biçimlerini set eder. :visited ise bir kere tıklanmış (ziyaret edilmiş) linklerin biçimini kontrol etmek için kullanılır. :active ise bir seçili durumdaki (yeni tıklanmış) linklerin biçimnini ayarlamak için kullanılır. :focus ise elemnt focus'landığı zaman biçim vermek için kullanlır. aşağıda tüm bu pseudo classları kullanıyoruz.
    CssPseudoExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 :link{
    5 color:gray;
    6 }
    7 a:hover,a:visited:hover,a:active:hover{
    8 color:red;
    9 }
    10 a:active{
    11 color:green;
    12 }
    13 a:visited{
    14 color:brown;
    15 }
    16 </style>
    17 </head>
    18 <body>
    19 <a href="bilmemne.html">tıkla</a>
    20 </body>
    21 </html>

    Specificity-Öncelik
    Şöyle bir örnek olsun
    CssSpecificityExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 .mystyle{
    5 color:blue;
    6 }
    7 p{
    8 color:red;
    9 }
    10 </style>
    11 </head>
    12 <body>
    13 <p class="mystyle">buradaki yazı ne renk?</p>
    14 </body>
    15 </html>

    görüldüğü gibi p red olsun, .mystyle class'ı blue olsun istiyor. Biri diğerinin altında veya üstünde olmadığına göre kimin dediği olacak. Burada devreye öncelik meselesi girmektedir. burada .mystyle'ın dediği olur. en yüksek öncelik id selector'undur. daha sonra class selector ve en son tag selector gelir.
    Dosya Listesi
    · CssSimpleExample.html
    · CssInheritanceExample.html
    · CssContextualExample.html
    · CssClassExample.html
    · CssIdExample.html
    · CssHoverExample.html
    · CssPseudoExample.html
    · CssSpecificityExample.html

    CSS'de Text ve Font


    Text'i Biçimlendirme
    Css'de bir text'in rengini değiştirmek için color property'si kullanılır.
    p{
    color:red;
    }

    Bir text'i bir elemanın içinde (table,box vs..) nereye koyacağımızı text-align property'si belirler. Aşağıda div tag'inin içindeki yazı sola alınmaktadır
    div{
    text-align:left;
    }

    Yazının ilk satırının ne kadar içeride olması gerektiğini belirlemek için text-indent property'si kullanılır.
    p{
    text-indent:5px;
    }

    Bazı yazıların altı çizgili, bazı yazıların üstü çizgili gibi yazılara bazı decoration'lar verilebilir. bunun için text-decoration kullanılır. Örneğin link'lerdeki alt çizgi şu şekilde kaldırılabilir.
    a{
    text-decoration:none;
    }

    text-decoration tipleri none,underline,overline,blink(yanıp sönme),line-through'dur.
    harfler arasındaki boşluk letter-spacing, kelimeler arasındaki boşluk ise word-spacing property'si ile sağlanır.
    p{
    letter-spacing:0.1em;
    word-spacing:1em;
    }

    Text'in Font'nu Değiştirme
    CSS'de font'un tipi font-family ile belirlenir. Font-style ile italik veya oblique yapılabilir. Font-weight ile bold yapılabilir. Bu propery ile bold'luğun derecesi verilebilir. Font-size ile yazının boyu ayarlanır. Aşağıdaki örnekte tüm bu özellikler kullanılmaktadır.
    CssFontExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 h1,h2,h3{
    5 font-weight:bold;
    6 }
    7 p{
    8 font-family:Times;
    9 font-size:10pt;
    10 }
    11 .warning{
    12 font-style:italic;
    13 font-size:8pt;
    14 font-family:Arial;
    15 }
    16 </style>
    17 </head>
    18 <body>
    19 <h1>Css Kitabı</h1>
    20 <p>bu kitap çok önelidir. İşe yarar. Kulnanması kolaydır</p>
    21 <p class="warning">dikkat dikkat bu bir uyarıdır</p>
    22 </body>
    23 </html>

    Dosya Listesi
    · CssFontExample.html

    CSS'de Box Model'i


    Box Model'e Giriş
    Box(Kutu) model'inde dikdörtgensel bir bölge tanımlanır. Bu bölgenin biçimlendirilmesi için bir çok stil sağlanmıştır. Örneğin box'un soldan,sağdan,yukarıdan,aşağıdan uzaklığı, diğer box'larla olan ilişkisi, box'ın içindeki content(içerik) ile olan ilişkisi css ile sağlanır.
    Bir box şu bölümlerden oluşur. Content(İçerik) ,Border(Sınır) ve Box'ın koyulduğu box veya sayfa. Bir box'un soldan,sağdan,yukarıdan ve aşağıdan ne kadar uzaklıkta olacağını margin property'si belirler. Content'tin border'a göre uzaklıklıkları padding property'si ile ayarlanır. Border property'si ile box'ın border'ı biçimlendirilir.
    Margin
    Margin ile box'un çevresinden olan uzaklıklar ayarlanır.
    CssMarginExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 div{
    5 margin-left:50px;
    6 margin-right:20px;
    7 margin-top:100px;
    8 margin-bottom:40px;
    9 background:red;
    10 }
    11 </style>
    12 </head>
    13 <body>
    14 <div>Bu yazı div içine koyulmuştur. ve box modeli ile çevresinden uzaklıkları ayarlanmaktadır.</div>
    15 </body>
    16 </html>

    Burada box'ın sayfadan uzaklıklarını ayarladık. Background'u kırmızı vererek kutunun boyutlarının daha iyi görünmesini sağlıyoruz. Şimdi ise div tag'inin içindeki yazıların box'tan olan uzaklıklarını ayarlayacağız.
    Padding
    Şimdi kutunun content'tinin border'lardan olan uzaklıkları ayaralanacak. Bunun için padding property'si kullanılır.
    CssPaddingAndMarginExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 div{
    5 margin-left:50px;
    6 margin-right:20px;
    7 margin-top:100px;
    8 margin-bottom:40px;
    9 padding-left:40px;
    10 padding-right:50px;
    11 padding-top:20px;
    12 padding-bottom:30px;
    13
    14 background:red;
    15
    16 }
    17 </style>
    18 </head>
    19 <body>
    20 <div>Bu yazı div içine koyulmuştur. ve box modeli ile box'un çevresinden uzaklıkları ve yazının box'un border'ından uzaklıkları ayarlanmaktadır.</div>
    21 </body>
    22 </html>

    Border Özellikleri
    Kutunun sınırlarını biçimlendirmek için border property'si kullanılır. Kutunun tüm border'ı veya sol,sağ,alt ve üst sınırlarını ayrı ayrı biçimlendirilebilir. border-style ise border'ın biçimi verilir. Bu biçimler none, hidden, dotted, dashed, solid, double, groove, ridge, inset, outset'dir. Border'ların genişliği border-width ile verilir. Renk ise border-color ile verilir. Aşağıdaki örnekte tüm border'ları değişik bir görünüm yapıyoruz.
    CssBoxExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 div{
    5 margin-left:50px;
    6 margin-right:20px;
    7 margin-top:100px;
    8 margin-bottom:40px;
    9 padding-left:40px;
    10 padding-right:50px;
    11 padding-top:20px;
    12 padding-bottom:30px;
    13
    14 border-right-style:double;
    15 border-right-width:6px;
    16 border-right-color:red;
    17
    18 border-top-styleutset;
    19 border-top-width:10px;
    20 border-top-color:green;
    21 border-bottom-style:dashed;
    22 border-bottom-width:5px;
    23 border-bottom-color:yellow;
    24
    25 }
    26 </style>
    27 </head>
    28 <body>
    29 <div>Bu yazı div içine koyulmuştur. ve tam teşekküllü bir box'dır. Box model'in ne kadar güzel olduğunu göstermektedir.</div>
    30 </body>
    31 </html>

    Dosya Listesi
    · CssMarginExample.html
    · CssPaddingAndMarginExample.html
    · CssBoxExample.html

    Görünüm Biçimlendirme


    Display Property
    CSS'de üç tip görünüm olabilir. Birinci görünüm block-level görünümdür. Block-level görünümünde koyulan elemantten önce ve sonra satır kırılması yapılır. Örneğin p,h1,h2...,h6 ,form vs.. block-level'dir. p tag'ini koyduğunuzda p alt satırdan devam eder.Block-level elementler yan yana görünemezler.
    İkinci tip inline elementlerdir. İnline elementlerde satır kırılması yapılmaz. örneğin i,a,b tag'i inline'dir. Bir paragrafın içine a koyduğunuzda paragrafın akışı değişmez. inline elementler block-level elementlerin içine koyulabilirler.
    Üçüncü tiptekilerde list-item tipidir. Bu tipte block-level gibi önce ve sonrasında satır kırılır fakat tek başına kullanılmaz. Bir listenin paraçasıdır ve başka block-level'in içindedir.
    Bir elementin block-level,inline veya list-item olarak görünmesini sağlayabilirsiniz. Bunun için display property'si kullanılır. Örneğin eğer img için display:block derseniz her image koyulduğunda yeni satır yapılır. Eğer display:inline derseniz yeni satır yapılmaz ve bir i veya b tag'i gibi kullanabilirsiniz
    Eğer bir elementin için dipslay:none yazarsanız o element görülmez.Web sayfalarında menüler bu şekilde yapılabilirler. Fare menunun üzerine geldiğinde menu maddelerinin özelliği display:block yapılır. Fare menuden ayrılırsa menu maddeleri display:none yapılarak görünmez hale getirilir.
    Flow-Akış Kontrolü
    Normal akış soldan sağa ve yukarıdan aşağıya doğrudur. Örneğin siz 10 resim eklediyseniz resimler solda sağa doğru yerleştirilirler. Eğer sağda yer kalmazsa aşağıdan devam ederler. Örneğin siz bir resmi eklediniz ve daha sonra eklediğiniz paragrafın resmin sağından akmasını istiyorsunuz. Halbuki normalde p tag'ini eklediğinizde yeni satıra geçer ve resmin altından başlar. Hiç bir zaman yazının resmin yanından akmasını sağlayamazsınız. İşte bu sorunu çözmek için float ve clear property'leri kullanılmaktadır.
    Float property
    float özelliği bir box'ı,resmi,tablo'yu vs.sola, sağa yerleştirmek için kullanılır. Siz bir elemanı flaot=left ile yerleştirirseniz bundan sonraki elmanlar o elamanın sağından akar. Yukardaki örnekle düşünürsek eğer resme float:left dersek bundan sonraki paragraf normal akışı olarak resmin sağından hareket edecektir. Aşağıda bu örneğin kodu görülmektedir.
    CssFloatExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 img{
    5 float:left;
    6 }
    7 </style>
    8 </head>
    9 <body>
    10 <img src="test.gif"></img>
    11 <p>Burada ki yazılar resmin sağından akacak ve yoluna devam edecek. Burada ki yazılar resmin sağından akacak ve yoluna devam edecek. resmi geçtikten sonra en oldan yazı devam edecek. devam edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek edecek </p>
    12 </body>
    13 </html>

    float:left dememiz sayesinde image sola yerleştirilir. Yazılarda onun sağından normal akışına devam eder. Eğer resmi sağa yazıyı sola almak istiyorsanız img için float:right demeniz yeterlidir.
    Clear property
    flaot özelliği ile resmi yerleştirdiğimizde bundan sonra eklenenler resmin sağından akacaktır. Şimdi resmi koydunuz, resmin sağından akacak yazıyıyı yazdınız. Ancak hala remin sağında boşluk var. Bundan sonra bir h1 başlık koyduğunuzda bu başlıkta sağda gözükecek. Halbuki siz bu başlığı solda görmek istiyorsunuz. Bu nasıl olacak. İşte bunun için clear özelliği kullanılır. h1 için clear:left yapılırsa h1 başlığı resmin sağına koyulmaz. Resmin altından normal akıştaki gibi devam eder. Aşağıda bu örneği görüyorsunuz.
    CssClearExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster

    1 <html>
    2 <head>
    3 <style>
    4 img{
    5 float:left;
    6 }
    7 h1{
    8 clear:left;
    9 }
    10 </style>
    11 </head>
    12 <body>
    13 <img src="test.gif"></img>
    14 <p>Burada ki yazılar resmin sağından akacak ve yoluna devam edecek. Burada ki yazılar resmin sağından akacak ve yoluna devam edecek. resmi geçtikten sonra en oldan yazı devam edecek.</p>
    15 <h1>Bu başlık resmin altında olacak</h1>
    16 </body>
    17 </html>

    Eğer clear:left demeseydik h1 başlığı resmin sağında olurdu.
    Dosya Listesi
    · CssFloatExample.html
    · CssClearExample.html

  3. #3
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Lightbulb

    Javascript


    JavaScript'e Giriş

    Javascript Dili

    Events-Olaylar

    Nesneler


    Javascript'te Giriş

    Javascript nedir?
    Html ile kullanıcının hareketlerine, özelliklerine göre sayfanızda değişiklik yapmanız mümkün değildir. Kullanıcı fareyi hareket ettirdiğinde, sayfa browsera yüklendiğinde, form düğmesi tıklandığında bazı işlemler yapmak istiyorsanız javascript kullanmalısınız. Javascript sayfaya dinamiklik kazandırır
    Javascript dil olarak c, c++, java'yı andırır. İf-else, for döngüsü, fonksiyon kullanımı, nesne kullanımı bu dillerlerle benzerlikler gösterir.
    Javascript event temellidir. Yazdığınız javascript kodları bir event sonucu çalıştırılırlar. Örneğin sayfa yüklenir yüklenmez bir işlem yapmak için body etiketinin onLoad özelliğini kullanırsınız. Sayfanın yüklenmesi bir event'tir. Yine bir kullanıcı form düğmesine tıklayınca bir işlem gerçekleştirmek için düğmenin onClick özelliği kullanılır. Yani bir event(olay) oluşur ve siz onu yakalarsınız.
    Javascript ile sayfanızın, browserın, formunuzun vs.. çeşitli nesnelerin özelliklerini değiştirebilirsiniz. Javascript nesnelerin özelliklerini kullanmanızı sağlayan mekanizmalar bulundurur. Burada temel kavram nesne'lerdir. Örneğin window nesnesi browser penceresi'dir. Browser'ın durum çubuğunda bir yazı yazmak istiyorsanız window nesnesinin status özelliğini değiştirirsiniz. window.status="selam".
    Javascriptte bir çok dilde de bulunan dizi, string, date gibi nesneler bulunmaktadır. Bu tür nesnelere built-in nesneler denir. Bunlar window,form,document gibi nesnelerden farklıdır. Window,form,frame gibi nesneler web sayfanızla ilgili nesnelerdir.
    Özetlersek javascript bilmek demek şudur. Dili bilmek(değişken, fonksiyon, döngü, koşullar vs..), built-in nesneleri bilmek(dizi, string), nesneleri bilmek(window, document, form vs..) ve event'leri(olay) bilmek ve yakalayabilmek(onClick, onMouseOver, onLoad vs..)


    Javascript

    Değişkenler
    Değişkenler veri saklayan yapılardır. Aşağıda bazı değişkenler görülüyor:
    name="ali";
    number1=3;
    number2=4;
    length=2.3;
    isSubmit=true;
    sum=number1+number2;

    görüldüğü gibi değişkenlerin tipleri vardır. String "" ile kullanılır. name string değişkenidir. number1, number2, length, sum sayı değişkenleridir. Sırasıyla integer, integer, float, integer tipindedir. isSubmit boolean tipindedir. Boolean tipi true(doğru) veya false(yanlış)'dır.
    Diziler
    Dizi javascript'te built-in nesnedir. Aşağıda bir dizi yaratıyoruz ve ilk iki elamanını değişkenlere atıyoruz.
    students=new Array("ali","veli","sezai","recai");
    first=students[0];
    second=students[1];

    new Array(elemenlar) ile bir students adında bir dizi yaratıyoruz. Dizilerdeki elemanları almak için diziAdı[index] kullanılır. Dikkat edilecek şey javascripte index'ler 0'dan başlarlar. 0 index'li eleman ilk elemandır.
    İf-Else Yapısı
    İf else koşul için kullanılır. Yani eğer şöylese şöyle yap,böyleyse de böyle yap demektir. Aşağıda eğer sayı 3'ten büyükse kendisiyle çarpıyoruz. Eğer küçükse kendisiyle topluyoruz
    //number değişkeni daha önce verilmiş olsun
    if(number>3){
    sum=number*number;
    }else{
    sum=number+number;
    }

    Eğer number üçten büyükse number>3 ifadesi doğru olur. Doğru olunca sum number'ın karesi olur. Eğer number>3 yanlışsa o zaman else içindeki kod yürütülür.
    For Döngüsü
    Elinizde bir dizi var. Tüm dizinin elemanlarına aynı işlemi uygulamak istiyorsunuz. Bunun için for döngüsü kullanabilirsiniz. For döngüsünde önce ilk başlangış verilir. Sonra bir koşul verilir. En son ne kadar değiştirme yapılacağı verilir. Değiştirme işlemi koşul doğru olduğu sürece gerçekleşir. Aşağıda bir dizinin elemanlarını toplayan kod görülüyor.
    sum=0;
    numbers=new Array(1,2,3,4,5);
    for(i=0;i<numbers.length;i++){
    sum=sum+numbers[i];
    }

    Bir dizinin kaç elemanlı olduğunu öğrenmek için dizi.length kullanılır. Döngü i=0'dan başlar. i dizinin boyundan küçük olduğu sürece i++ ile i 1 arttırılır. numbers[i] ile i.ninci eleman alınır ve toplama eklenir. Döngü bittiğinde tüm sayılar toplanmış olur. sum başta sıfırdır. Sonra ilk eleman eklenir. Sonra ikinci eleman eklenir ve son eleman eklendikten sonra işlem biter.
    Fonksiyonlar
    Fonsiyonlar bir işlem yapmak için geliştirilen kod parçasıdır. Örneğinin bir dizinin ortalamasını alan bir fonksiyon yapabilirsiniz. Böylece bir dizinin ortalamasını öğrenmeniz gerektiğinde daha önce yapmış olduğunuz bu fonksiyonu kullanırsınız. Yaptığımız fonksiyona ortalamasını almak istediğimiz diziyi vermeliyiz. Fonksiyonun dışarıdan aldığı bilgilere parametre denir. Bizim fonksiyon parametre olarak aldığı dizinin ortamasını bulup bize geri gönderir. Her fonksiyon parametre almak veya bir değer geri göndermek zorunda değildir.
    function makeSum(){
    sumNumber=sum(3,4);
    }
    function sum(number1,number2){
    return number1+number2;
    }

    Yukarıdaki örnekte sum fonksiyonu number1 ve number2 adında iki parametre almaktadır. Bu iki sayıyı toplayıp sonucu geri göndermektedir. return bir değişkeni geri göndermek için kullanılır. makeSum ise hiçbir parametre almaz. İçindeki sum(3,4) ile sum fonksiyounu çağırır ve 3 ve 4 sayıları toplanır. ve sumNumber değişkenine toplam atanır. Hiç bir şeyi geri göndermez.
    Nesneler
    Nesne nedir. Nesne kütlesi, hacmi olan şey'dir(fen bilgisi dersleri). Gerçek hayatta her şey nesnelerden oluşur. Örneğin ali nesnedir. Ali'nin saçı, boyu, göz rengi, kilosu vardır. Bunun yanında ali uyur, yürür, yemek yer, düşünür. Ali'nin özellikleri ve eylemleri vardır. Ali'nin göz rengi onun özelliğidir. Yürümek ali'in bir eylemidir. Javascripte de nesneler gerçek hayattaki nesnelere benzer. Nesnelerin özellikleri(property) vardır. Nesnelerin eylemleri fonksiyonlarıdır. Nesnenin fonksiyonlarına method denir. Sonuç olarak bir nesnenin özellikleri ve methodları vardır. Javascriptte kullanılabilecek hazır nesneler yaratılmıştır. Aşağıda built-in nesne olan Array(dizi) örneğiyle bir nesnenin özelliklerini ve methodlarını kullanma anlatılıyor.
    students=new Array("ali","bali","cali","kali","zali");
    l=students.length;//Array nesnesinin length özelliği dizinin boyudur.
    students.reverse();//reverse methodu elemanlarının sırasını ters çevirir.
    students.sort();//alfabetik olarak dizi elemanlarını sıralar.

    Genel bir şekilde yazarsak
    objectName=new Object(parametreler); //yeni bir nesne yaratılıyor.
    objectName.property="yeni deger"; //nesnenin özelliği değiştiriliyor.
    value=objectName.property; //nensenin özelliği başka bir değişkene atanıyor.
    objectName.methodName(parametreler); //nesnenin methodunu kullanılıyor.

    Nesne Yaratma
    Javascriptte fonksiyonları kullanarak kendi nesnelerinizi yaratabilirsiniz. Nesnelerinizin özellikleri ve fonksiyonları olabilir. Nesne yaratmak için function kelimesi kullanılır. Şimdi basit bir name nesnesi yaratalım. Bu nesnenin first (ad),last(soyad), ve display diye ad ve soyadını bir alert penceresinde gösteren bir metodu vardır.
    function Name(first,last) {
    this.first = first;
    this.last = last;
    this.display = displayName;
    }
    function displayName() {
    alert(this.first + " " + this.last);
    }

    Burada name nesnesinin first, last diye iki özelliği, display diye bir metodu bulunmaktadır. Ad ve soyad bu nesne yaratılacağı zaman verilir. display ise nesne.display() şeklinde kullanılır. Nesne var zafer=new name("zafer","teker") şeklinde yaratılır. display metodunu çağırmak için zafer.display() kullanılır. Aşağıda bir örnek bulununmaktadır. Düğme tıklandığında display metodu çağrılır
    ScriptObjectExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="Javascript">
    4 function Name(first,last) {
    5 this.first = first;
    6 this.last = last;
    7 this.display = displayName;
    8 }
    9 function displayName() {
    10 alert(this.first + " " + this.last);
    11 }
    12 var aName = new Name("Mesut","Alioglu");
    13 </script>
    14 <body>
    15 <form>
    16 <input type="button" name="display" value="display" onClick="aName.display()">
    17 </form>
    18 </body>
    19 </html>

    Yarattığınız nesneler diğer yarattığınız nesnelere parametre olarak verilebilir. Şimdi bir name nesnesi yaratalım. Daha sonra bir human nesnesi yaratalım. human nesnesi de name nesnesini parametre olarak alsın.
    ScriptObjectParametreExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <script language="Javascript">
    3 function name(firstname,lastname){
    4 this.firstname=firstname;
    5 this.lastname=lastname;
    6 }
    7 function Human(name,email) {
    8 this.firstname=name.firstname;
    9 this.lastname=name.lastname;
    10 this.email=email;
    11 }
    12 function start(){
    13 var myname=new name("Ali","Mesut");
    14 var myhuman=new Human(myname,"mesutali@yahoo.com")
    15 alert(myhuman.firstname+" "+myhuman.lastname+" "+myhuman.email)
    16 }
    17 </script>
    18 <body onLoad="start()">
    19 </body>
    20 </html>

    Javascripte bir nesne başka bir nesneden türeyebilir. Yani bir mühendis insandan türer. Bir bilgisayar mühendisi'de mühendisten türer. Aşağıdaki örnekte bir human nesnesi yaratıyoruz. Sonra engineer nesnesi, ondan da ComputerEngineer nesnesi yaratıyoruz. base özelliği bir nesnenin türediği atasını gösterir. this.base=atanesne ile nesnenin ata nesneni belirleniyor. Sonra the.base(parametre) ile kuruluyor. engineer nesnesinin base'i humandır. ComputerEngineer nesnesinin base'i engineer'dir ve job'ta Bilgisyar Mühendisidir. Örnekte yap düğmesi tıklandığında serhat yaratılmakta. Ve sonra onun işi,adı ve idi alert penceresine yazılmakta.
    ScriptObjectInheritanceExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function human(name,id){
    5 this.name=name;
    6 this.id=id;
    7 }
    8 function engineer(name,id,job){
    9 this.job=job;
    10 this.base=human;
    11 this.base(name,2);
    12 }
    13 function ComputerEngineer(name,id){
    14 var job="Bilgisayar Mühendisi";
    15 this.job=job;
    16 this.base=engineer;
    17 this.base(name,id,job);
    18 }
    19 function yap(){
    20 serhat=new ComputerEngineer("Serhat","2");
    21 alert("Job: "+serhat.job+" Name: "+serhat.name+" İd: "+serhat.id);
    22 }
    23 </script>
    24 <body>
    25 <form>
    26 <input type="button" onClick="yap()" value=" yap ">
    27 </form>
    28 </body>
    29 </html>

    Dosya Listesi
    · ScriptObjectExample.html
    · ScriptObjectParametreExample.html
    · ScriptObjectInheritanceExample.html

    Javascript'te Event(Olay)


    Event-Driven Dil
    Javascipt event-driven bir dildir. Javascript kodları bir event(olay) sonucu çalıştırılırlar. Bu olay sayfanın yüklenmesi, bir düğmenin tıklanması, bir form elemanının aktif hale gelmesi vs.. olabilir. Bir olay olduğunda programcı bu olayı yakalar ve istenen işlemler yapar.
    onLoad-onUnload
    onLoad sayfa yüklenir yüklenmez bir kod çağırmak için kullanılır. onUnload ise sayfa kapatıldığı zaman bir işlem yapmak için kullanılır. Aşağıda sayfa yüklenir yüklenmez hoşgeldiniz mesajı gösteren ve kullanıcı sayfadan ayrılırken de güle güle mesajı gösteren bir örnek görülmektedir. onLaod ve unLoad body tag'inin içinde olmalıdır.
    ScriptLoadEventExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <body onLoad="alert('hoşgeldiniz')" onUnload="alert('güle güle')">
    3 <h1>Bu sayfa onLaod ve onUnLoad testi için hazırlanmıştır.</h1>
    4 </body>
    5 </html>

    onClick
    OnClick bir düğme tıklandığında veya bir link tıklandığında bir işlem yapmak için kullanılır. Onay ve seçenek kutuları içinde onClick kullanılabilir. Aşağıda bir süğmeye tıklandığında merhaba mesajı veren bir örnek görüyorsunuz.
    ScriptClickEventExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <body>
    3 <h1>Bu sayfa onClick testi için hazırlanmıştır.</h1>
    4 <form>
    5 <input type="button" value="tıklayın" onClick="alert('merhaba')"></input>
    6 </form>
    7 </body>
    8 </html>

    onMouseOver ve OnMouseOut
    onMouseOver fare ile bir link üzerine gelindiğinde bir işlem yapmak için kullanılır. OnMouseOut ise tam tersine fare link'in üzerinden ayrıldığı zaman bir işlem gerçekleştirmek içindir. Aşağıda bir link'in üzerine gelindiğinde hoşgeldin yazan bir örnek görülmektedir.
    ScriptMouseOverAndOutExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <body>
    3 <h1>Bu sayfa onMouseOver testi için hazırlanmıştır.</h1>
    4 <a href="" onMouseOver="alert('merhaba')">tıklamayın</a>
    5 </body>
    6 </html>

    onSubmit
    Form bilgileri submit düğmesine tıklandığında form'un action property'sindeki programa gönderilir. Eğer gönderme işleminden önce bir işlem yapmak istiyorsanız form tag'in onSumbit property'sini kullanacaksınız. Eğer form istediğiniz gibi doldurulmamışsa form bilgilerini göndermeyebilirsiniz. Aşağıdaki örnekte form bir text alanından oluşmakta. Eğer text alanı doldurulmamışsa form bilgisi gönderilmemektedir.
    ScriptSubmitEventExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function check(aForm){
    5 if(aForm.testText.value==""){
    6 alert("Text Alanı Boş");
    7 return false;
    8 }else{
    9 return true;
    10 }
    11 }
    12 </script>
    13 </head>
    14 <body>
    15 <form acton="test.jsp" name="testform" onSubmit="return check(this)">
    16 <input type="text" name="testText" size="10"></input>
    17 <input type="submit" value="submit"></input>
    18 </form>
    19 </body>
    20 </html>

    Submit event'i gerçekleştiğinde check fonksiyonu çağrılmaktadır. Bu fonksiyon true gönderirse form bilgisi gönderilir. Eğer false gönderirse fomr bilgisi gönderilmez. check fonksiyonu form'daki adı testText olan textfield'dinin boş olup olmadığını kontrol ediyor. Eğer boşsa alert ile bir mesaj gönderiyor ve textfield'in boş olduğunu söylüyor.
    onReset
    Girilen Form bilgilerini temizlemek için kullanılan reset düğmesi tıklandığında bir işlem yapmak istiyorsanız onReset kullanılır. Aşağıdaki örnekte reset düğmesi koyuyoruz ve onReset olayında reset işleminin yapaılacağını bildiren bir mesaj gösteriyoruz.
    ScriptResetEventExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function isReset(){
    5 alert("formunuzu resetliyorum. İşlem bir kaç dakika sürebilir.");
    6 return true;
    7 }
    8 </script>
    9 </head>
    10 <body>
    11 <form acton="test.jsp" name="testform" onReset="return isReset()">
    12 <input type="text" name="testText" size="10"></input>
    13 <input type="submit" value="submit"></input>
    14 <input type="reset" value="reset"></input>
    15 </form>
    16 </body>
    17 </html>

    isReset fonksiyonu sonuç olarak true gönderdiği için işlem gerçekleşmektedir.
    onChange
    Bir formda bir değişiklik yapıldığında bir işlem yapmak istiyorsanız onChange property'sini kullanacaksınız. onChange özelliği ancak başka bir yere focus'landığında çağrılır. Her harf girişinde çağrılmaz. Aşağıdaki örnekte bir text alanına yazı girildikçe yazıyı status bar'da gösteren bir örnek vardır. Yazıyı girip başka bir yere tıklarsanız yazının statusbar'da yazılı olduğunu görürsünüz.
    ScriptChangeEventExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function change(aTextField){
    5 status=aTextField.value;
    6 }
    7 </script>
    8 </head>
    9 <body>
    10 <form acton="test.jsp" name="testform" onReset="return isReset()">
    11 <input type="text" name="testText" size="10" onChange="change(this)"></input>
    12 </form>
    13 </body>
    14 </html>

    status window.status yerine kullanılabilir. Değişme olduğunda change fonksiyonu çağrılmaktadır. Bu fonksiyona textdfield parametre olarak gönderilir.
    onFocus ve onBlur
    Bir form elemanı tıklandığı focus'landığı zaman (aktif hale geldiği zaman) bir işlem yapmak için onFocus kullanılır. Eğer bir eleman focus'luğunu kaybettiğinde bir işlem yapmak istiyorsanız onBlur kullanılır. Aşağıdaki örnekte textfield focus'landığı zaman focus'landığını belirten bir mesaj, focus'luk özelliği kalkınca bunu belirten bir örnek bulunmaktadır.
    ScriptFocusAndBlurEventExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function focusField(aTextField){
    5 alert(aTextField.name+" is focused");
    6 }
    7 function blurField(aTextField){
    8 alert(aTextField.name+" is blured");
    9 }
    10
    11 </script>
    12 </head>
    13 <body>
    14 <form acton="test.jsp" name="testform" onReset="return isReset()">
    15 <input type="text" name="testText1" size="10" onFocus="focusField(this)" onBlur="blurField(this)"></input>
    16 <input type="text" name="testText2" size="10" onChange="change(this)" onFocus="focusField(this)" onBlur="blurField(this)"></input>
    17 </form>
    18 </body>
    19 </html>

    Dosya Listesi
    · ScriptLoadEventExample.html
    · ScriptClickEventExample.html
    · ScriptMouseOverAndOutExample.html
    · ScriptSubmitEventExample.html
    · ScriptResetEventExample.html
    · ScriptChangeEventExample.html
    · ScriptFocusAndBlurEventExample.html

    Javascript'te Nesneler


    Nesneler
    Javascript'te web sayfasını ve browser'ın özelliklerini kontrol etmeniz için nesneler vardır. Örneğin Navigator nesnesi Browser hakkında bilgi öğrenmeniz için kullanılır. Bu nesnenin app özelliği browser'ın adını verir. Bazı nesneler html elementlerine karşılık gelirler. Örneğin sayfanızda form varsa Form nesneside var demektir. Bu formun özelliklerini javascript ile değiştirebilirsiniz. Navigator ve Window nesnesi ise html tag'ine karşılık gelmez. Bu nesneler browser ile ilgili işlemler için kullanılır. Sırayla bu nesneleri ileyeceğiz.
    Navigator Nesnesi
    Bu nesne browser'a karşılık gelir. Browser hakkında bilgi almak için bu nesne kullanılır. Aşağıdaki örnekte browser'ın adını ve versiyonunu gösteren bir kod bulunmaktadır.
    ScriptNavigatorExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function infoNavigator(){
    5 alert(navigator.appName+" "+navigator.appVersion);
    6 }
    7 </script>
    8 </head>
    9 <body onLoad="infoNavigator()">
    10 </body>
    11 </html>

    Sayfa yüklenir yüklenmez infoNavigator fonksiyonu çağrılmaktadır. Bu fonksiyon navigatorun adını ve versiyonunu bir mesaj penceresinde göstermektedir. Alert ekrana bir mesaj gösteren bir method'tur.
    Window Nesnesi
    Bir browser penceresi anlamına gelir. Bir pencere açmak, kapatmak, dialog kutuları açmak için kullanılır. Yukarıdaki örnekte kullanılan alert method'u window nesnesinin bir method'dudur.
    Pencere açmak için window nesnesini open method'u kullanılır. Aşağıdaki örnekte bir popup pencere açıyoruz.
    ScriptWindowOpenExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function openPopup(){
    5 window.open("test.html",'_blank','width=500,height =500,scrollbars=auto');
    6 }
    7 </script>
    8 </head>
    9 <body>
    10 <form>
    11 <input type="button" onClick="openPopup()" value="open popup"></input>
    12 </form>
    13 </body>
    14 </html>

    open method'unun ilk parametresi açılacak sayfanın adı, ikinci paramtre sayfanın target'idir. Üçüncü paramtre ise açılacak pencerenin özelliklerinin verilediği paramtredir. Burada özellikler aralarına virgül koyularak verilirler. Eğer toolbar istiyorsanız üçüncü paramtreye toolbar=yes diyeceksiniz. Bunun gibi bir çok özelliği değiştirmeniz mümkündür.
    Bir pencereden başka bir pencereyi açtınız. Peki yeni pencereden eski pencerenin özelliklerine nasıl erişeceksiniz. Yeni pencereden opener ile eski pencerenin özelliklerine erişilebilir. Aşağıdaki örnekte açılan pencere açan pencerenin status barına bir yazı yazmaktadır.
    ScriptOpenerExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <body>
    3 <form>
    4 <input type="button" onClick="open(ScriptOpenerPopup.html','_blank','wi dth=500,height=500')" value="open popup">
    5 </input>
    6 </form>
    7 </body>
    8 </html>

    Açılan pencere:
    ScriptOpenerPopup.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <body onLoad="opener.status='merhaba popuptan'">
    3 </body>
    4 </html>

    Ana pencere bir ScriptOpenerPopup.html dosyasını bir pencerede açmaktadır. ScriptOpenerPopup.html ise yüklenir yüklenmez opener pencerenin (yani ScriptOpenerExample sayfasının) statusbar'ında bir yazı yazıyor.
    Bir pencereyi kapatmak içinse close fonksiyonu kullanılır.
    Message Kutuları
    En basit mesaj kutusu ekrana verilen yazıyı yazan alert() method'u ile görüne kutudur. Diğer tip ise tamam ve iptal cevabı alan onaylatma işlemine yarayan confirm methodudur. Aşağıdaki örnekte bir düğme vardır. Düğme tıklandığında confirm kutusu çıkar. Sizden alınan cevabı alert ile ekranda gösterir.
    ScriptConfirmExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function question(){
    5 var result=confirm("tamam mı iptal mi ?");
    6 alert("Cevabın: "+ result);
    7 }
    8 </script>
    9 </head>
    10 <body onLoad="question()">
    11 </body>
    12 </html>

    Eğer tamam derseniz cevap true olur. İptal derseniz cevap false olur.Diğer bir mesaj kutusuda kullanıcdan bilgi girişi olan prompt dialog kutusudur. Aşağıdaki örnekte prompt kutusuna girilen yazıyı alert ile gösteren bir örnek görülmektedir.
    ScriptPromptExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function question(){
    5 var result=prompt("Bir şeyler yazın","");
    6 alert("yazdığın şey: "+ result);
    7 }
    8 </script>
    9 </head>
    10 <body onLoad="question()">
    11 </body>
    12 </html>

    Document Nesnesi
    Web sayfanızdaki tag'lere karşılık gelen tüm nesneler Document nesnesindedir. Document nesnesi en tepe nesnedir. Document nesnesinin içinde form,frame,link,image vb.. nesneler tutulur. Document nesnesini kullanarak yeni bir dokuman yaratabilir veya web sayfasının herhangi bir yerine kod ekleyebilirsiniz. Bunun için document nesnesinin write ve writeln method'ları kullanılır. Aşağıdaki örnekte açılan pencerede bir h1 başlığı yapıyoruz.
    ScriptDocumentWriteExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function openPopup(){
    5 var newWindow=window.open("",'_blank','width=500,heigh t=500');
    6 newWindow.document.writeln("<html><body><h1>Merhaba</h1></body></html>");
    7 }
    8 </script>
    9 </head>
    10 <body>
    11 <form>
    12 <input type="button" onClick="openPopup()" value="open popup"></input>
    13 </form>
    14 </body>
    15 </html>

    Bu örnekte boş bir pencere açıyoruz. bu pencerenin document nesnesini alıyoruz. Bir pencerenin document'i window nesnesinin bir özelliğidir. window.document şeklinde ulaşılabilir. Açılan pencerenin document nesnesini aldıktan sonra writeln ile html,body ve h1 etiketini yazdırıyoruz. Böylece başlığımız yeni pencerede gözüküyor.
    document nesnesinde linklerin, anchor'ların ,image'ların ,form'ların vs.. nesnelerin dizileri tutulur. Örneğin sayfanızdaki ikinci image nesnesine ulaşmak için document.images[1] yazmanız yeterlidir. Veya eğer image etiketin adını biliyorsanız document.imageName şeklinde de erişebilirsiniz. Aşağıdaki örnekte fare image'ın üzerine geldiğinde ikinci image gösteriliyor. Eğer fare image'ın üzerinden ayrılıyorsa ikinci image gösteriliyor.
    ScriptHoverImageExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function over(){
    5 document.test.src="test2.gif";
    6 }
    7 function out(){
    8 document.test.src="test1.gif";
    9 }
    10 </script>
    11 </head>
    12 <body>
    13 <img src="test1.gif" name="test" onMouseOver="over()" onMouseOut="out()"></img>
    14 </body>
    15 </html>

    Fare image'ın üzerine geldiğinde out fonksiyonu çağrılır. document.test test adındaki bir elemente karşılık gelir. Image'a biz test ismini verdiğimiz için document.test image nesnesi olmaktadır. Image nesnesinin src özelliği gösterilecek image'ın adıdır. out fonksiyonu document.test.src="test2.gif" ile ikinci image'ı görünür hale getirir. over ise fare image'ın üzerinden ayrıldığı zaman çağrılır. over fonksiyonuda test1.gif image'nı tekrar görünür hale getirir.
    Form Nesnesi
    Form nesnesi web sayfasında kullandığınız form'ların özelliklerine erişmek için kullanılır. Form'da bulunana elementlerin nesnelerinide barındırır. Tüm nesneler element dizisinde tutulut. Örneğin document'teki ilk formun ikinci elementine erişmek için
    document.forms[0].elements[1]

    yazmanız gerekir. Aşağıdaki örnekte bir formun ilk elementinin adını ekranda gösteren bir örnek görülmektedir.
    ScriptFormElementsExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function viewValue(){
    5 alert(document.forms[0].elements[0].value);
    6 }
    7 </script>
    8 </head>
    9 <body onLoad="viewValue()">
    10 <form name="test">
    11 <input type="text" name="testField" value="test"></input>
    12 </form>
    13 </body>
    14 </html>

    Form ilk elemtinin değeri başlangışta test'tir. Sayfa yüklenir yüklenmez viewValue( fonksiyonu çağrılır. Bu fonksiyonda document'teki ilk form'un ilk elementinin value'sü ekranda gösterir.
    Form'un bilgileri gönderilmeden form elemtlerini kontrol edebilirsiniz. Bunun içim form tag'in onSubmit özelliğini yakalarsınız. Eğer kurala uygunsa gönderir kurala uygun değilse göndermezsiniz.
    ScriptFormSubmitValidatorExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script language="javascript">
    4 function check(){
    5 if(document.forms[0].elements[0].value==""){
    6 alert("Text Alanı Boş");
    7 return false;
    8 }else{
    9 alert("Form Bilgisi Gönderiliyor");
    10 return true;
    11 }
    12 }
    13 </script>
    14 </head>
    15 <body>
    16 <form action="test.jsp" name="test" onSubmit="return check()">
    17 <input type="text" name="testField"></input>
    18 <input type="submit" value="submit"></input>
    19 </form>
    20 </body>
    21 </html>

    Form submit edildiğinde check fonksiyonu çağırılır. Eğer text alanı boşsa geriye false döndürülür. Böylece form bilgisi gönderilmez.
    Dosya Listesi
    · ScriptNavigatorExample.html
    · ScriptWindowOpenExample.html
    · ScriptOpenerExample.html
    · ScriptOpenerPopup.html
    · ScriptConfirmExample.html
    · ScriptPromptExample.html
    · ScriptDocumentWriteExample.html
    · ScriptHoverImageExample.html
    · ScriptFormElementsExample.html
    · ScriptFormSubmitValidatorExample.html

    Java


    Java Nedir?
    Java sun şirketinin 1995 yılında yarattığı bir dildir. Java c++ gibi "nesne yönelim"lidir. Güvenlidir. Bir java kodu bir kere derlendikten sonra her platformda çalışır. "bir kere derle her yerde çalıştır" javanın sloganıdır.
    Java'nın popüler olmasında applet'lerin etkisi vardır. Appletler web sayfalarına gömülen java programcıklarıdır. Javanın platformdan bağımsızlığı sayesinde appletler tüm platformlarda yeniden derlenmeye gerek olmaksızın çalışmaktadır. Ancak javayı sadece appletler için kullanılan basit bir dil olduğunu düşünmek çok yanlıştır. Java ile diğer programlama dilleri ile yapabileceğin her programı yapabilirsiniz. Hatta javada yapabileceğiniz bazı programları diğer dillerle yapmanız ya imkansızdır ya da çok zordur.
    Java platformdan bağımsız olması nedeniyle diğer dillerden yavaştır. Ancak bu fark giderek azalmaktadır. Yine bilgisayarların hızlarının artması bu yavaşlığı önemsiz hale getirmektedir. Javanın yavaşlığına rağmen bir çok avantajı bulunmaktadır. Bu avantajlar o kadar büyüktür ki bir çok şirket javaya geçmektedir ve geçecektir.
    Javayı öğrenmek için ilk yapılması gereken nesne yönelimli programlamanın öğrenilmesidir. Nesne yönelimli programlamanın anlaşılması bazı insanlara zor gelmektedir. Ancak nesne yönelimli programlamayı kavramış bir insan başka bir programlama yöntemini kullanmaz. Bir çok nesne yönelimli olmayan dile kendisinde bulunmayan nesne yönelimli özellikler eklenmektedir. Ancak bu hep yapay olmaktadır. C++ bile c'nin nesne yönelimli olmayan kötü özelliklerini taşımaktadır. Java ise nesne yönelimli programlamaya uygun olmayan hiç bir özelliği barındırmaz.
    Nesne yönelimli programlamayı kavradıysanız çeşitli konularda geliştirilmiş api'leri (kütüphaneler) öğrenmelisiniz. Java ortamı standart bir kütüphane ile gelir. Bu kütüphanelerde çok sayıda sınıf (class) bulunmaktadır. Javada belirli konulardaki sınıflar paketlerde toplanırlar. Örneğin window sistemleri için (pencere,düğme,menü,toolbar vs..) java.awt veya javax.swing paketi bulunmaktadır. Dosya işlemleri için java.io paketi, network ile ilgili işlemler için java.net paketi, appletler için java.applet paketi ve bunlar gibi bir çok paket içermektedir. Tabiki bu paketlerdeki sınıfların ezbere bilinmesi gerekmez. Önemli olan bu paketleri istenildiği zaman doğru kullanabilmektir. Doğru kullanabilmeniz için de nesne tabanlı programlamayı bilmeniz gerekir.
    Nesne tabanlı programlama hazır nesne kütüphanesini kullanarak program geliştirmektir. Nesne yönelimli programlama ise buna ek olarak kendinize yeni sınıflar yaratabileceğiniz bir programlamadır. Bugün bir çok dil nesne tabanlıdır. Ancak çok az dil nesne yönelimlidir.
    Değişkenler
    Javada her değişkenin tipi belli olmalıdır. En basit tipler int,double,char,byte gibi basit tiplerdir. Bununla birlikte bir değişken sınıf değişkeni olabilir. Aşağıdaki örneklerde bazı değişkenler tanımlanmıştır.
    int number1; //deklare etmek
    int num=2; //hem deklare ediyor hem de atıyoruz
    double n //deklare etmek
    n=2.0; //atama
    String name="ali"; //sınıf değişkeni, name String tipindedir.
    Frame f; //sınıf değişkeni, f Frame tipindedir.

    Fonksiyon
    Bir fonsiyon belirli bir işlem gerçekleştirmek için yapılmış kod parçasıdır. Bir fonksiyon çağrıldığında o fonsiyon içindeki kod yürütülür. Fonksiyon bittikten sonra program akışına kaldığı yerden devam eder. Bir fonksiyon parametre alabilir veya almayabilir. Geri bir değer döndürebilir veya döndürmeyebilir. Dikkat edilmesi gereken bir fonksiyon yaratıldığı zaman aldığı parametrelerin ve geri döndürdüğü değerin tipinin belirlenmiş olmasıdır. Aşağıda çeşitli fonksiyonlar yaratılmakta ve kullanılmaktadır.
    int n1=1;
    int n2=3;
    int sum;
    void setSum(){
    sum=n1+n2; //parametre yok;geri döndürme yok;
    }
    int getSum(){
    return n1+n2; //parametre yok, geriye n1 ile n2'in toplamı döndürülüyor
    }
    int getSum(int num1,int num2){
    return num1+num2; //num1 ve num2 parametre olarak veriliyor; geriye num1 ile num2'in toplamı döndürülüyor.
    }

    Sınıf(Class)-Nesne(Object)
    Bir sınıf kendisine ait değişkenleri ve fonksiyonları olan bir kod birimidir. Sınıfın sahip olduğu fonsiyonlara method denir. Örneğin bir insan için göz rengi bir değişkendir. Yürümek ise bir metot. Yine insanın adı değişken ve düşünmek bir metottur. Aşağıda bir insan sınıf yaratılıyor. Bu sınıf bir name değişkeni ve run metodu içermektedir.
    public class Person{
    public String name;
    public void run(){
    ......//bir şeyler yapıyor
    }
    }

    Yukarıdaki Person sınıfı istenildiği kadar değişik değişken ve metodu barındırabilir. Şimdi bu sınıfın bir nesnesini yaratalım. İnsan sınıfı tüm insanların ortak özelliklerini içerir. Ancak geçek hayatta ahmet,mehmet,victor vs.. gibi nesneler bulunmaktadır. Biz de adı olan bir nesne yaratmak istiyoruz. Bir nesne şu şekilde yaratılır.
    Person my=new Person();

    my bir yaşayan nesne oldu. Ancak henüz bir ismi yok. Aşağıda my'a bir isim veriyoruz ve ondan çalışmasını istiyoruz.
    Person my=new Person();
    my.name="ali";
    my.run();

    Görüldüğü gibi bir nesne değikenlerine veya metotlarına erişmek için nokta kullanılmaktadır. "my.name" my nesnesinin name değişkeni anlamıdadır. "my.run()" ise my değişkenin run metodunu çağır anlamına gelir. Eğer bir nesne yaratıldığı sırada bazı değişkenlere ihtiyacın varsa "kurucu" kullanılmalıdır. Örneğin isimsiz bir kişi olamaz. O halde yeni bir Person yaratıldığında ismini de almak istiyorsan aşağıdaki gibi kurucu eklenmelidir.
    public class Person{
    public String name;
    public Person(String n){
    name=n;
    }
    public void run(){
    ......//bir şeyler yapıyor
    }
    }

    Kurucu String n ile bir String almaktadır. Bu sınıfın nesnesini yaratmak istenildiği zaman bu kurucu kullanılacaktır. Ve böylece isim kesinlikte alınmış olur.
    Person my=new Person("ali");
    my.run();

    Kurucu ile sınıf ismi aynı olmalıdır. Kurucu fonksiyon değildir. Dikkat edilirse geriye değer döndürüp döndürmeyeceği verilmemiştir. Kurucuda buna gerek yoktur. ancak kurucu fonksiyonlar gibi parametre alır.
    Miras Alma
    Canlı sınıfını düşünelim. canlı sınıfında doğum tarihi bir değişkendir. Üremek veya ölmek fonksiyondur. Bunlar tüm canlılarda ortaktır. canlılar içinde sadece insan düşünür. İnsan sınıfının düşünmek metodu diğer canlılarda yoktur. İnsan sınıfı canlıdan türemiştir. Canlı sınıfının tüm özelliğini alır ve buna düşünme özelliğini ekler. Aşağıda bir canlı sınıfı yaratıyoruz. Daha sonra insan sıfını canlı sınıfından türetiyor ve düşün fonksiyonunu ekliyoruz.
    public class Living{
    public String name;
    public void die(){
    ......
    }
    }
    public class Human extends Living{
    public void think(){
    ......
    }
    }

    Önce Living(Canlı) sınıfını yarattık. Living sınıfının name değişkeni ve die(öl) metodu bulunmaktadır. Human(insanoğlu) Living sınıfından türediği için (Human extends Living ile bu işlem gerçekleşir) think(düşün) metoduna ek olarak name değişkeni ve die metoduna sahiptir. Aşağıda hem Living hem de Human yaratıyoruz.
    Living l=new Living();
    l.name="test";
    l.die();
    Human human=new Human();
    human.name="ali";
    human.think();
    human.die();

    Static Nedir?
    Yukarıdaki örneklerde bir sınıfın değişkenini veya metodunu kullanmak için nesne yaratmak zorunda kalıyoruz. Nesne yaratmadan bir sınıfın değişkeninin veya metodunun kullanılması için o değişkenin ve metodun static olması gerekir. Aşağıda Living sınıfının run metodu static yapılıyor. static olduğu için de bir Living nesnesi yaratılmadan kullanılabiliyor.
    public class Living(){
    public static void run(){ //static metot
    ...
    }
    }
    ...
    Living.run(); //static metot çağrılıyor. görüldüğü gibi nesne yaratılmıyor.

    Eğer bir sınıfın değişkeni veya metodu static ise SınıfAdı.değişkenAdı veya SınıfAdı.metotAdı() şeklinde kullanılabilir.


    İnterface(Arabirim)
    İnterface sınıflar gibi temel bir kod birimidir. İnterface'te sadece değişkenler ve boş metotlar bulunur. İnterface'ler sınıflar arasında bir çeşit anlaşma gibi kullanılabilirler. İnterface'si implement eden bir sınıf o interface'teki tüm metodların içlerini doldurmak zorundadır. Örneğin Flyable interface'si olsun. Eagle(Kartal) sınıfı bu interface'si implement eder. Flyable interface'inde sadece fly() metodu bulunmaktadır. Eagle sınıfı bu interface'i implement ettiği için fly(uçmak) metodunu doldurur.
    public interface Flyable(){
    public void fly();
    }
    public class Eagle implements Flyable{
    public void fly(){
    ......//burada bir şeyler yap
    }
    }

    implements Flyable ile Eagle sınıfı Flyable sınıfını implement eder ve fly() metodunun içini doldurur. Böylece Eagle bir Flyable olur. Örneğin başka bir sınıf fly metodu olan tüm nesneler için bir işlem gerçekleştirsin. Örneğin fly yeteneği olan tüm nesneleri öldürmek(die) istesin. Bu die metodu parametre olarak Flyable alır.
    ...
    public void die(Flyable f){
    //f'yi öldür.
    }
    ...
    Eagle e=new Eagle(); //kartal
    Hawk h=new Hawk(); //şahin
    die(e);
    die(h);

    Eğer die metodunu sadece die(Eagle e) şeklinde yapsaydık sadece kartalı öldürebilirdik. şahini öldüremezdik. Ancak şimdi hem kartal hem de şahin Flyable interface'ni implement ettiği için ikisini de öldürebiliriz. Ancak tavukları öldüremeyiz. Çünkü onlar uçamaz. Yani Flyable interface'ni implement etmemişlerdir.
    Şuna dikkat edilmelidir. Eğer bir interface implement edilmişse interface'in tüm metotları doldurulmalıdır. İnterface'lerin nesnesi yaratılamaz. Doğal olarak kurucuları yoktur. İnterface'ler parametre olarak kullanılabilir. Yukarıdaki die metodu bir interface'si parametre olarak almaktadır.
    Abstract(Soyut) Sınıf,Metot
    Flyable interface'si public void fly(); şeklinde bir metot içermektedir. Görüldüğü gibi {} şekilde metodun içi(metodun gövdesi) verilmemiştir. Bu tür fonksiyonlara soyut(abstract) fonksiyon denir. Örneğin kuş sınıfını düşünelim. Tüm kuşlar uçarlar. Ancak her kuş değişik bir şekilde uçar. Bu yüzden kuş sınıfında uçma özelliği soyut bırakılmalıdır. Kuş sınıfından türeyen yeni sınıf (örneğin kartal,şahin) uçma özelliğini doldurur. Aşağıda soyut kuş(Bird) sınıfı yaratılıyor ve bu sınıftan kartal(Eagle) ve şahin(Hawk) türüyor.
    public abstract class Bird(){
    abstract void fly(); //soyut metot.
    public void die(){
    ...
    }
    ...
    }
    public class Eagle extends Bird{
    public void fly(){
    ....//soyut metot dolduruluyor
    }
    }
    public class Hawk extends Bird{
    public void fly(){
    ....//soyut metot dolduruluyor
    }
    }

    Bir metodun veya Bir sınıfın soyut olduğunu belirtmek için başına abstract kelimesi eklenir. Bird sınıfı da fly metudu soyut olduğu için soyuttur. Soyut sınıfların nesnesi yaratılamaz. Ancak soyut sınıfların kurucuları olabilir. Eğer bir sınıf soyutsa o sınıftan yeni bir sınıf türetilip soyut metotların içi doldurulmalıdır.












  4. #4
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Lightbulb

    Paket Kullanımı

    Javada kullanılmak için çok sayıda sınıflar hazırlanmıştır. Bu sınıflar işlevlerine göre gruplandırılmış ve belirli paketlere konulmuştur. Örneğin pencere, menu, düğme, toolbar, kaydırma çubuğu gibi görsel bileşenleri için kullanılan sınıflar java.awt ve javax.swing paketindedir. Java standart olarak belirli paketlerle birlikte gelmektedir. Bu paketler tüm java ortamlarında vardır. Bir sınıfı kullanmak istiyorsanız o sınıfı import(çağırmak) etmeniz gerekir. örneğin Frame sınıfı java.awt paketindedir.
    import java.awt.Frame;
    public class Test(){
    Frame f=new Frame();
    }

    Frame sınıfı kullanılmaktadır. import java.awt.Frame ile Frame sınıfı çağırılmıştır. Awt paketindeki başka sınıflarıda kullanmak istiyorsanız hepsini import etmeniz gerekir. Ancak hepsini ayrı ayrı import etmek yerine import java.awt.* demeniz yeterlidir. * tüm sınıflar (ve interface'ler) anlamına gelmektedir.
    import java.awt.*;
    public class Test(){
    Frame f=new Frame();
    Button b=new Button();
    }

    Kendi yaptığınız sınıflar içinde paketler yaratabilirsiniz. Örneğin Bird sınıfı için animal.bird paketi yaratabilirsiniz.
    package animal.bird;
    public class Bird{
    ...
    }

    Görüldüğü gibi package ile paketin yeri verilir. Bird sınıfı animal paketinin içindeki bird paketine koyulur. Örneğin Cat sınıfı için
    package animal.cat;
    public class Cat{
    ...
    }

    şeklinde bir paket yaratılabilir.

    Uygulamalar ve Projeler


    Web Book (Style Sheet)

    Tree (javascript)

    Form Validator (javascript)

    Web Book Projesi

    Web Book Projesi Nedir?
    Bu projenin amacı webte yayınlanacak yazılar için bir araçlar bütünü sağlamaktır. Şimdilik sadece stil kullanılmıştır. Daha sonra javascript eklenecektir.
    Bir kitap başlıklardan, paragraflardan, tablolardan, listelerden ve resimlerden oluşur. Html'de h1'den h6'ya kadar 6 başlık vardır. Paragraf için sadece p etiketi vardır. Başlıklar uygun şekilde biçimlendirilebilir. Paragraf içinse css'de kullanılan classlar yapmak gerekir. Örneğin tip paragrafı,uyarı paragrafı.
    Projede iki css dosyası bulunmaktadır. DefaultBook.css ve Book.css dosyası. DefaultBook.css dosyasında etiketlerin kendileri en basit kitap yazmak için gerekli olacak şekilde biçimlendirilmişlerdir. Böylece DefaultBook.css dosyasını link etiketiyle sayfaya bağlayınca p,h1....h6,body,img,table gibi etiketlerin biçimi en basit yazı biçimleri haline gelmiş olur. Book.css dosyasında ise her yazıda kullanılabilecek stiller eklenecektir. Örneğin uyarı paragrafı, tip paragrafı, kod biçimleri gibi. Aşağıda her iki dosyanın içeriği görüntülenmektedir.
    Default.css dosyasının içeriği
    Default.css Indir Göster Gizle Kopar Satır Gizle Satır Göster
    body,body *{
    margin-left:3%;
    margin-right:3%;
    font-size:12pt;
    font-family:times;
    background:white;
    color:black;
    }
    h1,h2,h3{
    text-align:center;
    }
    h4,h5,h6,p{
    margin-left:2%;
    }
    h1{
    font-size:18pt;
    }
    h2{
    font-size:16pt;
    }
    h3{
    font-size:14pt;
    }
    h4{
    font-size:13pt;
    }
    h5{
    font-size:12pt;
    }
    h6{
    font-size:11pt;
    }
    p{
    text-indent:3%;
    margin-top:0.3%;
    margin-bottom:0.3%;
    }
    img,table,ol,ul{
    margin-left:2%;
    margin-right:2%;
    }
    a{
    color:blue;
    text-decoration:none;
    }
    a:hover{
    color:red;
    }
    Book.css dosyasının içeriği
    Book.css Indir Göster Gizle Kopar Satır Gizle Satır Göster
    .warning,.tip{
    font-style:italic;
    margin-left:6%;
    margin-right:6%;
    margin-top:3%;
    margin-bottom:3%;
    }
    .warning{
    color:red;
    }
    .tip{
    color:green;
    }
    .code{
    font-family:courier;
    margin-left:4%;
    margin-right:4%;
    }
    Kullanım
    Bu stilleri kullanmak için yapmanız gereken iki css doyasını link etmektir. Bu link etiketi ile yapılır ve bu etiket head etiketinin içine eklenir.Aşağıda görülüyor
    WebBookUse.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <link href="DefaultBook.css" type="text/css" rel="stylesheet"></link>
    4 <link href="Book.css" type="text/css" rel="stylesheet"></link>
    5 </head>
    6 <body>
    7 stiller kullanılabilir
    8 </body>
    9 </html>

    Tasarım
    Her kitabın bir stili olduğunu bilirsiniz. Örneğin bir matematik kitabında başlıklar siyah, paragraflar ciddidir. Ama bir mizah kitabında biçim daha değişiktir. Ancak genellikle bir tutarlılık vardır. Bir kitapta genellikle büyük başlıklar aynı şekilde, normal paragraflar aynı şekilde devam eder. Demek ki hepsinin stili kitap boyunca devam eder. Bu stil kitap yazdıktan sonra çok kolay bir şekilde nasıl değiştirilebilir. Yani bir satır değiştiriyorsun tüm kitabın stili değişiyor. Örneğin ciddi bir stildeyken son derece renkli bir biçime bürünüyor. Bunu yapmak çok kolaydır. DefaultBook.css ve Book.css dosyalarında ya etiketin adı var yada class var. sayfalara bu dosyaları link edersen kitabın stili bu dosyaların stili olur. Diyelim sen bu iki dosyanın stilini beğenmedin. Sen kendine bir css dosyası hazırlarsın MyBook.css adında. Burada p, h1, h2...h6, .warning, .tip vs.. classlarını istediğin gibi hazırlarsın. Eğer link olarak kendi dosyanı verirsen sayfanın stili tamamen senin istediğin stilde olur. Dikkat edilirse tek bir satırdaki src="DefaultBook.css" yerine src="MyBook.css" yazmak yeterli olacaktır.
    Özetlersek. 1-Bir sayfa üzerindeki her nesnenin bir biçimini ayrı bir dosyadan konrol edeceksin. Html'in içinde hiçbir zaman biçimlendirme yapmayacaksın. 2-Bütün etiketlerin biçiminin bulunduğu bir .css dosyası yaparsın(bu projede DefaultBook.css). Buna tema diyebiliriz. 3-Aynı etiketle kullanılan ancak farklı biçimde olması gereken konular için class'ların olduğu bir dosya hazırlarsın. Örneğin normal paragraf ile uyarı paragrafı aynı p etiketiyle kullanılır. Bu projede normal paragraf için p etiketini kullandık. Uyarı paragrafı için ise .warning adlı bir class hazırladık.
    Sonuç olarak tüm sitenin stiline tema deriz ve bunlar ayrı css dosyalarında durur. Yeni bir tema yapmak için css dosyası yaratılır ve etiket ve class stilleri ayarlanır. Bböylece az bir zahmetle tüm site değişir.
    Bir Akıl Yürütme
    Bir portal'nız var. 50 tane sayfanız var. sayfalarınız hepsi rengarenk. Deprem olduğu gün tüm sitenizi siyah ve gri tonlara büründürebilir misiniz? Bu matem temasıdır. matem.css dosyası hazırlar ve tüm sayfaları bu dosyaya bağlarsanız tüm site matem havasına bürünür. Bu kadar basit
    Bir Sorun
    Ben daha önceki temanın bazı stillerini kullanmak istiyorum derseniz ne olacak. Söylediğime göre eski.css dosyası kaldırılacak ve yeni.css dosyası kullanılacak. bir çözüm eski dosyadaki kullanmak istediğin stilleri yeni dosyaya kopyalamaktır. Ancak daha güzel bir çözümü var. Eski stillerin dosyası Old.css yeni stillerin dosyası New.css olsun. Sen Old.css dosyasındaki 6 stili kullanmak 18 stili değiştirmek istiyorsun. Şunu yapacaksın. New.css dosyasında değiştimek istediğin stilleri koyacaksın. Ve her iki dosyayı da link yapacaksın. Ancak link ederken New.css dosyasını sonra link edeceksin. Aşağıda görülüyor. şimdi eski css p için kırmızı diyor. Senin yeni css ise mavi diyor. Sen yeni css'ni en son yazdığın için senin dediğin geçerli olur.
    WebBookCascading.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <link href="Old.css" type="text/css" rel="stylesheet"></link>
    4 <link href="New.css" type="text/css" rel="stylesheet"></link>
    5 </head>
    6 <body>
    7 önce New.css'nin değdiği olur. sonra Old.css uygulanır
    8 </body>
    9 </html>

    Bu sonuç çok güzel bir kullanıma yol açar. Örneğin Ciddi.css dosyanız olsun. Bu ciddi bir tema. Siz yine ciddi ancak paragraf yazılarının times değil arial olmasını istiyorsunuz. Bunun için bir ArialCiddi.css dosyası hazırlayıp sadece p{font-family:arial;} yazmanız yeterli olacak. p'nin diğer özellikleride eski dosyadan alınacak. Böylece istediğiniz kadar tema hazırlayabilirsiniz. Bütün herşeyi baştan yazmanız gerekmiyor.
    Dosya Listesi
    · Default.css
    · Book.css
    · WebBookUse.html
    · WebBookCascading.html

    Javascript ile Tree (Internet Explorer İçin)

    Projenin Amacı
    Bu bir proje sayılmaz. Basit bir tree'dir. Sol bölmede bir menü bulunur. Bu menüdeki linkler tıklanırsa sağ bölmede içerik görüntülenir. Sağ bölmedeki frame'in adı vcontent'tir ve base attribute'si ile set edilmiştir. Böylece tüm linkler content frame'inde açılacaklar. Linkler birbirinin içindedir. En soldaki resim tıklanırsa tree açılır veya kapanır.
    Bu tree yanlız internet explorer'de çalışır. Style ile javascript birarada kullanılmıştır. Her grup bir div etiketinin içindedir. div etiketinin display özelliği none ise div etiketinin içindekiler gözükmez. Display özelliği block yapılırsa gözükür. Tüm tree buna dayanır.
    TreeProjeTree.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <base target="content"></base>
    4 <!-- tree maddeleri tıklandığında açılacak sayfalar content frame'inde gösterilecek.-->
    5 <script language="javaScript">
    6 var plusUrl="plus.gif";
    7 var minusUrl="minus.gif";
    8 function refresh(objId){
    9 obj=getObject(objId);
    10 if(isDisplay(obj)){
    11 hide(obj,objId);
    12 }else{
    13 view(obj,objId);
    14 }
    15 }
    16 function view(obj,objId){
    17 obj.style.display="block";
    18 document.images[objId+"Img"].src=plusUrl;
    19 }
    20 function hide(obj,objId){
    21 obj.style.display="none";
    22 document.images[objId+"Img"].src=minusUrl;
    23 }
    24 function isDisplay(obj){
    25 return obj.style.display=="block";
    26 }
    27 function getObject(objectId){
    28 return eval("document.all."+objectId);
    29 }
    30 </script>
    31 <style>
    32 body{
    33 margin-left:3%;
    34 background:white;
    35 }
    36 div{
    37 margin-left:9%;
    38 }
    39 </style>
    40 </head>
    41 <body>
    42 <h2>Tree</h2>
    43 <img name="computerImg" src="plus.gif" onClick="refresh('computer')"></img>
    44 <a href="computer.html">Bilgisayar</a><br>
    45 <div id="computer" style="display:none">
    46 <img name="javaImg" src="plus.gif" onClick="refresh('java')"></img>
    47 <a href="java.html">java</a><br>
    48 <div id="java" style="display:none">
    49 <a href="swing.html">swing</a><br>
    50 <a href="io.html">io</a><br>
    51 </div>
    52 <a href="html.html">html</a><br>
    53 <a href="css.html">css (Cascading Style Sheet)</a><br>
    54 </div>
    55 <img name="historyImg" src="plus.gif" onClick="refresh('history')"></img>
    56 <a href="history.html">Tarih</a><br>
    57 <div id="history" style="display:none">
    58 <a href="ottoman.html">Osmanlı</a><br>
    59 <a href="mongol.html">Moğollar</a><br>
    60 </div>
    61 </body>
    62 </html>

    Dosya Listesi
    · TreeProjeTree.html

    Form Validator

    Form Nedir?
    Web sayfalarında kullanıcıdan bilgi almak için konulan yazı alanı, seçenek kutusu, onay kutusu, düğme vs.. bileşenlerden oluşan gruba form denir. Form'daki bilgiler kullanıcı tamam deyince bilgilerin değerlendirilip cevap verileceği servera gönderilir. Bilgilere göre server yeni bir web sayfası oluşturur ve geri gönderir. Kullanıcı form bilgilerini gönderme işini submit düğmesine tıklayarak yapar. Submit düğmesine basıldığında browser formun action özelliğindeki cgi programına (servardaki verileri değerlendirecek program) verileri gönderir. Eğer gönderilmeden önce javascriptte işlemler yapmak istiyorsanız formun onSubmit özelliğini yakalamanız gerekir. Aşağıdaki örnekte form submit edilince(verilerin karşı tarafa gönderilme işlemi başladığında) javascript ile devreye giriyoruz ve bilgilerin gönderilip gönderilmeyeceğine karar veriyoruz. Eğer tel alanı bossa result false oluyor.
    ValidatorProjeFormExample.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script>
    4 function check(){
    5 result=true//tel alanının boş olup olmadığını kontrol edildi ve sonuc geldi;
    6 if(result){
    7 return true;
    8 }else{
    9 return false;
    10 }
    11 }
    12 </script>
    13 </head>
    14 <body>
    15 <form action="test.jsp" onSubmit="return check()">
    16 <input type="text" size="12" name="tel">
    17 <input type="submit" value=" OK ">
    18 </form>
    19 </body>
    20 </html>

    onSubmit ile submit olayını yakaladık ve check fonksiyonunu çağırdık. Telefon alanına girilip girilmediğini anladık. Eğer girilmişse result true olur ve true döndürülür ve form verisi gönderilir. Aksi takdirde form verisi gönderilmez
    form validator sistemi
    Bu projenin temeli AbstractFormValidator nesnesidir. AbstractFormValidator nesnesi bu proje için yapılmıştır. Bu nesneye parametre olarak bir form,control edilecek form elementlerinin adları,ve kontrol ederken çağıracağı fonksiyon verilir. Parametreler verildikten sonra bu nesnenin validate metodu çağrılır. Eğer form yanlış doldurulmuşsa alert ile mesaj basılır ve false döndürülür. Eğer doğru doldurulmuşsa true döndürülür.
    AbstractFormValidator en başta kontrol edilecek olan form nesnesini ister. AbstractFormValidator sadece parametre olarak verilen element isimlerini kontrol eder. Böylece yanlızca istediğiniz elementleri kontrol edersiniz. Son olarak bir fonksiyonun adı alınır. AbstractFormValidator elementleri nasıl kontrol ettiğinizi bilmez. Her element için verilen fonksiyonu çağırır. O fonksiyondan hata mesajı gelirse mesajı saklar. Eğer gelen true ise diğer elemente geçer. Bu nesnenin abstract(soyut) olmasının sebebi budur. Kontrol için sizin fonksiyonunuzu kullanır. AbstractFormValidator kodu aşağıda görülmektedir.
    AbstractFormValidator.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    function AbstractFormValidator(aForm,controlElements,functionName){
    this.theForm=aForm;
    this.controlElements=controlElements;
    this.functionName=functionName;
    this.validate=validate;
    }
    function validate(){
    message="";
    valid=true;
    formManager=new FormManager(this.theForm);
    if(this.controlElements=="ALL"){
    this.controlElements=formManager.getElementNames();
    }
    for(var i=0;i<this.controlElements.length;i++){
    if(formManager.hasElement(this.controlElements[i])){
    theElements=formManager.getElements(this.controlElements[i]);
    theFunctionName=this.functionName;
    result=eval(theFunctionName+"(theElements)");
    if(result!=true){
    message=message+result+"\n";
    valid=false;
    }
    }else{
    message=getNotFoundElementMessages(this.controlElements[i]);
    valid=false;
    }
    }
    if(!valid){
    alert(message);
    }
    return valid;
    }
    Burada FormManager nesnesi kullanılmaktadır. Bu nesne bir form alır ve formla ilgi çok sayıda işlem yapabilir. Bu projeyle doğrudan bir ilişkisi yoktur. Bu nesne her zaman kullanılabilir. FormManager nesnesinin kodunu sayfanın en aşağısında bulabilirsiniz. Burada FormManager'ın hasElement,getElements,getElementNames metodları kullanılmaktadır. hasElement verilen isimde elementin olup olmadığını gönderir. getElements verilen isimdeki elementlerin dizisini gönderir (aynı isimde birden fazla element olabilir ve bu normaldir). getElementNames ise bir formdaki kullanılan tüm element isimlerini gönderir. Eğer tüm elementleri kontrol etmek istiyorsanız control dizisi yerine "ALL" girmelisiniz. getNotFoundElementMessages metodu ise Form.js dosyasındadır. Bu fonksiyon bir element bulunamayınca gösterilecek mesajı verir.
    Bir form validator yapmak için AbstractFormValidator'e bir fonksiyon vermek gerekir. aşağıdaki Örnekte kendimiz bir fonksiyon yaratıyor ve AbstractFormValidator'a veriyoruz.
    SimpleAbstractValidatorTest.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script src="..\..\Form.js" language="javascript"></script>
    4 <script src="..\Messages.js" language="javascript"></script>
    5 <script src="AbstractFormValidator.js" language="javascript"></script>
    6 <script src="SimpleValidator.js" language="javascript"></script>
    7 <script>
    8 function checkForm(aForm){
    9 elementArray=new Array("passwordName","composerName");
    10 validator=new AbstractFormValidator(aForm,elementArray,"simpleVa lidElement");
    11 if(validator.validate()){
    12 alert("form has been sended");
    13 return false;
    14 }else{
    15 return false;
    16 }
    17 }
    18 </script>
    19 </head>
    20 <body>
    21 <p>Bu sayfa SimpleValidator.js ve AbstractFormValidator.js dosyalarının tesi içindir. aşağıda ki form'da password ve besteci seçenek kutusu kontrol edilecek diğerleri edilmeyecektir.</p>
    22 <form action="mailto:tekzaf@yahoo.com" onSubmit="return checkForm(this)">
    23 <table>
    24 <tr><td>PasswordControl Edilecek)<td><input type="password" name="passwordName" size="12">
    25 <tr><td>TelControl edilmeyecek)<td><input type="text" name="tel" size="12">
    26 </table>
    27 bestecilerden birini seçmelisiniz:<br>
    28 <input type="radio" name="composerName" value="ertas">Neset Ertas<br>
    29 <input type="radio" name="composerName" value="muren">Zeki Muren<br>
    30 <input type="radio" name="composerNamer" value="tayfur">Ferdi Tayfur<br><br>
    31 şarkılardan seçmesenizde olur.<br>
    32 <input type="checkbox" name="song" value="kendim">Kendim ettim kendim buldum<br>
    33 <input type="checkbox" name="song" value="batsin">Batsin bu dunya<br>
    34 <input type="checkbox" name="song" value="birdemet">Bir demet yasemen<br><br>
    35 <input type="submit" value=" OK ">
    36 </form>
    37 </body>
    38 </html>

    Örnekte form submit edildiğinde checkForm fonksiyonu çağrılmıştır. Orada control edilmek istenen elementlerin isimlerinin dizisi yaratılmıştır. Sonra AbstractFormValidator nesnesi yaratılmıştır. simpleValid AbstractFormValidator'ün her isme karşılık çağıracağı fonksiyondur. Bu fonksiyon SimpleValidator.js dosyasındadır (Kod aşağıda görülüyor). Bu yüzden bu dosya link edilmiştir. Ve daha sonra validatorun validate methodu çağrılıyor ve ondan gelen sonuca göre submit işlemi gerçekleşiyor (veya gerçekleşmiyor). AbstractFormValidator Form.js dosyasındaki kodları kullandığı için Form.js dosyası AbstractFormValidator.js dosyasından önce eklenmelidir. Çünkü AbstractFormValidator.js dosyası onları kullanmaktadır.
    AbstractFormValidator sadece istediğiniz element isimleri için sizin fonksiyonunuzu çağırmaktadır. Sadece fonksiyonu değiştirerek çok değişik validatorler yapabilirsiniz. Her yeni validator yaptığınızda form elemanlarını alma, döngü açma, aynı isimdeki elementleri bulmak gibi yüklerle uğraşmazsınınız.
    SimpleValidator.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    //import Form.js,Messages.js
    function simpleValidElement(checkedElements){
    if(isTextElementOf(checkedElements[0])){
    if(hasElementValue(checkedElements[0])){
    return true;
    }else{
    return getEmptyElementMessages(checkedElements[0].name);
    }
    }else if(checkedElements[0].type=="radio"||checkedElements[0].type=="checkbox"){
    theChecked=isChecked(checkedElements);
    if(theChecked){
    return theChecked;
    }else if(theChecked==false){
    return getNotCheckedElementMessages(theElements[0].name);
    }
    }else{
    return true;
    }
    }
    Kodtaki isTextElementOf,hasElementValue,isChecked fonksiyonları Form.js dosyasında bulunmaktadır. getEmptyElementMessages, getNotCheckedElementMessages fonksiyonlarıda Messages.js dosyasındadır. Message.js ile bir element için istediğiniz hata mesajını verebilirsiniz. Messages.js dosyasının kodu aşağıdadır. Bu dosya istenildiği gibi değiştirileblir veya yeni Messages.js yaratılabilir. Tek yapılması gereken bu dosyayı sayfaya link yapmaktır.
    Messages.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    function getEmptyElementMessages(elementName){
    return getLabel(elementName)+" is empty";
    }
    function getNotCheckedElementMessages(elementName){
    return getLabel(elementName)+" don't be checked";
    }
    function getLabel(key){
    return key;
    }
    TypeValidatorModel
    Yaptığımız örneklerde her element için tek bir fonksiyon çağırılmaktadır. Ve o fonksiyonu yapan kişi elementin adını ve tipini öğrenir ve ona göre kontrol yaptıktan sonra sonucu geri gönderir. SimpleValidator.js'de simpleValidElement fonksiyonu bir elementi alıyor ve onu tipine göre kontrol ediyor. Eğer text elementse ayrı, seçenek kutusu ve onay kutusu için ayrı kontrol yapmaktadır. Biz bunun yerine her tip için bir fonkisyon çağırsak işi daha basitleştirmiş oluruz. Böylece validatoru yazan kişi sadece her tip için nasıl kontrol edileceğini verir. Böylece gelen elementin tipini anlamak işleminden kurtulunur. Aşağıda TypeValidatorModel.js dosyası görülmektedir. Bunu kullanmak için AbstractFormValidator'a typeValidElement fonksiyonunu vermelisiniz. Böylece AbstractFormValidator bu fonksiyonu çağırır. Bu fonksiyonda elementin tipini bulur ve o tipe uygun fonksiyonu çağırır. Bu fonksiyonu doldurmak sizin görevinizdir.
    TypeValidatorModel.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    function typeValidElement(checkedElements){
    elementType=checkedElements[0].type;
    if(elementType=="text"){
    return isValidTextElements(checkedElements);
    }else if(elementType=="password"){
    return isValidPasswordElements(checkedElements);
    }else if(elementType=="textarea"){
    return isValidTextareaElements(checkedElements);
    }else if(elementType=="file"){
    return isValidFileElements(checkedElements);
    }else if(elementType=="radio"){
    return isValidRadioElements(checkedElements);
    }else if(elementType=="checkbox"){
    return isValidCheckElements(checkedElements);
    }else if(elementType=="select"){
    return isValidSelectElements(checkedElements);
    }else if(elementType=="button"){
    return isValidButtonElements(checkedElements);
    }else if(elementType=="submit"){
    return isValidSubmitElements(checkedElements);
    }
    }
    Şimdi TypeValidatorModel'i kullanarak daha önceki örnekteki SimpleValidator'deki yaptıklarımızı yapalım. aşağıda SimpleTypeValidator.js dosyası görülmektedir.
    SimpleTypeValidator.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    //import Form.js,Messages.js
    function isValidTextElements(elements){
    return isValidText(elements);
    }
    function isValidPasswordElements(elements){
    return isValidText(elements);
    }
    function isValidTextareaElements(elements){
    return isValidText(elements);
    }
    function isValidFileElements(elements){
    return isValidText(elements);
    }
    function isValidRadioElements(elements){
    return isValidCheckedElement(elements);
    }
    function isValidCheckElements(elements){
    return isValidCheckedElement(elements);
    }
    function isValidSelectElements(elements){
    return true;
    }
    function isValidButtonElements(elements){
    return true;
    }
    function isValidSubmitElements(elements){
    return true;
    }
    function isValidText(elements){
    if(hasElementValue(elements[0])){
    return true;
    }else{
    return getEmptyElementMessages(theElements[0].name);
    }
    }
    function isValidCheckedElement(elements){
    theChecked=isChecked(elements);
    if(theChecked){
    return theChecked;
    }else if(theChecked==false){
    return getNotCheckedElementMessages(theElements[0].name);
    }
    }
    SimpleTypeValidator'de görüldüğü gibi TypeValidatorModel'de istenilen fonksiyonlar doldurulmuştur. Text alanları (text, password, textarea), seçenek ve onay kutuları kontrol edilmiş, diğerlerinde true gönderilmiştir (kontrol edilmemiştir). isValidText,isValidCheckedElement element yardımcı fonksiyonlardır.
    NameValidator
    Biz formumuzu elementlerin adlarına göre kontrol etmek isteyelim. yukarıdaki örnek elementin tipine göre senin bir fonksiyonunu çağırmaktadır. Elementin adına göre fonksiyon çağırması için ne yapmamız gerekir. Bir NameValidatorModel yapılmalıdır. Gelen elementin adı bulunur ve valid+(elementinAdı) adında bir fonksiyon çağırılır. Örneğin day adında bir elemente rastlandığında validday() fonksiyonu çağırılacaktır. Aşağıda NameValidatorModel.js görülmektedir.
    NameValidatorModel.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    function nameValidElement(checkedElements){
    elementName=checkedElements[0].name;
    return eval("valid"+elementName+"(checkedElements)");
    }
    Görüldüğü gelen elementin adı öğreniliyor ve validElementAdı fonksiyonu çağırılıyor. Şimdi uygulamasını yapalım
    NameValidatorTest.html Indir Göster Gizle Kopar Satır Gizle Satır Göster
    1 <html>
    2 <head>
    3 <script src="..\..\Form.js" language="javascript"></script>
    4 <script src="NameValidatorModel.js" language="javascript"></script>
    5 <script src="AbstractFormValidator.js" language="javascript"></script>
    6 <script>
    7 function checkForm(aForm){
    8 elementArray=new Array("passwordName");
    9 validator=new AbstractFormValidator(aForm,elementArray,"nameVali dElement");
    10 if(validator.validate()){
    11 alert("form bilgileri gönderildi");
    12 return false;
    13 }else{
    14 return false;
    15 }
    16 }
    17 function validpasswordName(elements){
    18 if(elements[0].value!=""){
    19 if(elements[0].value.length<5){
    20 return "lütfen 5 karakterden büyük şifre giriniz";
    21 }else{
    22 return true;
    23 }
    24 }else{
    25 return "lütfen şifrenizi giriniz";
    26 }
    27 }
    28 </script>
    29 </head>
    30 <body>
    31 <p> Bu sayfa NameValidator.js ve AbstractFormValidator.js dosyalarının testi içindir. aşağıdaki form'da şifrenin(password) doğru girilip girilmediği kontrol edilecektir.
    32 <form action="mailto:tekzaf@yahoo.com" onSubmit="return checkForm(this)">
    33 <table>
    34 <tr><td>PasswordControl Edilecek)<td><input type="password" name="passwordName" size="12">
    35 <tr><td>TelControl edilmeyecek)<td><input type="text" name="tel" size="12">
    36 </table>
    37 bestecilerden birini seçmelisiniz:<br>
    38 <input type="radio" name="composerName" value="ertas">Neset Ertas<br>
    39 <input type="radio" name="composerName" value="muren">Zeki Muren<br>
    40 <input type="radio" name="composerNamer" value="tayfur">Ferdi Tayfur<br><br>
    41 şarkılardan seçmesenizde olur.<br>
    42 <input type="checkbox" name="song" value="kendim">Kendim ettim kendim buldum<br>
    43 <input type="checkbox" name="song" value="batsin">Batsin bu dunya<br>
    44 <input type="checkbox" name="song" value="birdemet">Bir demet yasemen<br><br>
    45 <input type="submit" value=" OK ">
    46 </form>
    47 </body>
    48 </html>

    Burada sadece password alanı kontrol edilmektedir. NameValidatorModel kullanıldığı için validpasswordName methodu çağırılacaktır.
    Form.js dosyasının içeriği
    Form.js Indir Göster Gizle Kopar Satır Gizle Satır Göster
    function FormManager(aForm){
    this.theForm=aForm;
    this.getForm=getForm;
    this.getName=getName;
    this.getAction=getAction;
    this.getMethod=getMethod;
    this.getTarget=getTarget;
    this.submitForm=submitForm;

    this.setAction=setAction;
    this.submitTo=submitTo;

    this.getAllElements=getAllElements;
    this.getElements=getElements;
    this.getElementNames=getElementNames;
    this.getElementsOfType=getElementsOfType;
    this.getElementType=getElementType;
    this.getElementValue=getElementValue;

    this.getTextElements=getTextElements;
    this.getTextAreaElements=getTextAreaElements;
    this.getTextFieldElements=getTextFieldElements;
    this.getPasswordElements=getPasswordElements;
    this.getFileElements=getFileElements;
    this.getCheckBoxElements=getCheckBoxElements;
    this.getRadioBoxElements=getRadioBoxElements;
    this.getSelectElements=getSelectElements;
    this.getButtonElements=getButtonElements;
    this.getSubmitElements=getSubmitElements;

    this.getElementsNumber=getElementsNumber;
    this.getElementsNumberOfType=getElementsNumberOfType
    this.getTextElementsNumber=getTextElementsNumber

    this.hasElement=hasElement;
    this.hasElementValue=hasElementValue;
    this.isTypeOf=isTypeOf;
    this.isTextElement=isTextElement;
    this.isTextArea=isTextArea;
    this.isTextField=isTextField;
    this.isPassword=isPassword;
    this.isFile=isFile;
    this.isCheckBox=isCheckBox;
    this.isRadioBox=isRadioBox;
    this.isButton=isButton;
    this.isSubmit=isSubmit;

    this.display=display;
    }
    function getForm(){
    return this.theForm;
    }
    function getName(){
    return this.getForm().name;
    }
    function getAction(){
    return this.getForm().action;
    }
    function getMethod(){
    return this.getForm().method;
    }
    function getTarget(){
    return this.getForm().target;
    }
    function setAction(actionUrl){
    this.getForm().action=actionUrl;
    }
    function submitForm(){
    this.getForm().submit();
    }
    function submitTo(actionUrl){
    this.setAction(actionUrl);
    this.submitForm();
    }
    function getAllElements(){
    return this.getForm().elements;
    }
    function getElements(elementName){
    elementsArray=new Array(0);
    allElements=this.getAllElements();
    for(i=0;i<allElements.length;i++){
    if(allElements[i].name==elementName){
    elementsArray[elementsArray.length]=allElements[i];
    }
    }
    if(elementsArray.length==0){
    return null;
    }
    return elementsArray;
    }
    function getElementNames(){
    allElements=this.getAllElements();
    names=new Array(0);
    elementName="";
    for(i=0;i<allElements.length;i++){
    newElementName=allElements[i].name;
    if(elementName!=newElementName){
    names[names.length]=newElementName;
    elementName=newElementName;
    }
    }
    return names;
    }
    function getElementsOfType(elementType){
    elementsArray=new Array(0);
    allElements=this.getAllElements();
    for(i=0;i<allElements.length;i++){
    if(allElements[i].type==elementType){
    elementsArray[elementsArray.length]=allElements[i];
    }
    }
    if(elementsArray.length==0){
    return null;
    }
    return elementsArray;
    }
    function getElementType(elementName){
    theElements=this.getElements(elementName);
    return theElements[0].type;
    }
    function getElementValue(elementName){
    return this.getElements(elementName)[0].value;
    }
    function getTextElements(){
    elementsArray=new Array(0);
    allElements=this.getAllElements();
    for(i=0;i<allElements.length;i++){
    if(isTextElementOf(allElements[i])){
    elementsArray[elementsArray.length]=allElements[i];
    }
    }
    if(elementsArray.length==0){
    return null;
    }
    return elementsArray;
    }
    function getTextAreaElements(){
    return this.getElementsOfType("textarea");
    }
    function getTextFieldElements(){
    return this.getElementsOfType("text");
    }
    function getPasswordElements(){
    return this.getElementsOfType("password");
    }
    function getFileElements(){
    return this.getElementsOfType("file");
    }
    function getCheckBoxElements(){
    return this.getElementsOfType("checkbox");
    }
    function getRadioBoxElements(){
    return this.getElementsOfType("radiobox");
    }
    function getSelectElements(){
    return this.getElementsOfType("select");
    }
    function getButtonElements(){
    return this.getElementsOfType("button");
    }
    function getSubmitElements(){
    return this.getElementsOfType("submit");
    }
    function getElementsNumber(elementName){
    number=0;
    if(this.hasElement(elementName)){
    allElements=this.getAllElements();
    allLength=allElements.length;
    for(var i=0;i<allLength;i++){
    if(allElements[i].name==elementName){
    number=number+1;
    }
    }
    }
    return number;
    }
    function getElementsNumberOfType(elementType){
    number=0;
    if(isTrueType(elementType)==false){
    alert(getInvalidTypeMessages(elementType));
    }
    allElements=this.getAllElements();
    allLength=allElements.length;
    for(var i=0;i<allLength;i++){
    if(allElements[i].type==elementType){
    number=number+1;
    }
    }
    return number;
    }
    function getTextElementsNumber(){
    number=0;
    allElements=this.getAllElements();
    allLength=allElements.length;
    for(var i=0;i<allLength;i++){
    if(isTextElementOf(allElements[i])){
    number=number+1;
    }
    }
    return number;
    }
    function hasElement(elementName){
    if(eval("this.getForm()."+elementName)==null){
    return false;
    }else{
    return true;
    }
    }
    function hasElementValue(elementName){
    elementValue=this.getElementValue(elementName);
    return elementValue!=""&&elementValue!=null;
    }
    function isTypeOf(elementName,elementType){
    if(this.hasElement(elementName)){
    theElements=this.getElements(elementName);
    return theElements[0].type==elementType;
    }else{
    alert(getNotFoundElementMessages(elementName));
    }
    }
    function isTextElement(elementName){
    return isTextArea(elementName)||isTextField(elementName)||isPassword(elementName)||isFile(elementName);
    }
    function isTextArea(elementName){
    return isTypeOf(elementName,"textarea");
    }
    function isTextField(elementName){
    return isTypeOf(elementName,"text");
    }
    function isPassword(elementName){
    return isTypeOf(elementName,"password");
    }
    function isFile(elementName){
    return isTypeOf(elementName,"file");
    }
    function isCheckBox(elementName){
    return isTypeOf(elementName,"checkbox");
    }
    function isRadioBox(elementName){
    return isTypeOf(elementName,"radiobox");
    }
    function isButton(elementName){
    return isTypeOf(elementName,"button");
    }
    function isSubmit(elementName){
    return isTypeOf(elementName,"submit");
    }
    function display(){
    alert(this.getName());
    }

    //ElementManager

    function isTrueType(elementType){
    return true;
    }
    function getTypeOfElement(element){
    return element.type;
    }
    function isTextElementOf(aElement){
    elementType=aElement.type;
    if(elementType=="text"||elementType=="textarea"||elementType=="password"||elementType=="file"){
    return true;
    }else{
    return false;
    }
    }
    function hasElementValue(element){
    elementValue=element.value;
    if(elementValue==""||elementValue==null){
    return false;
    }else{
    return true;
    }
    }
    function isChecked(elements){
    theChecked=false;
    for(var j=0;j<elements.length;j++){
    if(elements[j].checked){
    theChecked=true;
    break;
    }
    }
    return theChecked;
    }
    function getCheckedRadioValue(elements){
    var theCheckedValue;
    for(var j=0;j<elements.length;j++){
    if(elements[j].checked){
    theCheckedValue=elements[j].value;
    break;
    }
    }
    return theCheckedValue;
    }
    // tool functions

    function submitFormData(aForm,actionUrl){
    manager=new FormManager(aForm);
    manager.submitTo(actionUrl);
    }

    //messages

    function getNotFoundElementMessages(elementName){
    return elementName+" form element not found ";
    }
    function getInvalidTypeMessages(formType){
    return "Invalid Form Element Type : "+formType;
    }


    Dosya Listesi
    · ValidatorProjeFormExample.html
    · AbstractFormValidator.js
    · SimpleAbstractValidatorTest.html
    · SimpleValidator.js
    · Messages.js
    · TypeValidatorModel.js
    · SimpleTypeValidator.js
    · NameValidatorModel.js
    · NameValidatorTest.html
    · Form.js



    godoro.com'dan yararlanarak düzenlenip hazırlanmıştır.



  5. #5
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Lightbulb JAVA - Nesneye Yönelik Programlama

    Nesneye Yönelik Programlama

    Class Kavramı
    Package’ler ve Derleme Birimleri
    Encapsulation (Kapsülleme)
    Inheritance (Kalıtım)
    Interface’ler ve Abstract Class’lar
    Çok Biçimlilik (Polymorphism)

    Class’lar (Sınıflar)

    Class, Property ve Method Kavramları

    Yazılım geliştirmenin iki temel bileşeni vardır : veri ve işlev. Her tür program belli veriler
    üzerinde belli işlever gerçekleştirir. Nesne, belli bir anlam bütünlüğü içeren veriler ve
    gerektiğinde o verilerle çalışan işlemlerden oluşan yapıdır. Dikdörgenler prizması diye bir
    nesne olduğunu düşünelim. Bununla ilgili en, boy ve yükseklik gibi veriler vardır. Ayrıca
    alanını ve hacmini hesaplama gibi işlemler bulunmaktadır. Java’da veri ve işlem içeren her
    birime "class" (sınıf) denir. Class’ların içerdiği veriye "property" (özellik), işlemlere de
    "method" (yöntem) denir. Dikdörtgenler prizması’nı belirten bir nesne yapalım.

    public class RectangularPrism{
    float width;
    float height;
    float depth;
    float getVolume(){
    return width*height*depth;
    }
    float getArea(){
    return 2*(width*height+width*depth+height*depth);
    }
    }

    Burada yaptığımız, dikdörtgenler prizması diye bir nesne olduğunu, bu nesnenin width,
    height, depth gibi özellikleri olduğunu, bu nesneyle alan ve hacim hesaplaması
    yapabileceğimizi söylemekten ibarettir. Ayrıca her property’nin veri tipini de belirttik.
    Dikdörgenler prizmasının kenarların kesirli sayılarla belirtilebilir.

    Instance
    Yukarıda bir class’ı tanımladık (’definition’ yaptık). Bu class bütün dikdörtgenler
    prizmalarında olabilecek özellikler (’property’ler) ve yöntemler (’method’lar) içeriyor. Henüz
    ortada belli bir prizma yok. Belli bir prizmanın "yaratılması" gerekli ki biz hacmini ve alanını
    bulalım. Class tanımına uygun olarak yaratılan nesnelere instance (örnek) denir.
    Dikdörtgenler prizmasına bir örnek verilmesi, başka bir deyişle bir dikdörtgenler prizması
    yaratılması lazım. Buna nesneye yönelik programlamadaki terminolojiyi kullanırsak,
    RectangularPrism class'ından bir instance yaratılması gerekiyor. Bir prizma yaratalım,
    boyutlarını 10,20 ve 30 olarak verelim. Alanını ve hacmini hesaplayıp ekrana yazalım.
    public class RectangularPrismTest{
    public static void main(String[] args){
    RectangularPrism prism=new RectangularPrism();

    prism.width=10.0f;
    prism.height=20.0f;
    prism.depth=30.0f;
    float volume=prism.getVolume();
    System.out.println("Volume : "+volume);
    float area=prism.getArea();
    System.out.println("Area : "+area);
    }
    }

    Burada RectangularPrism class'ından bir instance yarattık. Ismi de ’prism’. Bu isim
    rastgele seçilmiş bir isimdir, kısaca ’p’ de diyebilirdik. Ancak bir kez prism dedikten sonra
    aşağıda aynı ismi kullanmak zorundayız.

    Property Intialization
    Bir nesne yaratılırken ’property’lerinin değerleri default (varsayılan) değerlerine atanır.
    Property'ler de birer nesneyse (primitive type değilse) ’null' değerini alır. Bir değer olarak
    'null' hiç bir değeri yok demektir. Bir nesneyi yaratıp kullanan kişi bir method’u çağırmak
    için gerekli olan property’lerin değerlerini önceden vermezse hata durumu oluşur. Örneğin,
    prism değerinin ’height’ property’si verilmezse hacim hesaplanmaya çalışılırsa ne olacak?
    Nasıl bir hacim değeri üretilecek? Böyle sorunlarla karşılaşmamak için property’lerin
    'initialize' edilmesi gerekebilir. Property'ler belirlenirken
    float width=1.0f;
    float height=1.0f;
    float depth=1.0f;
    şeklinde bir initialization yapılabilir. Böylelikle bir değerin verilmesi unutulsa bile belli
    bir değer default alınacağından sorun çıkmaz. Height değeri verilmezse hacim 1 çıkar. Alan
    da 2*(1*1+1*1+1*1)=6 çıkar.

    Constructor
    Bir nesnenin yaratılma aşamasında bazı işlemlerin yapılması, bazı değerlerin atanması
    gerekebilir. Bir nesne yaratılırken çağrılan method benzeri yapıya ’constructor' denir.
    Constructor aslında bir method değildir. Ama class’la aynı ismi taşıyan, dönüş değeri
    olmayan bir method olarak da düşünülebilir. Prizmanın boyutlarının daha instance
    yaratılırken verilmesi bu şekilde sağlanabilir.
    public class PrismWithConstructor{
    float width;
    float height;
    float depth;
    public PrismWithConstructor(float w,float h,float d){
    width=w;
    height=h;
    depth=d;
    }
    float getVolume(){
    return width*height*depth;
    }
    float getArea(){
    return 2*(width*height+width*depth+height*depth);
    }
    }
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    3 / 19
    Bu class'ı kullanan bir application yapalım.
    public class PrismWithConstructorTest{
    public static void main(String[] args){
    PrismWithConstructor prism=new PrismWithConstructor(10.0f,20.0f,30.0f);
    float volume=prism.getVolume();
    System.out.println("Volume : "+volume);
    }
    }

    Method Signature
    Bir method'un ismiyle birlikte sırasıyla aldığı parametre tipleri, o method’un
    'signature'unu oluşturur. Siz bir method çağırdığınızda, öncelikle o nesnede o isimde bir
    method olup olmadığına bakılır. Eğer varsa, çağırdığınız parametreler’in tipleriyle birlikte
    eşleştirme yapılır ve uygun bir method varsa derleme işlemi başarılı olur. Aksi takdirde kod
    derlenemez.
    Bir nesnenin bir methodunu çağırdığınızda compiler kızıyorsa ve siz method ismini
    doğru yazdığınıza eminseniz, bilinki verdiğiniz paramtereler ya ek******, ya fazladır, ya sırası
    yanlıştır ya da parametre tipleri yanlıştır.

    Overloading (Çeşitleme)
    Bir method'la aynı isimde başka bir method yazılabilir. Buna overloading (çeşitleme)
    denir. Bu işlem, benzer işlemleri farklı parameteler’le yapan iki method için yapılır. Bu
    şekilde, bir çok method ismini öğrenmekten kurtulmuş oluruz. Ancak, overloading işleminde
    yeni method'un signature'u mutlaka farklı olmalıdır ki bir method çağırdığınıza hangisini
    çağırdığınız anlaşılabilsin. Zaten aynı isimde aynı parametreleri aynı sırada alan bir ikinci
    method yazmanın hiç bir anlamı yoktur. Aynı işi yapıyorlarsa, bir tanesine hiç gerek yok.
    Farklı işler yapıyorlarsa farklı bir isimde olmalıdır.
    Bir method'un return type'ı signature’a dahil değildir. Yani aynı isimde aynı parametre
    tiplerini aynı sırada belirten fakat iki ayrı return type olan iki ayrı method olamaz. Java’da bir
    method'un döndürdüğü değerin fazla bir önemi yoktur. Sadece o method'u çağıran için
    gerekliyse bir anlamı vardır. Hatta bir değer döndüren method, döndürdüğü değer
    kullanılmadan da çağrıabilir. Bazı method’lar belki lazım olur diye belli bir değeri
    döndürmektedirler.
    Birden Fazla Constructor

    Bir class'ın farklı parametreler alan birden fazla constructor'u olabilir.
    Yani constrcutor'lar da method'lar gibi 'overload' edilebilirler.
    public class PrismWithMultipleConstructor{
    float width;
    float height;
    float depth;
    public PrismWithMultipleConstructor(float w,float h){
    width=w;
    height=h;
    depth=1.0f;
    }
    public PrismWithMultipleConstructor(float w,float h,float d){
    width=w;
    height=h;
    depth=d;
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    4 / 19
    }
    float getVolume(){
    return width*height*depth;
    }
    }
    Bir constructor başka bir constructor’u çağırabilir. Bunun için ’this’ operatörü kullanılmalıdır.
    public PrismWithMultipleConstructor(float w,float h){
    this(w,h,1.0f);
    }
    public PrismWithMultipleConstructor(float w,float h,float d){
    width=w;
    height=h;
    depth=d;
    }
    Burada iki constrcutor'dan biri diğerini çağırıyor. Kendisine gelen değerleri aynen öbürüne
    devrederken bir değeri kendisi belirliyor. Bu yöntemin yararı, bir değişiklik yapıldığında
    sadece tek bir constructor'un değiştirilmesinin yeterli olmasıdır.

    Default & Parameter’siz Constructor’lar
    Aslında, programcı hiç bir tane yazmasa dahi, her class’ın bir constructor’u vardır. Sanki
    public class MyClass{
    public MyClass(){
    }
    }

    şeklinde bir constructor verilmiş gibi kabul edilir. Programcı hiç bir şey yapmadığında
    sağlanan default constructor hiç parametre almaz ve hiç bir işlem yapmaz. Hiç parametre
    almayan ama bazı initilization işlemleri yapan contructor’lar da yazılabilir. O zaman
    parameterless constructor (parametresiz kurucu) olur. Birim küpü 2, 2, 2 boyutlarında
    kabul ettiğimizi varsayalım.
    public class PrismWithParameterlesConstructor{
    float width;
    float height;
    float depth;
    public PrismWithParameterlesConstructor(){
    width=2.0f;
    height=2.0f;
    depth=2.0f;
    }
    public PrismWithParameterlesConstructor(float w,float h,float d){
    width=w;
    height=h;
    depth=d;
    }
    float getVolume(){
    return width*height*depth;
    }
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    5 / 19
    float getArea(){
    return 2*(width*height+width*depth+height*depth);
    }
    }
    Görüldüğü gibi class’ın iki constructor’u var. Birisi parametreleri dışardan alıyor, diğeri
    içerde belirliyor. Iki constructor’u da test edelim. Birisi default contructor’la birim küp yaratsın,
    diğeri boyutları vererek.
    public class PrismWithParameterlesConstructorTest{
    public static void main(String[] args){
    PrismWithParameterlesConstructor prism1=
    new PrismWithParameterlesConstructor();
    PrismWithParameterlesConstructor prism2=
    new PrismWithParameterlesConstructor(10.0f,20.0f,30.0f);
    float volume1=prism1.getVolume();
    float volume2=prism2.getVolume();
    System.out.println("Volume 1: "+volume1);
    System.out.println("Volume 2: "+volume2);
    }
    } ,

    Package’ler ve Derleme Birimleri

    Package
    Birbiriyle işlev veya kullanım açısından ilişkili class’lar ’package' adı verilen bir birim
    altında birleştirilir. Bir class’ın ait olduğu package’i belirtmek için ’package' keyword'ü
    kullanılır.
    package mypackage;
    public class MyClass
    // ..
    }

    Bir class'ın diğer bir class’la aynı package’te olması, ona bazı avantajlar sağlar.
    Aslında bütün class’lar bir package’e ait olmak zorundadır. Hiç bir isim verilmediğinde o
    class isimsiz default package'de kabul edilir. Package'i belirtilmemiş bütün classlar aynı
    package'in class'ları sayılır. Bazı durumlarda sadece örnek olsun diye yapılıp hatalı
    (derlenemez durumda) bırakılan class, yine package’siz olan başka bir class’ın derlenmesini
    engelleyebilir.

    Import
    Bir class'ın kendisiyle aynı package’de olmayan class’ı kullanabilmesi için, class
    tanımından önce import etmesi gerekir. Bu sadece kullanılacan class’ların tam olarak
    hangi pakette olduğunu söylemek anlamına gelir. Bunun için ’import' keyword'ü kullanılır.
    package myanotherpackage;
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    6 / 19
    import mypackage.MyClass;
    public class MyAnotherClass
    // ..
    }
    Burada sadece kullanılacağı belirtilmektedir. Yoksa, import edilen class’ın import eden
    class'ın üzerine ’include' edilmesi (eklenmesi) sözkonusu değildir.
    'java.lang' package'indeki class'ları kullanmak için import ifadesine gerek yoktur. Bu
    package olmadan hiç bir Java programı yapılamayacağı için, default olarak import edilmiş
    sayılır.

    ’*’ Operatörüyle Import
    Bir package'deki bütün class’ları import etmek için ’*' operatörü kullanılabilir.
    package myanotherpackage;
    import mypackage.*;
    public class MyAnotherClass
    // ..
    }

    Bu işlem, altalta çok sayıda import ifadesi yazmaktan daha kolaydır.
    '*' operatörü kullanılıdığında bir çok class’ın gereksiz yere import edildiği gibi bir izlenim
    doğmakla birlikte, import işlemi aslında bir belirtmeden öteye gerçek bir ’içine alma’ işlemi
    anlamına gelmediği için önemli bir performans kaybına yol açmaz. Sadece bazı
    programcılar okunurluğu arttırmak için böyle bir yola gitmektedirler.

    Fully-Qualified Name (Tam Nitelendirilmiş Isim)
    Aslında her class package ismiyle birlikte adlandırılır. Örneğin, ’mypackage’ isimli bir
    package'de 'MyClass' isimli bir class'ın tam nitelendirilmiş ismi ’mypackge.MyClass’ dır.
    Import ifadesi, sadece programcıyı her class ismini böyle uzun yazmaktan kurtarmaktadır.
    'java.awt' package'inde olan Button adlı class’ın bir instance’ını ’import java.awt.*’ diyerek
    kullanırsak
    Button b=new Button();
    şeklinde yaratabiliriz. Hiç ’import’ kullanmayarak aynı ifadeyi
    java.awt.Button b=new java.awt.Button();
    şeklinde de yazabiliriz. Bu şekilde paket ismiyle birlikte verilen class isimlerine

    fullyqualified
    name denir.


    Alt Package’ler

    Bazı durumlarda çok fazla class içermemesi için bir package alt birimlere bölünebilir.
    Örneğin, görsel bileşenler içeren ’java.awt’ package’ın image’larla ilşkili olan
    'java.awt.image' şeklinde bir alt package’i bulunmaktadır. Aslında alt package’in teknik
    anlamda üst package’in ’içinde’ olması sözkonusu değildir. Alt package isimlendirmesi iki
    'ayrı’ package’i sadece anlamca ilişkilendirmektedir.
    Bir class'ta üst package’i import etmek, otomatikman alt package’lerin de import edileceği
    anlamına gelmez. Örneğin, ’java.awt.*’ ifadesi ’java.awt.event.*’ ifadesini içermez. Bu alt
    package'den herhangi bir class kullanılacaksa ayrıca import edilmesi gerekir.

    Standart Package’ler
    Java'nın kendi API’ı (Application Programming Interface - Uygulama Programlama
    Arayüzü’ü) bir çok class’dan oluştuğu için bir çok package altında gruplandırılmıştır.
    Bunların çoğu ’java.’ ve ’javax.’ la başlar. ’javax’ öneki daha çok, sonradan extension
    (ekleme) package'ler için kullanılır. Önceden ’extension’ olan package’ler daha sonra
    standart API'a dahil olabilmektedir.
    Java'nın standart package’leri benzer ve ilişkili class'lardan oluşur. Her package’de bulunan
    class'ların ezberlenmesine gerek yoktur. Sadece her package’de ne tür class’ların
    bulunduğu öğrenilmesi yeterlidir. Örneğin, arayüzle ilgili class’lar ’java.awt’dedir. Görsel
    bir bileşen olarak Button bu package’tedir. Yine görsel bir bileşen olan text alanı’nın
    (TextArea'nın) da bu package’de olması gayet doğaldır.

    Naming Convention (Isimlendirme Geleneği)
    Package isimlerinin rastgele verilmesi, bir sistemde farklı kurumlara ait package’leri
    bulunması durumunda ’name collision' (isim çarpışması) adı verilen bir sorun
    yaratabilmektedir. Aynı package ismini başka bir kurum da kullandıysa ne olacak?
    Örneğin siz package’in adını ’myapplets’ koydunuz. Sistemde aynı isimde başka bir kuruma
    ait bir package daha var tesadüfen. Java önce hanginizinkini bulursa onu yükler. Sizinki
    önce bulunuyorsa onların package’i doğru çalışmaz, onlarınki önceyse sizinki.
    Bu sorunlarla karşılaşmamak için package isimlerinde standart bir yöntem uygulanır. Bir
    kurum, sahip olduğu Internet domain ismini tersten yazarak package isimlerinin önüne
    ekler. Örneğin ’godoro.com’a sahip olan kurum veya kişiler, chat appletlerini
    'com.godoro.chat' diye bir package'e koyabilirler. ChatApplet isimli biri class için fullyqualified
    class name 'com.godoro.chat.ChatApplet' şeklinde olur. Java’yı ortaya çıkaran
    'Sun' firması da kendi package’lerini ’com.sun.’ şeklinde başlatmaktadır. ÖZel kuruluşlar
    com., ticari olmaytan kurumlar da org. ile başlarlar.

    Aynı Package’teki Class’lar
    Aynı package’deki class’lar birbirlerinin private olmayan property ve methodlarına, onlar
    public olmasala bile ulaşırlar. Ayrıca, aynı package’deki class’ların birbirlerini ’import’
    etmeleri gerekmez.

    Derleme Birimi
    Class'lar '.java' uzantılı dosyalarda bulunabilirler. Bu dosya aslında bir compilation unit
    (derleme birimi)dir (). Bir dosyada birden fazla class alt alta tanımlanabilir. Ancak en fazla
    bir tanesi 'public' olabilir. Ve dosyanın (derleme biriminin) adı bu public class’ın adıyla
    aynı olmalıdır. Bu class derleme biriminin asıl class’ıdır ve adı değiştirildiğinde dosyanın
    da adı değiştirilmelidir. Tek dosyada bulunan class’lar derlendiğinde her biri için ayrı
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    8 / 19
    .class üretilir. Yani derlendikten sonra class’lar birbirinden ayrılırlar. Bir derleme
    biriminde sadece bir tane class bulundurmak, zorunlu olmasa da bir gelenek halini almıştır.

    Encapsulation

    Encapsulation Kavramı
    Her class çeşitli üyelerden (property ve method’lardan) oluşur. Hemen hemen bütün
    class'lar başka bir class tarafından kullanılmak amacıyla üretildiğinden, bazı üyeler sadece
    dışarıdan kullanılmak üzere hazırlanmıştır. Buna karşı bazı property ve method’lar,
    diğerlerine yardımcı olmak, sadece onlar tarafından class’ın iç işlerinde kullanılmak için
    yazılırlar. Belli bir class’ı kullanan class’ın bunları görmesi veya bilmesi gerekmez. Hatta
    bazı durumlarda property ve method’ların sadece ufak bir kısmı dışarısı tarafından kullanılır.
    Bir insanın belli bir class’a baktığında üyelerden hangisi kendisinin işine yarar, hangisi
    sadece başka methodlarda kullanılmak için yapılmıştır ve class’a özel’dir anlaması çok zor
    olabilir. Bazı durumlarda da güvenlik ve sağlamlık sağlamak amacıyla bir class’ı kullanan
    class'ın bazı property’leri değiştirmesi ve bazı methodlara erişmesi engellenmek istenebilir.
    Bazı property ve methodların ait olduğu class’ın dışında erişimini sınırlama özelliğine
    'encapsulation' (kapsülleme) denir. Encapsulation sağlamak için private, public ve
    proteced sözcükleri kullanılır. Bunlara access modifier (erişim değiştirici) denir. Hiç birini kullanmak da bu bağlamda belli bir tercih anlamına gelir.

    Default Access
    Hiç bir access modifier kullanılazsa, yani bir property ve methodun başında private,
    protected ve public keyword'lerinden hiç biri kullanılmazsa bu üye ’package private' olur.
    Yani ona sadece aynı package’deki diğer class’lar erişebilir, diğer package’lerdekiler
    erişemez.

    Public Access
    Sistemdeki bütün class’ların erişebilmesini sağlamak için ’public' erişim değiştiricisi
    kullanılır. Herkesin erişmesinde sakınca bulunmayan üyeleri için kullanılır. Genellikle bu
    değiştirici özellikle başkaları erişsin diye yazılan property ve method’lar için kullanılır. Bir
    nesnede ne kadar az public değişken varsa dışarıya o kadar sade görünür ve o kadar kolay
    kullanılır. O nesneyi kullananlar gereksiz bir çok üye arasında dolaşmak zorunda kalmazlar.

    Private Access
    Bir property veya method'un sadece tanımlandığı class’dan erişilebilmesini, başka bir
    deyişle, o class dışındaki bütün class’lardan (aynı package’de olsalar bile) erişiminin
    yasaklanmasını sağlamak için ’private' keyword'ü kullanılır.
    Bir değişkenin dışardan görülebilmesini ancak değiştirilemesini veya değiştirme
    işleminin class’ın kontrolünde yapılmasını sağlamak için standart bir yöntem izlenir. Bir
    property'yi read-only (salt okunur) yapmak için, o property private yapılır. Ona erişmek için
    bir tane public method yazılır. Bu şekilde dışarından property’nin value’si dolaylı olarak
    öğrenilmiş olur.

    public class MyDiscreetClass{
    private int value=3;
    public int getValue(){
    return value;
    }
    }
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    9 / 19
    Bu class'tan yaratılmış bir nesne’yi kullanan örnek yapalım.
    public class MyDiscreteUserClass{
    public static void main(){
    MyDiscreetClass d=new MyDiscreetClass();
    int v=d.getValue();
    System.out.println("Value : "+v);
    }
    }

    Buradaki value private olduğu için
    int v=d.value;
    yazarsak derleyici hata verir. Property orada olduğu halde artık erişilmez hale gelmiştir.
    Ama değeri öğrenmek için getValue() methodu kullanılabildiği için bir programın işleyişini
    bozmaz. Biz bu değeri değiştirmek istersek :
    d.value=5;
    derleyici yine hata verecektir. Bu şekilde class kendi property’sini korumuş oluyor.
    Bir değişkenin hem okunması hem de değiştirilmesi istenip sadece bunun kontrollü bir
    şekilde yapılmasını istersek yine property’yi private tutarız ve hem erişebilmek için hem de
    değiştirebilmek için iki ayrı method yazarız. Bir değerin eksi olmamasını sağlayan bir class
    yapalım :

    public class MyControlledClass{
    private int value=3;
    public int getValue(){
    return value;
    }
    public void setValue(int v){
    if(v>0){
    value=v;
    }else{
    value=-v;
    }
    }
    }
    Bu değeri değiştirip sonrsa yeni değeri alan bir program yazalım.
    public class MyControlledUserClass{
    public static void main(){
    MyControlledClass d=new MyControlledClass();
    d.setValue(-7);
    int v=d.getValue();
    System.out.println("Value : "+v);
    }
    }
    Bu program, kendisinin değiştirmeye (kullanılan class açısından bakarsak, ’bozmaya’)
    çalıştığı değerin hala sağlam olduğunu ortaya koymaktadır.

    Protected Access
    Bazı durumlarda bir property veya method’un dışarıya kapalı olmasını ancak o class’ı
    extend edenlere açık olması istenebilir. Bu durumda 'protected' erişim değiştiricisi kullanılır.
    Bir class diğerini extend ederse, onun bütün public property’lerin erişebilir hale gelir. Zaten
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    10 / 19
    bunlara her class'ın erişebilmektedir. Hiç bir private property extend eden class’a geçmez.
    Bunlar diğer bütün class’lara da kapalıdır. Ancak protected property ve methodlar dışarıya
    kapalı oldukları halde, extend edilen class bunlara erişim hakkına sahiptir. Bu keyword, belli
    bir property veya method'un sadece onu extend eden class'ları ilgilendirmesi durumunda
    kullanılır.
    Erişim değiştirici olarak protected verilmiş property veya method’lara o class’la aynı
    package içerisindeki bütün class'lar tarafından da erişilebilir.

    Erişim Düzeyleri Sıralaması
    Encapsulation düzeyleri için
    public > protected > ’default’ > private
    şeklinde bir sıralama yapılır. Büyük olan düzey küçük olanların haklarını da kapsar. Bir
    property'nin public olup private özelliği içermemesi, yani tanımlandığı class’tan erişilemez
    ama onun dışındaki bütün class’lardan erişilmesi gibi bir durum söz konusu olamaz.

    Inheritance (Kalıtım)

    Inheritance Kavramı
    Bir class'ın başka bir class’daki property ve method’lara sahip olmasına inheritance
    denir.. Belli bir class, daha genel bir kavramı ifade eden class’ın üyelerine sahip olarak, onları
    tekrar tanımlamak zorunda kalmaz. Bir class’ın diğerindeki özellikleri miras olarak alması
    için kullanılan keyword ’extends' dir. Anlam olarak "Bu class şu class’ı ’genişletir’ yani
    ondaki property ve methodları alır ve yenilerini ekler" demektir.
    Inheritance, bazı durumlarda başka birinin yazdığı class’a bazı eklemeler yaparak belli bir
    işlem için kullanılır hale getirmek için kullanılabilir. Böylelikle sadece o class’ta olmayan
    property ve methodları eklemek suretiyle çok kısa sürede gelişmiş bir class sahibi olabilir.
    Bazen de ortak bir çok özellik içeren iki nesnede de aynen bulunan property ve methodları
    tanımlamaktan kurtulmak için kullanılabilir.

    ’Extends’ Kullanımı
    Diyelim ki bize bir küp ve küre’yle hacim, yüzey alanı, kütle ve ağırlık gibi hesaplamalar
    yapmamız gerekiyor. Bir çok özellik bu iki nesnede ortaktır. Ikisinde de bir özkütle vardır.
    Hacim hesaplama teknikleri değişebilir ama kütle hesap teknikleri değişmez. Her iki cisim
    için de kütle, özkütle ile hacmin çarpımıdır. Bu iki cisim için SimpleSphere ve SimpleCube
    gibi iki class yapacaksak, ortak özellikleri içeren SimpleBody diye bir class yapmak akıllıca
    olur. ªimdilik sadece SimpleSphere'e ihtiyacımız varsa dahi, sonradan SimpleCube veya
    başka bir cismin gerekebileceğini düşünerek bir base class yapmak da faydalı olabilir.

    public class SimpleBody{
    private double density=1.0;
    public SimpleBody(){
    }
    public SimpleBody(double d){
    setDensity(d);
    }
    public void setDensity(double d){
    density=d;
    }
    public double getDensity(){
    return density;
    }
    }

    Görüldüğü gibi, cismin yoğunluğunu belirten bir property ve bunula ilgili iki method var.
    Bu class'ı ’extend’ eden SimpleSphere adlı bir class yapalım.
    public class SimpleSphere extends Body{
    public double radius=1.0;
    public SimpleSphere(double d,double r){
    super(d);
    radius=r;
    }
    public double getVolume(){
    return (3.14 * radius * radius * radius )/3;
    }
    }

    Yazdığımız SimpleSphere class’ın radius property’si dışında, density property’si de vardır.
    ªöyle bir kod parçası geçerlidir :
    SimpleSphere s=new SimpleSphere();
    s.setRadius(3.6);
    s.setDensity(1.2);
    Extend eden class'a subclass, extend edilen class'a da super class (veya base class) denir.

    Super Class’ın Constructor’unun Kullanımı
    Bir class'ı extend eden class’ın constructor’u extend ettiği class’ın constructor’unu
    'super()' şeklinde çağırabilir. Bu şekilde super class’a veri aktarılmış olur. SimpleSphere
    class'ına bir constructor ekleyelim :
    public SimpleSphere(double d,double r){
    super(d);
    setRadius(r);
    }
    Bu şekildeki constructor'u kullanmak istersek
    SimpleSphere sphere=new SimpleSphere(3.6,1.2);
    biçiminde bir kod yazmak yeterli olacaktır.
    Bir constructor'ın diğerini çağırması durumunda super ifadesi kesinlikle ilk satırda
    belirtilmelidir. Herhangi bir kod parçası yazıldıktan sonra super class'ın bir constructor’u
    çağrılamaz.
    Super class'ın constructor’u açık olarak çağrılmadıkça, parametresiz olan super()
    constructor'un çağrıldığı varsayılır. Super constructor’un böyle bir constructor’u yoksa
    mutlaka parametreli bir constructor çağrılmalıdır. Aksi takdirde derleyici hata verir.

    Super Class’larda Protected Property’ler
    Base class'da 'private' olan property'lere subclass'tan erişilemez. Erişilmesi için ’public’
    yapılması durumunda da ilgili üye herkese açık hale gelecektir. Sadece extend eden class'ın
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    12 / 19
    erişimini sağlamak için ’protected’ erişim değiştiricisi kullanılır. SimpleBody class’ında
    'density' property'si protected olmalıdır.

    Overriding (Ezme)
    Bir subclass super class'ının bir methodunun davranışını yeniden yazabilir, yani
    super'dekini ezebilir. Buna overriding denir. Bunun için aynı üst class’ın method’unun
    signature'uyla aynı olmalıdır. Bu işlem bazen methodun tamamen değiştirme, bazen de
    sadece bir ekleme yapma şeklinde yapılır. SimpleSphere class’ında, SimpleBody class'ında
    density property'sini belirleyen setDensity() method'u, negatif değer kontrolü yapacak şekilde
    değiştirmek için
    public void setDensity(double d){
    if(d>=0){
    density=d;
    }else{
    density=0.0;
    }
    }
    biçimde bir kod yeterlidir. SimpleSphere class'ında setDensity() methodu çağrıldığında
    bu yeni method geçerli olacaktır. Elbette bu değişiklik SimpleBody class’ı ve bu class’ı
    extend eder diğer class’ları bağlamaz. Onlar hala üsteki methodu çağırırlar.
    Override eden method, override edilen methodu çağırabilir. Ancak ikisinin de adı da
    parametreleri de aynı olduğu için super anahtar sözcüğü kullanılır.
    public void setDensity(double d){
    if(d>=0){
    super.setDensity(d);
    }else{
    super.setDensity(0.0);
    }
    }
    Super class'da olan bir method'un ismiyle aynı farklı parametreler alan bir method
    yazlıabilir. Ama bu durumda overriding değil overloading yapılmış olur. Yani var olan bir
    method'u değiştirmek yerine yeni bir method eklenmiş olur. Ilk method çağrıldığında yine
    eskisi gibi çalışır.

    Multiple Inheritance (Çoklu Kalıtım)
    Java'da 'multiple inheritance', yani bir class'ın iki veya daha çok class’ı extend etmesi,
    onların property ve method’larını miras alması mümkün değildir. C++ gibi diğer nesneye
    yönelik dillerde bu mümkündür ama Java’da kafa karışıklığına, çalışma zorluğuna, birbirine
    girmiş yapılar yaratmaya neden olduğu için izin verilmemiştir. Java’daki single inheritance
    (tekli inheritance)da hangi class'ın hangisini extend ettiği bir ağaç yapısı şeklinde net bir
    şeklide görülmektedir. Aslında bu yazılım tasarımı ısından da gereklidir. Örneğin bir
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    13 / 19
    hayvan hem memeli hem de kuş olmaz. Hem balık hem memeli olmaz. Hatta yarasa uçsa
    bile, balina yüzse bile onlar birer memelidir. Yarasanın kuşlar gibi uçtuğunu görüp onu hem
    memeli hem kuş saymak ne kadar yanlışsa, bir class’ı iki ayrı class’ın özelliklerine birden
    sahip olması gerektiğini düşünmek o derece yanlıştır. Eğer tasarımınız bunu zorunlu kılıyorsa
    ya yanlış tasarım yapmışsınızdır ya yanlış çözümleme yapmışsınızdır. Çoklu kalıtımın
    gerekli gibi göründüğü durumlarda başka çözüm yolları devreye girer. Bunları programcı ve
    sistem tasarımcıları Java’da bilgi ve deneyimlerini arttırdıkça öğrenebilirler. Örneğin iki
    class'ı extend etmek yerine birini extend etmek, diğerini bir property olarak tanımlamak ve
    kullanmak mantıklı bir çözüm olabilir..

    Interface’ler ve Abstract Class’lar

    Interface Kavramı
    Java'da interface, bir class'ta olması gereken method ve property’leri tanımlayan yapıdır.
    Kendisi normal bir class değildir, sadece neyin yapılacağını göstermekte, ancak nasıl
    yapılacağını göstermemektedir. Örnek olarak, bir madde’de ne gibi işlevler ve özellikler
    olması gerektiğini belirten bir interface yazalım.
    public interface Matter{
    public double getVolume();
    public double getMass();
    }
    Bu ifade, 'bir maddenin yoğunluğu, hacmi ve kütlesi olur’ demenin Java’daki yoludur.
    Ancak görüldüğü gibi maddenin yoğunluğu nasıl hesaplanır, kütlesi nasıl verilir, hiç bir
    şekilde belirtmemektedir. Sadece ne olması gerktiğini söylemektedir.

    Interface’in Implementation’u
    Bir class'ın interface’deki bütün method’ları içerdiğini, gerçekleştirdiğini belirtmesine
    implementation denir ve 'implements' keyword'üyle kullanılır.
    public class CubeMatter implements Matter{
    public double density=1.0;
    public double edge=1.0;
    public double getDensity(){
    return density;
    }
    public double getVolume(){
    return edge*edge*edge;
    }
    public double getMass(){
    return density*edge*edge*edge;
    }
    }
    Burada "Küp diye bir nesnemiz var ve o bir maddedir, yani bir maddede olabilecek bütün
    nitelikler onda da bulunur." demiş olduk ve bunların nasıl hesaplandığını gösterdik. Aynı
    interface'i implement eden başka bir class’da yapılabilir.
    public class SphereMatter implements Matter{
    public double density=1.0;
    public double radius=1.0;
    public double getDensity(){
    return density;
    }
    public double getVolume(){
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    14 / 19
    return (3.14 * radius * radius * radius )/3;
    }
    public double getMass(){
    return density*(3.14 * radius * radius * radius )/3;
    }
    }
    Görüldüğü gib bu class’da aynı interface implement ediyor. Ancak hacim ve kütle
    hesaplaması çok değişik.

    Absract Class’lar
    Bazı methodlarını implement etmiş, bazılarının imlementation’unun kendisini extend
    eden class'a bırakmış olan class’a abstract class denir. Bu tip class'lar en çok, iki class’ın
    ortak methodlarından bazılarının implementation’u da aynı olması durumunda kullanılır.
    Örneğin bir küp için de kütle, hacim ve yoğunluğun çarpımına eşittir, bir küre için de. Ancak
    yaptığımız iki nesnede de bu ortak özelliği kullanamıyor. Her birisi kütle hesaplamasını
    kendisi yapılıyor. Matter interface’ini implement eden ne kadar class varsa bu işlem o kadar
    tekrarlanacak demektir. Bu 'ortak' işlemi bir kere yapıp, hep onun kullanılmasını sağlamak
    mümkündür.
    Ancak çözülmesi gereken bir sorun var : Her class’ın kütlesi aynı şekilde hesaplanıyor
    bunu hesaplamak için gerekli hacim değerini bilmiyoruz ve her class kendisine göre değişik
    bir şeklide hesaplıyor. Bu sorun abstract method kullanarak çözülebilir.

    abstract public class Body{
    public double density=1.0;
    public Body(double d){
    density=d;
    }
    public double getDensity(){
    return density;
    }
    public double getMass(){
    return density*getVolume();
    }
    abstract public double getVolume();
    }

    Burada abstract bir Body class'ı yarattık. Bu class, hem Cube’ün hem de Sphere'in ortak
    özelliklerini içermektedir. Zaten density property’si ikisinde de ortaktır. Bu şekilde
    inherintace yoluyla Cube ve Sphere'a geçebilir. Burada getVolume() method’u abstract
    bırakılmıştır. Yani implement edilmemiştir. Çünkü volume hesaplamak için her nesne farklı
    bir method kullanmaktadır. Ancak getMass() implement edilmiştir. Çünkü kütle yoğunlukla
    hacmin çarpımıdır. Burada object-oriented porgramlama dışındaki bir teknikle asla
    yapılamayacak bir işlem bulunmaktadır. Bir method (getMass()) henüz yazılmamış bir
    mehodu (getVolume()'u) kullanarak bir işlem yapabilmektedir. Bu şekilde her cisim için ayrı
    ayrı hesap yapmaktan kurtulmuş olduk. ªimdi küp ve küre için yeni class’lar yapalım :
    public class CubeBody extends Body{
    public double edge=1.0;
    public CubeBody(double d,double e){
    super(d);
    edge=e;
    }
    public double getVolume(){
    return edge*edge*edge;
    }
    }

    Görüldüğü gibi bu class kütle hesabını yapan getMass() diye bir method'u yazmak
    zorunda kalmadı. Çünkü ona miras yoluyla sahip olmuştur. Aşağıdaki gibi kod yazılabilir :
    CubeBody cube=new CubeBody(2.5,10.2);
    double mass=cube.getMass();
    System.out.println("Mass : "+mass);
    Aynı şekilde yeni bir küre class’ı yazalım.
    public class SphereBody extends Body{
    public double radius=1.0;
    public SphereBody(double d,double r){
    super(d);
    radius=r;
    }
    public double getVolume(){
    return (3.14 * radius * radius * radius )/3;
    }
    }

    Tıpkı küp gibi küre de artık kütle hesabını, hiç bir ek kodlama yapmadan
    yapabilmektedir.

    Hem Extend Hem Implement Etmek
    Bir class sadece bir class'ı extend edebilir. Ancak aynı anda bir class’ı extend edip bir
    veya daha fazla interface'i implement edebilir. Çünkü ’extends’ keywordünün aksine,
    'implements' demek yoluyla bir class'ın aldığı hiç bir şey yoktur. Sadece bazı method’ları
    implement etmeyi taahüt etmektedir. Bir Cube class’ı hem Body classını extend edebilir hem
    de Matter inetrface'ni implement edebilir.
    public class Cube extends Body implements Matter{
    // ...
    }
    Base class'ın bir interface’i imlement etmesi durumda subclass’da etmiş sayılır. Yani
    public class Body implements Matter{
    // ...
    }
    dersek
    public class Cube extends Body{
    // ...
    }
    dememiz yeterlidir. Cube class'ı Matter’i implement etmiş sayılır. Yani implementation’u
    da miras yoluyla almış demektir.

    Interface’in Kullanım Özellikleri
    Interface'ler bütün methodları absract olan bir absract class gibi düşünülebilirler. Ancak
    class'lardan ayrılan başka özellikleri vardır. Ayrıca söylensin veya söylenmesin bütün
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    16 / 19
    method ve property'ler public sayılır ve başların proteced veya private gibi anahtar sözcükler
    alamazlar. Interface'lerde bütün propertyler public, final ve static’tir. O yüzden
    interface'lerde tanımlanan property’ler bir veya daha fazla class’da kullanılan sabitler için
    kullanılır.
    public interface MathConstants{
    double PI=3.14;
    }
    public class Circle implements MathConstants{
    private double radius=1.0;
    public getCircumference(){
    return 2*PI*radius;
    }
    }
    görüldüğü Circle classında tanımlanmadığı halde PI değişkeni, sadece MathConstants
    interface'ini implement ettiği için erişilebilir durumdadır. Bu interface’i implement eden
    Cylinder adlı bir class’da aynı şekilde PI’a erişebilir. Bu anlamda PI bir sabittir. Ama PI
    property'si sadece implement edilen class'lar tarafından görülmekte olduğundan global
    değildir. Zaten Java’da global değişken ve sabit yoktur. Onlara ihtiyaç duyulan yerlerde
    interface kullanılır. Ancak yine de değişken (dah doğrusu sabit) bir yere (interface) ait
    olduğundan global olmasından doğacak sakıncalardan kurtulunabilir. Örneğin Math.PI ve
    GreekLetters.PI yazılabilir, ikisi farklı değerler taşıyabilir.

    Polymorphism (Çok Biçimlilik)
    Polymorphism (Çok Biçimlilik)
    Nesneye yönelik programlamada polymorphism , nesnelerin içeride farklı çalışmalarına
    rağmen dışarıdan aynı biçimde görünmelerine denir. Bu şekilde, bir grup nesneyi kullanan
    class'lar implementation'la ilgili detayları bilmek zorunda kalmazlar, içerideki
    değişikliklerden etkilenmeden çalışmaya devam ederler. Aynı class’ı extend eden veya aynı
    interface implement eden class'lar standart bir şekilde erişilebilme özelliklerine sahip olurlar.

    Polymorphism Olmadan Kodlama
    Bir miktar kübün toplam kütlesini hesaplamak istediğimizi düşünelim. Küp class’ının ana
    hatları şöyle olsun :
    public class Cube{
    // ...
    public double getMass(){
    // ...
    }
    }
    Bu class'tan yaratılmış instance’ların kütlelerini toplayan bir method ve program yazalım.
    public class CubesMassCalculator{
    public static double calculateTotalMass(Cube[] cubes){
    double total=0.0;
    for(int i=0;i<cubes.length;i++){
    total+=cubes[i].getMass();
    Nesneye Yönelik Programlama, Ders Sorumlusu: Yrd.Doç.Dr.Hilmi KUªÇU
    17 / 19
    }
    return total;
    }
    public static void main(String[] args){
    Cube[] cubes=new Cube[3];
    cubes[0]=new Cube(2.2,10.5);
    cubes[1]=new Cube(3.1,6.1);
    cubes[2]=new Cube(5.6,1.2);
    cubes[3]=new Cube(9.3,6.1);
    cubes[4]=new Cube(4.0,3.7);
    double total=calculateTotalMass(cubes);
    System.out.println("Total Mass : "+total);
    }
    }
    Aynı programı küreler içinde yazabiliriz. Sphere class’ımız da aynı biçimde tanımlanmış
    olsun :
    public class Sphere{
    // ...
    public double getMass(){
    // ...
    }
    }
    Ancak calculateTotalMass() method'unu şu biçimin de tanımlamalıyız :
    public static double calculateTotalMass(Sphere[] spheres){
    // ..
    }
    Peki ya bir nesne dizimiz değişik cisimlerden oluşuyorsa? Örneğin üç tane kübümüz iki
    tane küremiz varsa ne olacak? Onun için şöyle bir method daha yazmalıyız.
    public static double calculateTotalMass(Cube[]
    cubes,Sphere[] spheres){
    // ..
    }
    Ya dikdörgenler prizması ve piramit gibi cisimlerimiz de varsa ne yapacağız? Her biri için
    ayrı toplamlar alan bir sürü method yazmaktan başka çaremiz kalmayacak. Işte
    polymorphism burada devreye giriyor.

    Ploymophism’den Yararlanma
    Eğer iki class’da ortak bir method varsa, bu ikisinin de temel alacağı Body şeklinde bir class
    yapmak gereklidir :
    class Body{
    // ...
    public double getMass(){
    // ...
    }
    }
    class Cube extends Body{
    // ...
    }
    class Sphere extends Body{
    // ...
    }

    Çeşitli tipte cisimlerden olişan bir dizinin toplam kütlesini hesaplayan bir class yapalım.

    public class BodiesMassCalculator{
    public static double calculateTotalMass(Body[] bodies){
    double total=0.0;
    for(int i=0;i&amp;bodies.length;i++){
    total+=bodies[i].getMass();
    }
    return total;<noframes></noframes>
    }
    public static void main(String[] args){
    Body[] bodies=new Body[3];
    bodies[0]=new Cube(2.2,10.5);
    bodies[1]=new Sphere(3.1,6.1);
    bodies[2]=new Cube(5.6,1.2);
    bodies[3]=new Cube(9.3,6.1);
    bodies[4]=new Sphere(4.0,3.7);
    double total=calculateTotalMass(bodies);
    System.out.println("Total Mass : "+total);
    }
    }

    Görüldüğü gibi tek method çeşitli cisimlerin kütlelerini toplayabiliyor. Her cismin
    farklı bir hacim ve kütle hesaplama şekli olduğu halde. Bunun için tek gerekli şart Cube ve
    Sphere class'larının Body class’ını extend etmeleri ve Body class’ında getMass() şeklinde bir
    method olmasıdır. Pyramid diye Body’yi extend eden bir class yapıp, dizinin dördüncü
    elamanı olarak verirseniz calculateTotalMass() methodu yine toplam kütleyi doğru olarak
    hesaplayacaktır. Çünkü o zaten Sphere’ı da Cube’ü de tanımamaktadır. Sadece Body class’ını
    tanımaktadır ki, bir cismin kütlesi olması, onun kütlesini toplama dahil etmesi için yeterlidir.

    Interface ve Abstract Class’larla Polymorphism
    Polymorphism özelliğini kullanmak için, class’ların belli bir concrete base class’a sahip
    olmaları gerekmez. Base class’ları abstract olabilir. Hatta ortak kullanılan method’un kendisi
    bizzat abstract olabilir. Bu biçimde interface’lerin de kullanılması mümkündür. Aynı
    interface'i implement eden her class aynı type’da kabul edilir. Yukarıdaki örnekteki class’lar
    abstract class Body{
    // ...
    abstract public double getMass();
    }
    class Cube extends Body{
    // ...
    public double getMass(){
    // ...
    }
    }
    class Sphere extends Body{
    // ...
    public double getMass(){
    // ...
    }
    }

    şeklinde de tanımlanmış olsalar aynı şekilde kullanılabilirdi. Body’nin bir class değil de bir
    interface olarak tasarlanması durumunda da aynı şey geçerlidir.

    interface class Body{
    public double getMass();
    }
    class Cube implements Body{
    // ...
    public double getMass(){
    // ...
    }
    }
    class Sphere implements Body{
    // ...
    public double getMass(){
    // ...
    }
    }


    http://hilmi.trakya.edu.tr/ders_notl...rogramlama.pdf

  6. #6
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Lightbulb

    EXTRA

    Java - Dahili Sınıflar (Inner Classes)
    Diğer programlama dillerinde olan çoklu kalıtım (multiple inheritance) özelliği Java programlama dilinde yoktur. Java programlama dilinde çoklu kalıtım desteğinden faydalanmak için arayüz (interface) ve dahili sınıflar (inner classes) kullanılır.

    Bu makalemizde ise Bu iki destekten inner classes dahili sınıflar kavramını incelemeye çalışacağız.

    Dâhili Sınıflar (Inner Classes)

    Dâhili sınıflar JDK 1.1 ile gelen bir özelliktir. Bu özellik sayesinde bir sınıf diğer bir sınıfın içerisinde tanımlanabilir; böylece mantıksal bir bütünü oluşturan bir çok sınıf tek bir çatı alında toplanır. Dahili sınıflar yapısal olarak 3 gruba ayrılabilir.

    Dâhili üye sınıflar
    Yerel sınıflar (Local classes)
    İsimsiz sınıflar (Anonymous classes)

    Dâhili Üye Sınıflar

    Bir sınıfın içerisinde, başka bir sınıfı tanımlamak mümkündür; Şöyle ki...

    class CevreliyiciSinif {

    class DahiliSinif {
    //....
    }

    //...
    }


    Başka bir sınıfın içerisinde tanımlanan bu sınıfa dâhili üye sınıf denir. Dahili sınıfları, çevreleyici sınıfların içerisinde kullanmak, geçen makalelerde incelediğimiz komposizyondan yönteminden farklıdır.

    Dâhili üye sınıflar, tek başlarına bağımsız sınıflar gibi düşünülebilir. Örnek üzerinde incelersek,

    Hesaplama.java

    public class Hesaplama {

    public class Toplama { //Dahili uye sinif
    public int toplamaYap(int a, int b) {
    return a+b ;
    }
    } // class Toplama

    public static void main(String args[]) {
    Hesaplama.Toplama ht = new Hesaplama().new Toplama() ;
    int sonuc = ht.toplamaYap(3,5);
    System.out.println("Sonuc = " + sonuc );
    }
    } // class Hesapla


    Hesaplama sınıfının içerisinde tanımlanmış Toplama sınıfı bir dahili üye sınıfıdır. Hesaplama sınıfı ise çevreleyici sınıftır. Toplama sınıfına ait bir nesne oluşturmak için, önce Hesaplama sınıfına ait bir nesne oluşturmamız gerekir.

    Hesaplama.Toplama ht = new Hesaplama().new Toplama() ;
    ht referansı Toplama dahili üye sınıfı tipindedir; artık bu referansı kullanarak Toplama nesnesine ait toplamaYap() yordamına ulaşabiliriz. Uygulamanın çıktısı aşağıdaki gibdir;
    Sonuc = 8
    Dâhili Üye Sınıflar ve Erişim
    Dâhili üye sınıflara, public, friendly, protected veya private erişim belirleyicileri atanabilir, böylece dâhili üye sınıflarımıza olan erişimi kısıtlamış/açmış oluruz. Dikkat edilmesi gereken diğer bir husus ise bir dâhili üye sınıf private erişim belirleyicisine sahip olsa dahi, çevreleyici sınıf içerisindeki tüm yordamlar tarafından erişilebilir olmasıdır. Bu kısıt ancak başka sınıflar için geçerlidir.

    Hesaplama1.java

    public class Hesaplama1 {
    public class Toplama { // Dahili uye sinif - public
    public int toplamaYap(int a, int b) {
    return a + b ;
    }
    } // class Toplama

    protected class Cikartma { // Dahili uye sinif - protected
    public int cikartmaYap(int a, int b) {
    return a - b ;
    }
    } // class Cikartma

    class Carpma { // Dahili uye sinif - friendly
    public int carpmaYap(int a, int b) {
    return a * b ;
    }
    } // class Carpma

    private class Bolme { // Dahili uye sinif - private
    public int bolmeYap(int a, int b) {
    return a / b ;
    }
    } // class Bolme

    public static void main(String args[]) {
    Hesaplama1.Toplama ht = new Hesaplama1().new Toplama() ;
    Hesaplama1.Cikartma hck = new Hesaplama1().new Cikartma() ;
    Hesaplama1.Carpma hcp = new Hesaplama1().new Carpma() ;
    Hesaplama1.Bolme hb = new Hesaplama1().new Bolme() ;
    int sonuc1 = ht.toplamaYap(10,5);
    int sonuc2 = hck.cikartmaYap(10,5);
    int sonuc3 = hcp.carpmaYap(10,5);
    int sonuc4 = hb.bolmeYap(10,5);
    System.out.println("Toplama Sonuc = " + sonuc1 );
    System.out.println("Cikartma Sonuc = " + sonuc2 );
    System.out.println("Carpma Sonuc = " + sonuc3 );
    System.out.println("Bolme Sonuc = " + sonuc4 );
    }
    } // class Hesaplama


    Hesaplama1 sınıfımızın içerisinde toplam 4 adet dâhili üye sınıf mevcuttur. Public erişim belirleyicisine sahip Toplama dâhili üye sınıfı, protected erişim belirleyicisen sahip Cikartma dâhili üye sınıfı, friendly erişim belirleyicisine sahip Carpma dahili üye sınıfı ve private erişim belirleyicisine sahip Bolme üye dahili sınıfı. Hesaplama1 sınıfı, bu 4 adet dahili üye sınıfın çevreliyici sınıfıdır. Çevreleyici olan Hesaplama1 sınıfının statik olan main() yordamına dikkat edilirse, bu yordamın içerisinde tüm (private dâhil) dâhili üye sınıflara erişilebildiğini görülür. Bunun sebebi, main() yordamı ile tüm dâhili üye sınıfların aynı çevreleyici sınıfın içerisinde olmalarıdır. Uygulamanın çıktısı aşağıdaki gibidir:
    Toplama Sonuc = 15
    Cikartma Sonuc = 5
    Carpma Sonuc = 50
    Bolme Sonuc = 2
    Yukarıdaki örneğin yeni bir versiyonu yazılıp, dahili üye sınıflar ile bunlara ait erişim belirleyicilerin nasıl işe yaradıklarını incelenirse...
    Hesaplama2Kullan.java

    class Hesaplama2 {
    public class Toplama2 { // Dahili uye sinif - public
    public int toplamaYap(int a, int b) {
    return a + b ;
    }
    } // class Toplama2

    protected class Cikartma2 { // Dahili uye sinif - protected
    public int cikartmaYap(int a, int b) {
    return a - b ;
    }
    } // class Cikartma2

    class Carpma2 { // Dahili uye sinif - friendly
    public int carpmaYap(int a, int b) {
    return a * b ;
    }
    } // class Carpma2

    private class Bolme2 { // Dahili uye sinif - private
    public int bolmeYap(int a, int b) {
    return a / b ;
    }
    } // class Bolme2

    } // class Hesaplama2

    public class Hesaplama2Kullan {
    public static void main(String args[]) {

    Hesaplama2.Toplama2 ht=new Hesaplama2().new Toplama2() ;
    Hesaplama2.Cikartma2 hck=new Hesaplama2().new Cikartma2() ;
    Hesaplama2.Carpma2 hcp = new Hesaplama2().new Carpma2() ;
    // Hesaplama2.Bolme3 hb = new Hesaplama2().new Bolme2() ;
    // ! Hata !

    int sonuc1 = ht.toplamaYap(10,5);
    int sonuc2 = hck.cikartmaYap(10,5);
    int sonuc3 = hcp.carpmaYap(10,5);
    // int sonuc4 = hb.bolmeYap(10,5); // ! Hata !

    System.out.println("Toplama Sonuc = " + sonuc1 );
    System.out.println("Cikartma Sonuc = " + sonuc2 );
    System.out.println("Carpma Sonuc = " + sonuc3 );
    }
    }


    Hesaplama2 sınıfımız, toplam 4 adet olan dâhili üye sınıflarının çevreleyicisidir. Dâhili üye sınıfları ve onlara ait erişim belirleyicileri incelenirse:

    Toplama2 sınıfı, public erişim belirleyicisine sahip olan dâhili üye sınıfıdır.
    Cikartma2 sınıfı, protected erişim belirleyicisine sahip olan dâhili üye sınıfıdır.
    Carpma2 sınıfı, friendly erişim belirleyicisine sahip olan dâhili üye sınıfıdır.
    Bolme2 sınıfı, private erişim belirleyicisine sahip olan dâhili üye sınıfıdır.
    Hesaplama2Kullan sınıfının statik olan main() yordamının içerisinden, Hesaplama2 sınıfının içerisindeki dahili üye sınıflara erişilebilir mi? Erişilebilir ise hangi erişim belirleyicilerine sahip olan dahili üye sınıflara erişilebilir?
    Normalde bir sınıf private veya protected erişim belirleyicisine sahip olamaz ancak dahili sınıflar private veya protected erişim belirleyicisine sahip olabilir. Hesaplama2Kullan sınıfı, Hesaplama2 sınıfı ile aynı paket içerisinde olduğu için, Hesaplama2Kullan sınıfı, Hesapla2 sınıfının içerisinde tanımlanmış olan public, protected ve friendly erişim belirleyicilerine sahip olan dahili üye sınıflara erişebilir ama private erişim belirleyicisine sahip olan Bolme dahili üye sınıfına erişemez. Uygulamanın çıktısı aşağıdaki gibidir;
    Toplama Sonuc = 15
    Cikartma Sonuc = 5
    Carpma Sonuc = 50
    Dâhili Üye Sınıflar ve Bunları Çevreleyen Sınıflar Arasındaki İlişki
    Dâhili üye sınıflar, içerisinde bulundukları çevreleyici sınıfların tüm alanlarına (statik veya değil private dâhil) ve yordamlarına (statik veya değil-private dâhil) erişebilirler.
    Hesaplama3.java

    public class Hesaplama3 {
    private int sabit1 = 2 ;
    private static int sabit2 = 1 ;

    public class Toplama3 { //Uye dahili sinif
    public int toplamaYap(int a, int b) {
    return (a+b) + sabit1 ; // dikkat
    }
    } // class Toplama3

    public class Cikartma3 { //Uye dahili sinif
    public int cikartmaYap(int a, int b) {
    dekontBilgileriGoster(); // dikkat
    return (a-b) - sabit2 ; // dikkat
    }
    } // class Cikartma3

    private void dekontBilgileriGoster() {
    System.out.println("Dekont Bilgileri Gosteriliyor");
    }

    public void ekranaBas(int a , int b ) {
    int sonuc = new Toplama3().toplamaYap(a,b);
    System.out.println("Sonuc = " + a + " + " + b + " + sabit1 = "+ sonuc);
    }

    public static void main(String args[]) {

    Hesaplama3 h3 = new Hesaplama3();
    h3.ekranaBas(10,5);

    // Toplama islemi
    Hesaplama3.Toplama3 ht3 = h3.new Toplama3() ;
    int sonuc = ht3.toplamaYap(11,6);
    System.out.println("Sonuc = 11 + 6 + sabit1 = " + sonuc );

    // Cikartma islemi
    Hesaplama3.Cikartma3 hc3 = h3.new Cikartma3();
    int sonuc1 = hc3.cikartmaYap(10,5);
    System.out.println("Sonuc = 10 - 5 - sabit2 = " + sonuc1);
    }
    } // class Hesaplama3


    Hesaplama3 sınıfının içerisinde iki adet dâhili üye sınıf bulunmaktadır. Bunlar Toplama3 ve Cikartma3 sınıflarıdır. Toplama3 dahili üye sınıfı, Hesaplama3 sınıfı içerisinde global olarak tanımlanmış ilkel (primitive) int tipindeki ve private erişim belirleyicisine sahip olan sabit1 alanına erişebilmektedir. Toplama3 dahili üye sınıfı, Hesaplama3 sınıfı içerisinde tanımlanmış olan sabit1 alanını kullanırken sanki kendi içerisinde tanımlanmış bir alanmış gibi, hiç bir belirteç kullanmamaktadır.

    Aynı şekilde Cikartma3 dâhili üye sınıfı, Hesaplama3 sınıfının içerisinde statik olarak tanımlanmış, private erişim belirleyicisine sahip ilkel int tipindeki sabit2 alanını ve private erişim belirleyicisine sahip dekontBilgileriGoster() yordamına direk olarak erişebilmektedir.

    Hesaplama3 sınıfının, nesne yordamı olan (-bu yordamın kullanılabilmesi için Hesaplama3 sınıfına ait bir nesne oluşturmak gerekir) ekranaBas(), iki adet parametre alıp, geriye hiçbirşey döndürmez (void). Bu yordamın içerinde Toplama3 dahili üye sınıfına ait nesne oluşturularak, bu dahili üye sınıfın toplamaYap() yordamı çağrılmaktadır. Toplama3 dâhili üye sınıfının toplamaYap() yordamından dönen cevap, ekranaBas() yordamının içerisinde ekrana bastırılır.

    Dikkat edilmeye değer diğer bir husus ise sadece bir adet çevreleyici sınıfa ait nesne oluşturup, Bu nesneye bağlı referansı kullanarak, çevreleyici sınıf içerisindeki diğer dâhili üye sınıflara ait nesnelerin oluşturulmasıdır. Olaylara daha yakından bakılırsa;

    Hesaplama3 h3 = new Hesaplama3();
    Hesaplama3.Toplama3 ht3 = h3.new Toplama3() ;
    Hesaplama3.Cikartma3 hc3 = h3.new Cikartma3();

    Sadece bir adet Hesaplama3 sınıfına ait nesne oluşturuldu. Bu nesneye bağlı referansı kullanarak (h3), diğer dâhili üye sınıflara ait nesneler oluşturulabilir. Buradaki ana fikir, çevreleyici sınıfların içerisinde bulunan her dâhili üye sınıfa ait bir nesne oluşturmak için, her seferinde yeni bir çevreleyici sınıfa ait nesne oluşturma zorunluluğu olmadığıdır. Yani çevreleyici sınıfa ait bir nesne, yine çevreleyici sınıf tipindeki bir referansa bağlanırsa, işler daha kestirmeden çözülebilir. Uygulamanın çıktısı aşağıdaki gibidir;
    Sonuc = 10 + 5 + sabit1 = 17
    Sonuc = 11 + 6 + sabit1 = 19
    Dekont Bilgileri Gosteriliyor
    Sonuc = 10 – 5 - sabit2 = 4
    Statik Dâhili Üye Sınıflar
    Statik (static) olarak tanımlanmış dâhili üye sınıflar, normal dahili üye sınıflardan farklıdırlar. Bu farklılıklar şöyledir:
    Statik dâhili üye sınıfına ait nesne oluşturmak için, onu çevreleyen sınıfa ait bir nesne oluşmak zorunda değilizdir)
    Statik dâhili üye sınıflar, kendilerini çevreleyen sınıfa ait bağlantıyı (-this-) kaybederler.
    Statik dahili üye sınıflar, onları çevreleyen üst sınıfa ait global alanlara (statik veya değil) ve yordamlara (statik veya değil) direk ulaşım şansını kaybeder. Bunun sebebi, kendisini çevreleyen sınıf ile arasındaki bağı kopartmış olmasıdır. Buraya kadar ifade edilenleri örnek üzerinde inceleyelim, ama öncesinde UML diyagramı çizilirse...
    [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif[/IMG]

    Hesaplama4 sınıfının içerisinde, 2 adet dâhili üye sınıf oluşturulacaktır; fakat bu dâhili üye sınıflardan biri statik olarak tanımlanacaktır. Bu örnekte statik tanımlanacak olan dâhili üye sınıf, Toplama4 sınıfıdır. Toplama4 sınıfına ait bir nesne oluşturulmak istenirse, bunun hemen öncesinde Hesaplama4 sınıfına ait bir nesne oluşturulmaz. UML diyagramı Java uygulamasına dönüştürülürse...
    Hesaplama4.java

    public class Hesaplama4 {

    int sabit = 2;
    private int ozelsabit = 1 ;
    public static class Toplama4 { // Statik uye dahili sinif
    static int toplam ; // dogru
    int sonuc ; // dogru
    public int toplamaYap(int a, int b) {
    // return (a+b) + sabit ; ! Hata !
    sonuc = toplam = a+b;
    return sonuc;
    }

    public void dekontOlustur() {
    /* -sabit- alanina ve
    -ekranaBas() yordamına ulasabilmek icin
    Hesaplama4 sinifina ait nesne olusturmamiz gerekir.
    */
    Hesaplama4 hs4 = new Hesaplama4(); //dikkat
    int a = hs4.ozelsabit ; // dogru
    hs4.ekranaBas() ; //dogru
    System.out.println("Dekont olusturuyor = " +
    hs4.sabit + " - " +a );
    }
    } // class Toplama4

    public class Cikartma4 { //Uye dahili sinif

    int sonuc ;
    // static int sonuc1 ; // ! hata!
    public int cikartmaYap(int a, int b) {
    ekranaBas(); // dikkat
    sonuc = (a-b) - ozelsabit;
    return sonuc ; // dikkat
    }
    } // class Cikartma4

    private void ekranaBas() {
    System.out.println("Hesaplama4.ekranaBas()");
    }

    public static void main(String args[]) {

    // ! Hata !
    // Hesaplama4.Toplama4 ht=new Hesaplama4().new Toplama4();
    Toplama4 tp4 = new Toplama4();
    tp4.dekontOlustur();
    int sonuc = tp4.toplamaYap(10,5);
    System.out.println("Sonuc = 10 + 5 = " + sonuc );
    }

    } // class Hesaplama4

    class Hesaplama4Kullan {
    public static void main(String args[]) {

    // ! Hata!
    // Hesaplama4.Toplama4 ht=new Hesaplama4().new Toplama4() ;
    Hesaplama4.Toplama4 tp4 = new Hesaplama4.Toplama4();
    int sonuc = tp4.toplamaYap(10,5);
    System.out.println("Sonuc = 10 + 5 = " + sonuc );
    }

    } // class Hesaplama4Kullan


    Statik dâhili üye sınıf olan Toplama4 sınıfını yakın takibe alıp, neleri nasıl yaptığını inceleyelim. Toplama4 statik dahili sınıfının içerisinde statik global alan tanımlayabiliriz. Statik olmayan dahili üye sınıfların içerisinde statik global alan tanımlanamaz.

    Toplama4 statik dahili üye sınıfının, toplamaYap() yordamının içerisinde, Hesaplama4 sınıfına ait global olarak tanımlamış ilkel (primitive) int tipindeki sabit alanına direk erişilemez. Statik dâhili üye sınıflar ile bunları çevreleyen sınıflar arasında this bağlantısı yoktur. Eğer statik dâhili üye sınıfın içerisinden, onu çevreleyen sınıfa ait bir alan (statik olmayan) veya yordam (statik olmayan) çağrılmak isteniyorsa, bu bizzat ifade edilmelidir. Aynı Toplama4 statik dâhili üye sınıfına ait dekontOlustur() yordamının içerisinde yapıldığı gibidir.

    dekontOlustur() yordamının içerisinde, Hesaplama4 sınıfına ait nesne oluşturulmadan, sabit, ozelsabit alanlarına ve ekranaBas() yordamına ulaşamazdık. Buradaki önemli nokta, dâhili üye sınıf statik olsa bile, kendisine çevreleyen sınıfın private erişim belirleyicisi sahip olan alanlarına (statik veya değil) ve yordamlarına (statik veya değil) erişebilmesidir.

    Hesaplama4 sınıfının statik olan main() yordamının içerisinde, Toplama4 statik dâhili üye sınıfına ait nesnenin nasıl oluşturulduğuna dikkat edelim. Toplama4 statik dâhili üye sınıfına ait nesne oluştururken, onu çevreleyen sınıfa ait herhangi bir nesne oluşturmak zorunda kalmadık.

    Son olarak Hesaplama4Kullan sınıfında statik olarak tanımlanan main() yordamının içerisindeki olayları inceleyelim. Başka bir sınıfın içerisinde statik dâhili üye sınıfı ulaşmak için, sadece tanımlama açısından, dahili üye sınıfı çevreleyen sınıfın ismi kullanılmıştır. Mantıklı olanda budur, statik de olsa sonuçta ulaşılmak istenen dâhili üye bir sınıfıdır.

    Elimizde iki adet çalıştırılabilir sınıf mevcutur (-main() yordamı olan). Hesaplama4 sınıfını çalıştırdığımızda (java Hesaplama4), sonuç aşağıdaki gibi olur;

    Hesaplama4.ekranaBas()
    Dekont olusturuyor = 2 – 1
    Sonuc = 10 + 5 = 15

    Eğer Hesaplama4Kullan sınıfı çalıştırılırsa (java Hesaplama4Kullan), sonuç aşağıdaki gibi olur;

    Sonuc = 10 + 5 = 15

    Statik Dâhili Üye Sınıflar ve Statik Yordamlar

    Statik dâhili üye sınıfların içerisinde statik alanlar bulunduğu gibi, statik yordamlarda bulunabilir. Eğer statik dâhili üye sınıfı içerisinde, statik bir yordam oluşturulmuş ise, bu yordamı çağırmak için ne statik dâhili üye sınıfına ne de onu çevreleyen sınıfa ait herhangi bir nesne oluşturmak gerekmez.

    Hesaplama5.java

    public class Hesaplama5 {
    private static int x = 3 ;

    public static class Toplama5 { // Statik uye dahili sinif
    static int toplam ; // dogru
    int sonuc ; // dogru
    public static int toplamaYap(int a, int b) {
    // sonuc = a+b + x ; // ! Hata !
    toplam = a + b + x;
    return toplam;
    }
    } // class Toplama5

    public static void main(String args[]) {
    int sonuc = Hesaplama5.Toplama5.toplamaYap(16,8); // dikkat
    System.out.println("Sonuc = 16 + 8 = " + sonuc );
    }
    } // class Hesaplama5


    Toplama5 statik dâhili üye sınıfının, statik olan toplamaYap() yordamından, Hesaplama5 çevreleyici sınıfına ait ilkel (primitive) int tipinde tanımlanmış x alanına ulaşılabilir. Bunun sebebi x alanında statik olarak tanımlanmış olmasıdır. main() yordamının içerisinde, toplamaYap() yordamının çağrılışına dikkat edilirse, ne Hesaplama5 sınıfına ait nesne, ne de Toplama5 statik dâhili üye sınıfına ait bir nesnenin oluşturulmadığı görülür. Uygulamanın çıktısı aşağıdaki gibidir;

    Sonuc = 16 + 8 = 27

    Statik ve Final Alanlar

    Statik olmayan dâhili üye sınıfların içerisinde, statik alanlar ve yordamlar tanımlanamaz; ama "statik ve final" alanlar tanımlanabilir. Bir alanın hem statik hem de final olması demek, onun SABİT olması anlamına geldiği için, Statik olmayan dâhili üye sınıfların içerisinde statik ve final alanlar kullanılabilir.

    StatikFinal.java

    class CevreliyiciSinif1 {

    class DahiliSinif1 { // Dahili uye siniflar
    // static int x = 10 ; // ! Hata !
    }
    }
    // Dogru
    class CevreliyiciSinif2 {

    class DahiliSinif2 {
    int x; // Dogru
    }
    }
    // Dogru
    class CevreliyiciSinif3 {

    class DahiliSinif3 {
    static final int x = 0; // Dogru
    }
    }


    Dâhili Üye Sınıflar ve Yapılandırıcılar (Constructors)

    Dâhili üye sınıfların yapılandırıcıları olabilir.

    BuyukA.java

    public class BuyukA {

    public class B {
    public B() { // yapilandirici
    System.out.println("Ben B sinifi ");
    }
    } // class B

    public BuyukA() {
    System.out.println("Ben BuyukA sinifi ");
    }

    public static void main(String args[]) {
    BuyukA ba = new BuyukA();
    }
    }


    Dâhili üye sınıfını çevreleyen sınıfa ait bir nesne oluşturulduğu zaman, dâhili üye sınıfına ait bir nesne otomatik oluşturulmaz. Yukarıdaki örneğimizde sadece BuyukA sınıfına ait bir nesne oluşturulmuştur ve bu yüzden sadece BuyukA sınıfına ait yapılandırıcı çağrılacaktır. Eğer dahili üye sınıf olan B sınıfına ait yapılandırıcının çağrılmasını isteseydik, main() yordamının içerisine : " BuyukA.newB() " dememiz gerekirdi.

    İç içe Dâhili Üye Sınıflar

    Bir sınıfın içerisinde dâhili üye sınıf tanımlayabilirsiniz. Tanımlanan bu dâhili üye sınıfın içerisinde, yine bir dâhili üye sınıf tanımlayabilirsiniz... Bu böyle sürüp gidebilir...

    Abc.java

    public class Abc {

    public Abc() { // Yapilandirici
    System.out.println("Abc nesnesi olusturuluyor");
    }

    public class Def {
    public Def() { // Yapilandirici
    System.out.println("Def nesnesi olusturuluyor");
    }

    public class Ghi {
    public Ghi() { // Yapilandirici
    System.out.println("Ghi nesnesi olusturuluyor");
    }

    } // class Ghi

    } //class Def

    public static void main( String args[] ) {
    Abc.Def.Ghi ici_ice = new Abc().new Def().new Ghi();
    }

    } // class Abc


    Bu örnekte iç içe geçmiş üç adet sınıf vardır. Uygulamanın çıktısı aşağıdaki gibi olur:

    Abc nesnesi olusturuluyor
    Def nesnesi olusturuluyor
    Ghi nesnesi olusturuluyor

    Soyut (Abstract) Dâhili Üye Sınıflar

    Dâhili üye sınıflar, soyut (abstract) sınıf olarak tanımlanabilir. Bu soyut dâhili üye sınıflardan türeyen sınıflar, soyut dâhili üye sınıfların içerisindeki gövdesiz (soyut) yordamları iptal etmeleri gerekmektedir. Örneğimize geçmeden evvel, UML diyagramını inceleyelim.

    [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image002.gif[/IMG]
    Hayvan sınıfının içerisinde soyut (abstract) dâhili üye sınıf olarak tanımlanmış Kus sınıfı iki adet gövdesiz (soyut-abstract) yordamı olsun, uc() ve kon(). Kartal sınıfı, soyut dâhili üye sınıf olan Kus sınıfından türetilebilir.

    HayvanKartal.java

    class Hayvan {

    abstract class Kus {
    public abstract void uc ();
    public abstract void kon();
    }

    public void avlan() {
    System.out.println("Hayvan avlaniyor...");
    }
    }

    class Kartal extends Hayvan.Kus {
    public void uc() {
    System.out.println("Kartal Ucuyor...");
    }
    public void kon() {
    System.out.println("Kartal Konuyor...");
    }

    // public Kartal() { } // ! Hata !

    public Kartal(Hayvan hv) {
    hv.super(); //Dikkat
    }

    public static void main(String args[]) {
    Hayvan h = new Hayvan(); //Dikkat
    Kartal k = new Kartal(h);
    k.uc();
    k.kon();
    }
    }


    Kartal sınıfının içerisinde, soyut dahili üye sınıf olan Kus sınıfının, gövdesiz olan iki yordamı iptal edilmiştir. Olayları sırası ile inceleyelim, Kartal sınıfına ait bir nesne oluşturulmak istense bunun öncesinde Kus sınıfına ait bir nesnenin oluşturulması gerekir çünkü Kartal sınıfı Kus sınıfından türetilmiştir. Buraya kadar sorun yok, fakat asıl kritik nokta Kus sınıfının dâhili üye sınıf olmasıdır. Daha açık bir ifade ile, eğer Kus sınıfına ait bir nesne oluşturulacaksa, bunun öncesinde elimizde Kus sınıfının çevreleyici sınıfı olan Hayvan sınıfına ait bir nesne bulunması zorunluluğudur. Kus sınıfı statik dahili üye sınıf olmadığından, Hayvan sınıfına bağımlıdır. Uygulamanın çıktısı aşağıdaki gibidir;

    Kartal Ucuyor...
    Kartal Konuyor...

    Kartal sınıfının statik olarak tanımlanmış main() yordamının içerisine dikkat edersek, önce Hayvan sınıfına ait bir nesne sonrada Kartal sınıfına ait bir nesne oluşturduk. Daha sonra Hayvan sınıfı tipinde parametre kabul eden, Kartal sınıfının yapılandırıcısına, bu referansı pasladık. Kartal sınıfına ait yapılandırıcının içerisinde super() anahtar kelimesi ile Hayvan sınıfının varsayılan yapılandırıcısını çağrılmıştır.

    CevreliyiciSinif.super() ;

    Eğer Kus sınıfı, statik dâhili üye sınıfı yapılsaydı, super() anahtar kelimesini kullanılmak zorunda değildi. Bunun sebebi, statik olan dâhili üye sınıfların onları çevreleyen sınıflara bağımlı olmamasıdır. Yukarıdaki örnek bu anlatılanlar ışığında tekrardan yazılırsa.

    HayvanKartal1.java

    class Hayvan1 {

    static abstract class Kus1 {
    public abstract void uc ();
    public abstract void kon();
    }

    public void avlan() {
    System.out.println("Hayvan avlaniyor...");
    }
    }

    class Kartal1 extends Hayvan1.Kus1 {
    public void uc() {
    System.out.println("Kartal1 Ucuyor...");
    }
    public void kon() {
    System.out.println("Kartal1 Konuyor...");
    }

    public Kartal1() { } // dogru

    public static void main(String args[]) {
    Kartal1 k1 = new Kartal1();
    k1.uc();
    k1.kon();
    }
    }


    Yukarıdaki örneğimizden görüldüğü üzere, artık Kus sınıfına ait bir nesne oluşturmak istersek, bunun hemen öncesinde Hayvan sınıfına ait bir nesne oluşturmak zorunda değilizdir. Bunun sebebi, Kus sınıfının statik dâhili üye sınıfı olmasından kaynaklanır. Uygulamanın çıktısı aşağıdaki gibidir;

    Kartal1 Ucuyor...
    Kartal1 Konuyor...
    Türetilebilen Dâhili Üye Sınıflar

    Dâhili üye sınıflar, aynı normal sınıflar gibi başka sınıflardan türetilebilirler. Böylece diğer dillerde olan çoklu kalıtım desteğinin bir benzerini Java programlama dilinde de bulabiliriz. Dâhili sınıfların varoluş sebeplerini biraz sonra detaylı bir şekilde inceleyeceğiz. Örneğimize geçmeden evvel, UML diyagramımızı inceleyelim;

    [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image003.gif[/IMG]
    Dâhili üye sınıf olan SuperMotor sınıfı, Motor sınıfından türetilmiştir. UML diyagramını Java uygulamasını dönüştürüp, olayları daha somut bir şekilde incelersek.

    YarisArabasi.java

    class Motor {
    public void calis() {
    System.out.println("Motor Calisiyor");
    }
    public void dur() {
    System.out.println("Motor Durdu");
    }
    }

    public class YarisArabasi {
    public void hizYap() {
    System.out.println("YarisArabasi hiz yapiyor");
    }
    public class SuperMotor extends Motor {
    public void calis() { // iptal etti (override)
    System.out.println("SuperMotor Calisiyor");
    }
    public void dur() { // iptal etti (override)
    System.out.println("SuperMotor Durdu");
    }
    }
    }


    Dâhili üye sınıflar, başka sınıflardan türetilebildiği gibi arayüzlere erişip, bunların içlerindeki gövdesiz yordamları iptal edebilir, aynı normal sınıflar gibi...

    Yerel Sınıflar (Local Classes)

    Yerel sınıflar, yapılandırıcıların (constructor), sınıf yordamlarının (statik yordam), nesne yordamların, statik alanlara toplu değer vermek için kullandığımız statik bloğun veya statik olmayan alanlara toplu değer vermek için kullandığımız bloğun içerisinde tanımlanabilir. Yerel sınıfların genel gösterimi aşağıdaki gibidir;

    public class Sinif {
    public void yordam() {
    public class YerelSinif {
    //...
    }
    }
    }


    Yerel sınıflar, yalnızca içinde tanımlandıkları, yordamın veya bloğun içerisinde geçerlidir. Nasıl ki dâhili üye sınıfların çevreleyici sınıfları vardı, yerel sınıfların ise çevreleyici yordamları veya blokları vardır. Yerel sınıflar tanımlandıkları bu yordamların veya blokların dışarısından erişilemezler. Yerel sınıflara ait ilk özellikleri verelim;

    Yerel sınıflar tanımlandıkları yordamın veya bloğun dışından erişilemezler.
    Yerel sınıflar başka sınıflardan türetilebilir veya arayüzlere (interface) erişebilir.
    Yerel sınıfların yapılandırıcıları olabilir.

    Yukarıdaki özelikleri Java uygulamasında ispatlanırsa;

    Hesaplama6.java

    interface Toplayici {
    public int hesaplamaYap() ;
    }

    public class Hesaplama6 {

    public int topla(int a, int b) {
    class Toplama6 implements Toplayici {
    private int deger1;
    private int deger2;
    public Toplama6(int deger1, int deger2) { // yapilandirici
    this.deger1 = deger1;
    this.deger2 = deger2;
    }

    public int hesaplamaYap() { // iptal etti (override)
    return deger1+deger2;
    }

    } // class Toplama6

    Toplama6 t6 = new Toplama6(a,b);
    return t6.hesaplamaYap();
    }

    public void ekranaBas() {
    // Toplama6 t6 = new Toplama6(2,6,); // !Hata!-Kapsama alanının dışı
    }

    public static void main(String args[]) {
    Hesaplama6 h6 = new Hesaplama6();
    int sonuc = h6.topla(5,9);
    System.out.println("Sonuc = 5 + 9 = " + sonuc );
    }
    } // class Hesaplama6


    Bu örneğimizde Toplama6 yerel sınıftır. Yerel bir sınıf, başka bir sınıftan türetilebilir veya bir arayüze erişip, onun gövdesiz yordamlarını iptal edebilir, aynı normal sınıflar gibi. Toplama6 yerel sınıfı, Hesapliyici arayüzüne eriştiğinden, bu arayüzün gövdesiz yordamı olan hesaplamaYap() yordamını iptal etmek zorundadır. Toplama6 yerel sınıfı, Hesaplama6 sınıfının topla() yordamının içerisinde tanımlanmıştır. Bunun anlamı, Toplama6 yerel sınıfına yalnızca topla() yordamının içerisinde erişilebileceğidir. Hesaplama6 sınıfının nesne yordamı olan (bu yordama ulaşmak için Hesaplama6 sınıfına ait nesne oluşturmamız gerektiği anlamında...) ekranaBas() yordamının içerisinden, Toplama6 yerel sınıfına ulaşılamaz çünkü Toplama6 yerel sınıfı, ekranaBas() yordamının kapsama alanının dışında kalmaktadır. Uygulamamızın çıktısı aşağıdaki gibi olur;

    Sonuc = 5 + 9 = 14

    Yerel sınıflara diğer özellikler aşağıdaki gibidir;

    Yerel sınıflar, içinde bulundukları yordamın sadece final olan değişkenlerine ulaşabilirler.
    Yerel sınıflar, statik veya statik olmayan yordamların içerisinde tanımlanabilirler.
    Yerel sınıflar, private, protected ve public erişim belirleyicisine sahip olamazlar sadece friendly erişim belirleyicisine sahip olabilirler.
    Yerel sınıflar, statik olarak tanımlanamaz.

    Yukarıdaki kuralları, bir örnek üzerinde uygularsak...

    Hesaplama7.java

    public class Hesaplama7 {
    public static int topla(int a, final int b) {
    int a_yedek = a ;
    class Toplama7 {
    private int x ; // dogru
    public int y ; // dogru
    // protected int z = a_yedek ; // ! Hata !
    int p ; // dogru
    public int degerDondur() {
    // int degera = a ; // Hata
    int degerb = b ;
    return b;
    }
    } // class Toplama7

    Toplama7 t7 = new Toplama7();
    return t7.degerDondur();
    }

    public void ekranaBas() {

    /* yerel siniflar sadece friendly erisim
    belirleyicisine sahip olabilirler

    public class Toplama8 {
    public void test() {}
    } // class Toplama8

    */
    } // ekranaBas

    public void hesaplamaYap() {

    /* yerel sinif sadece friendly erisim
    Belirleyicisine sahip olabilirler

    static class Toplama9 {
    public void abcd() {
    }
    } // class Toplama9

    */
    } // hesaplamaYap

    public static void main(String args[]) {

    int sonuc = Hesaplama7.topla(5,9);
    System.out.println("Sonuc " + sonuc );
    }
    } // class Hesaplama7


    Toplama7 yerel sınıfı, Hesaplama7 sınıfının, statik olan topla() yordamının içerisinde tanımlanmıştır ve sadece topla() yordamının içerisinde geçerlidir. Toplama7 yerel sınıfı, topla() yordamının içerisindeki final özelliğine sahip olan yerel değişkenlere erişip onları kullanabilir. Bu sebepten dolayı, ilkel (primitive) int tipinde tanımlanmış olan a ve a_yedek yerel değişkenlerine Toplama7 yerel sınıfının içerisinden erişilemez, bu bir hatadır.

    Hesaplama7 sınıfının, nesne yordamı olan ekranaBas() içerisinde tanımlanmış olan Toplama8 yerel sınıfı hatalıdır. Hatanın sebebi Toplama8 yerel sınıfının public erişim belirleyicisine sahip olmasıdır. Yukarıda belirtildiği üzere, yerel sınıflar ancak friendly erişim belirleyicisine sahip olabilir.

    Aynı şekilde Hesaplama7 sınıfının, nesne yordamı olan hesaplamaYap() içerisinde tanımlanmış olan Toplama9 yerel sınıfı hatalıdır. Bu hatanın sebebi, Toplama9 yerel sınıfının statik yapılmaya çalışılmasıdır. Az evvel belirtildiği gibi, yerel yordamlar, statik olarak tanımlanamazlardı. Uygulamanın çıktısı aşağıdaki gibidir;


    Sonuc 9

    İsimsiz Sınıflar (Anonymous Classes)

    İsimsiz sınıflar, isimsiz ifade edilebilen sınıflardır. İsimsiz sınıflar havada oluşturulabildiklerinden dolayı birçok işlem için çok avantajlıdır, özellikle olay dinleyicilerin (event listeners) devreye sokulduğu uygulamalarda sıkça kullanılırlar. İsimsiz sınıfların özellikleri aşağıdaki gibidir;

    Diğer dâhili sınıf çeşitlerinde olduğu gibi, isimsiz sınıflar direk extends ve implements anahtar kelimelerini kullanarak, diğer sınıflardan türetilemez ve arayüzlere erişemez.
    İsimsiz sınıfların herhangi bir ismi olmadığı için, yapılandırıcısında (constructor) olamaz.

    Yukarıdaki kuralları, bir örnek üzerinde uygularsak...

    HEsaplama8.java


    interface Toplayici {
    public int hesaplamaYap() ;
    }

    public class Hesaplama8 {

    public Toplayici topla(final int a, final int b) {
    return new Toplayici() {
    public int hesaplamaYap() {

    // final olan yerel degiskenlere ulasabilir.
    return a + b ;
    }
    }; // noktali virgul sart

    } // topla, yordam sonu


    public static void main(String args[]) {

    Hesaplama8 h8 = new Hesaplama8();
    Toplayici t = h8.topla(5,9);
    int sonuc = t.hesaplamaYap();
    System.out.println("Sonuc = 5 + 9 = " + sonuc );
    }
    } // class Hesaplama8


    Hesaplama8 sınıfının, topla() yordamı Toplayici arayüzü tipindeki nesneye bağlı bir referans geri döndürmektedir. Toplayici arayüzü tipindeki nesneye bağlı bir referans geri döndürmek demek, Toplayici arayüzüne erişip onun gövdesiz olan yordamlarını iptal eden bir sınıf tipinde nesne oluşturmak demektir. Sonuçta bir arayüze ulaşan sınıf, ulaştığı arayüz tipinde olan bir referansa bağlanabilirdi. " Buraya kadar tamam ama isimsiz sınıfımız nerede... diyebilirsiniz. Olaylara daha yakından bakılırsa;

    return new Toplayici() {
    public int hesaplamaYap() {

    // final olan yerel degiskenlere ulasabilir.
    return a + b ;
    }
    }; // noktali virgul sart


    İşte isimsiz sınıfımız !!. Yukarıdaki ifade yerine, topla() yordamın içerisinde yerel bir sınıf da yazılabilirdi.

    public Toplayici topla(final int a, final int b) {
    public class BenimToplayicim implements Toplayici {
    public int hesaplamaYap() {

    // final olan yerel degiskenlere ulasabilir.
    return a + b ;
    }
    } // yordam sonu
    return new BenimToplayicim();
    }


    İsimsiz sınıfları, yerel sınıfların kısaltılmışı gibi düşünebilirsiniz. Yerel sınıflarda return new BenimToplayicim() yerine, isimsiz sınıflarda hangi sınıf tipinde değer döndürüleceği en başta belirtilir.

    return new Toplayici() { ....
    ...
    };


    İsimsiz sınıflarda, yerel sınıflar gibi içinde bulundukları yordamın sadece final olarak tanımlanmış yerel değişkenlerine erişebilirler.

    Yukarıdaki örneğimizde, isimsiz sınıfımız, Toplayici arayüzüne erişip onun gövdesiz sınıflarını iptal etmiştir, buraya kadar her şey normal. Peki eğer isimsiz sınıfımız, yapılandırıcısı parametre olan bir sınıftan türetilseydi nasıl olacaktı? Belirtildiği üzere isimsiz sınıfların yapılandırıcısı olamaz.

    Hesaplama9.java

    abstract class BuyukToplayici {
    private int deger ;
    public BuyukToplayici(int x) {
    deger = x;
    }
    public int degerDondur() {
    return deger;
    }
    public abstract int hesaplamaYap() ; // iptal edilmesi gerek
    }

    public class Hesaplama9 {
    public BuyukToplayici degerGoster( int gonderilen ) {
    return new BuyukToplayici( gonderilen ) {
    public int hesaplamaYap() { //iptal etti (override)
    return super.degerDondur() + 5 ;
    }
    }; // noktali virgul sart
    } // degerGoster, yordam sonu

    public static void main(String args[]) {

    Hesaplama9 h9 = new Hesaplama9();
    BuyukToplayici bt = h9.degerGoster(5);
    int sonuc = bt.hesaplamaYap();
    System.out.println("Sonuc = " + sonuc );
    }
    } // class Hesaplama9


    BuyukToplayici sınıfı soyuttur, bunun anlamı bu sınıfın içerisinde en az bir tane gövdesiz yordam olduğudur. BuyukToplayici sınıfının içerisindeki hesaplamaYap() gövdesiz yordamını, BuyukToplayici sınıfından türetilen alt sınıflar tarafından iptal edilmek zorundadır.

    Bu örneğimizde ilginç olan iki nokta vardır. Birincisi, isimsiz bir sınıfın, soyut bir yordam dan türetilmesi, ikincisi ise türetilme yapılan BuyukToplayici sınıfına ait yapılandırıcısının parametre almasıdır. İsimsiz sınıfımızın yapılandırıcısı olamayacağından dolayı, BuyukToplayici sınıfına ait parametre alan yapılandırıcıyı burada çağıramayız. Bu işlemi BuyukToplayici sınıfından türetilen isimsiz sınıfımızı oluştururken yapmalıyız.

    İsimsiz sınıfların içerisinde, onları çevreleyen yordamların final olmayan yerel değişkenleri kullanılamaz. “Peki, ama bu örnekte kullanılıyor...” diyebilirsiniz.

    public BuyukToplayici degerGoster( int gonderilen ) {
    return new BuyukToplayici( gonderilen ) {
    public int hesaplamaYap() { //iptal etti (override)
    return super.degerDondur() + 5 ;
    }
    }; // noktali virgul sart

    } // degerGoster, yordam sonu


    İlkel int tipinde tanımlanmış gonderilen yerel değişkeni, degerGoster() yordamına aittir, isimsiz sınıfımızın içerisinde kullanılmamıştır. return new BuyukToplayici(gonderilen) ifadesi, degerGoster() yordamına dahil olduğundan bir sorun çıkmaz. Eğer uygulamamızı çalıştırırsak, ekran çıktısı aşağıdaki gibi olacaktır.
    Sonuc = 10

    Fiziksel İfade

    İçerisinde Java kodları olan fiziksel bir dosya derlendiği (compile) zaman, bu fiziksel dosya içerisinde tanımlanmış her bir sınıf için, fiziksel bir .class dosyası oluşturulur. Peki olaylar dâhili sınıflar içinde aynı mıdır? Her bir dahili sınıf için, bir fiziksel .class dosyası oluşturulur mu? Eğer oluşturuluyorsa ismi ne olur?

    Her bir dahili sınıf için (3 çeşit dahili sınıf içinde geçerli) fiziksel .class dosyası oluşturulur. Bu .class dosyasının ismi ise, çevreleyen sınıfın ismi + $ + dahili sınıfın ismi şeklindedir. Hesaplama1.java örneğimizden bir gösterim yaparsak;

    Hesaplama1$1.class
    Hesaplama1$Bolme.class
    Hesaplama1$Carpma.class
    Hesaplama1$Cikartma.class
    Hesaplama1$Toplama.class
    Hesaplama1.class


    Hesaplama1 sınıfı, Bolme, Carpma, Cikartma ve Toplama sınıflarının çevreliyici sınıfıdır, böyle olunca dahili sınıflarımıza ait .class dosyasının ismi de ÇevreliyiciSınıf$DahiliSınıf biçiminde olduğunu görürüz.

    Java, Hesaplama9.java örneğimizdeki isimsiz sınıf için nasıl bir .class dosyası oluşturur? Cevabı hemen aşağıdadır;

    Hesaplama9$1.class
    Hesaplama9.class


    Java, Hesaplama9.java içerisinde belirtilmiş isimsiz sınıfa ait .class dosyası oluştururken isim olarak 1 (bir) kullanmıştır. Eğer aynı çevreliyici sınıf içerisinde iki adet isimsiz sınıf olsaydı, bu isimsiz sınıfların ismi 1 ve 2 olacaktı.

    Hesaplama9$1.class
    Hesaplama9$2.class
    Hesaplama9.class


    Neden Dâhili sınıflar?

    Dâhili üye sınıflar, yerel sınıflar, isimsiz sınıflar hepsi çok güzel ama Java programlama dili neden bunlara ihtiyaç duymuş olabilir? Şimdiye kadar normal sınıflarımızla güzel güzel idare edebiliyorduk diyebilirsiniz. Dâhili sınıfların var olmasındaki neden çoklu kalıtıma (multiple inheritance) tam desteği sağlamaktır.

    Arayüzler ile çoklu kalıtım desteğini kısmen bulabiliyorduk ama bu tam değildi. Tam değildi çünkü bir sınıf iki normal sınıftan türetilemiyordu, bunun sakıncalarını tartışmıştık. Fakat bazı zamanlarda, arayüzler dışında, normal sınıflara ihtiyaç duyabiliriz. Normal sınıflar derken, soyut olmayan, problem çözmek için tasarlanmış işleyen sınıflardan bahsediyorum. Bu işleyen sınıfların iki tanesine aynı anda ulaşıp türetme yapılmıyorduk ama bu isteğimize artık dâhili sınıflar ile ulaşabiliriz.

    Java, dâhili sınıflar ile çoklu kalıtım olan desteğini güvenli bir şekilde sağlamaktadır. Dâhili sınıflar, kendilerini çevreleyen sınıfların hangi sınıftan türetildiğine bakmaksızın bağımsız şekilde ayrı sınıflardan türetilebilir veya başka arayüzlere erişebilir.

    Örnek Java kodumuzu incelemeden evvel, UML diyagrama bir göz atalım.

    [IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image004.gif[/IMG]
    UML diyagramından olayları kuş bakışı görebiliyoruz. AnaSinif sınıfından türetilmiş TüretilmisSinif sınıfının içerisinde iki adet dâhili üye sınıf bulunmaktadır. Dâhili üye sınıf olan BB ve CC sınıfları da, B ve C sınıflarından türetilmişlerdir. Bu örneğimizdeki ana fikir, bir sınıfın içerisinde dâhili üye sınıflar kullanılarak çoklu kalıtımın güvenli bir şekilde yapılabildiğini göstermektir. UML diyagramını Java uygulamasına dönüştürürsek;

    TuretilmisSinif.java

    class AnaSinif {
    public void ekranaBas(String deger) {
    System.out.println( deger );
    }
    }

    class B {
    public String degerDondur() {
    return "B";
    }
    }

    class C {
    public int topla(int a , int b) {
    return a+b ;
    }
    }

    public class TuretilmisSinif extends AnaSinif {

    public class BB extends B {
    public BB() { // yapılandırıcı
    ekranaBas( "Sonuc = " + degerDondur() );
    }

    }

    public class CC extends C {
    public CC( int a , int b ) { // yapılandırıcı
    ekranaBas("Sonuc = " + topla(a,b) );
    }
    }

    public static void main( String args[] ) {
    TuretilmisSinif.BB tbb= new TuretilmisSinif().new BB();
    TuretilmisSinif.CC tcc= new TuretilmisSinif().new CC(6, 9);

    }
    }


    TuretilmisSinif sınıfımız, AnaSinif sınıfından türetilmiştir fakat bu dâhili sınıfların başka sınıflardan türetilmelerine engel teşkil etmez. Her bir dâhili sınıfın kendine ait bir durumu olabilir. Dâhili sınıflar kendilerini çevreleyen sınıflardan bağımsızdır. Dâhili sınıflar ile onları çevreleyen sınıflar arasında kalıtımsal bir ilişki olmak zorunda değildir, geçen bölümlerde incelediğimiz "bir" ilişkisi, Kaplan bir Kedidir gibi. Örneğimize geri dönersek, B sınıfından türetilmiş BB sınıfı ve C sınıfından türetilmiş CC sınıfı, Anasinif sınıfına ait ekranaBas() yordamını kullanarak sonuçlarını ekrana yansıtabilmektedirler. Olaylara bu açıdan baklacak olursa, TüretilmisSinif sınıfın sanki üç ayrı işleyen (normal) sınıftan güvenli ve kolay bir şekilde türetilmiş olduğu görülür.

    Uygulamamızın çıktısı aşağıdaki gibi olur;

    Sonuc = B
    Sonuc = 15

    Toparlamak gerekirse bu makalemizde Java ise dahili sınıf(inner Class) kavramını ayrıntılı bir biçimde incelemeye çalıştık. Bir sonraki Java makalemizde ise Java ile İstisnalar (Exception) kavramına ayrıntılı bir biçimde değinmeye çalışacağız. Daha sonraki makalemizde ise Eclipse editörünü inceleyeceğiz.

    Umarım Yararlı olmuştur.

    Kaynaklar
    KTÜ İsbb ders notları

    Turhal Temizer
    http://turhal.blogspot.com


    http://www.csharpnedir.com/articles/read/?id=846

  7. #7
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Standart

    EXTRA
    Interface ve Inheritance-1

    Merhabalar,
    Bu yazımda interface'in nesneye dayalı yazılım geliştirmede ne kadar önemli olduğunu ve
    kalıtımla karşılaştırmasını "oldukça basit" bir örnekle anlatmaya çalışacağım...

    Şöyle bir senaryo düşünelim.Opel otomobil şirketi, yeni üreteceği 2010 Corsa model arabalarda GPS olmasını istiyor.Ancak GPS yazılımını kendisi geliştirmek istemiyor(Maliyet-Zaman vs)

    Bunun üzerine GPS yazılımı geliştiren ve hazır API sunan bir şirketten GPS-API 'sini satın alıp kendi projesine ekliyor...Nasıl mı ?


    public interface Otomobil
    {
    public void move();

    public void stop();

    public void turn(String direction);
    }

    GPS firması Opel yazılım geliştirme ekibinden bu interface'i implement etmesini bekler...


    import GPS_API.Otomobil;

    public class Corsa implements Otomobil
    {
    public void move() {
    System.out.println("Corsa hareket etti");
    }

    public void stop() {
    System.out.println("Corsa durdu");
    }

    public void turn(String direction) {
    if (direction.equals("right"))
    System.out.println("Corsa saga dondu");

    else System.out.println("Corsa sola dondu");
    }
    }

    Böylece Opel,detaylarını açmamakla birlikte GPS firması tarafından kullanılabilmesi için "move" ,"stop" ve "turn" metotlarını implement etti...

    Halbuki GPS firması API 'sini çok daha önceden farklı otomobil şirketleri tarafından kullanılabilmesi için oluşturmuştu.Otomobil interface'ini implement eden her şirket (Opel,Toyota vs) GPS-API'yi kütüphanelerine ekleyerek kullanabilirler.Bu da GPS şirketinin
    polimorfik ve reusable (yeniden kullanılabilir) bir yapı oluşturduğunun göstergesi.İşte GPS firmasının kodu:

    package GPS_API;

    public class GPS
    {
    //farkli ve karmasik metotlar mevcut olabilir

    private Otomobil oto;

    public GPS(Otomobil oto)
    {
    this.oto=oto;
    }

    public void otomobiliKullan()
    {
    oto.move();
    oto.stop();
    oto.turn("right");
    oto.turn("left");
    }
    } //GPSpackages adli pakette GPS firmasinin gelistirdigi yuzlerce sinif olabilir


    Görüldüğü üzere GPS-API, Otomobil interface'ini implement etmiş herhangibir nesneyi(polymorfizm) constructor'ında parametre olarak alıyor ve otomobiliKullan() metodunda iç yapısını bilmeden(soyutlama) istediği şekilde kullanabiliyor.Başka bir deyişle;
    GPS yazılımını geliştiren ekibin hiç bir şeye ihtiyacı yok.Tek beklentisi; bu API'yi kullanacak ekibin(Opel), Otomobil interface'ini implement etmiş olması...

    Peki Opel'deki yazılım geliştirme ekibi, interface'i implement ettikten sonra satın aldığı bu API'yi nasıl kullanabilir?


    import GPS_API; //Satın alınan API import edilir

    Corsa corsa=new Corsa();

    GPS gps= new GPS ( corsa);

    gps.otomobiliKullan();


    Görüldüğü gibi Opel ekibi yazılımı kolaylıkla kullanabilir.(Detayları bilmeden-Encapsulation)
    Bu da "tekerleği yeniden icat etmeme" nin başka bir örneği...


    Opel GPS'li araba üretir de Toyota durur mu?
    Toyota'da Corolla modeline GPS taktırmak istiyor...
    Otomobil interface'i implemente edilir.
    Interface= iki firma arasındaki sözleşme(contract)

    public class Corolla implements Otomobil {

    public void move() {
    System.out.println("Corolla hareket etti");
    }

    public void stop() {
    System.out.println("Corolla durdu");
    }

    public void turn(String direction) {
    if (direction.equals("right"))
    System.out.println("Corolla saga dondu");

    else System.out.println("Corolla sola dondu");
    }
    }

    Toyota API'yi kullanıyor !!!

    import GPS_API; //Satın alınan API import edilir

    Corolla corolla=new Corolla()
    ;

    GPS gps=new GPS(corolla);

    gps.otomobiliKullan();

    -------------------------------------------------------------------

    Şimdi gelelim "püf " noktaya...
    Polymorfizm, nesneye dayalı yaklaşımın en etkili silahlarından biridir.
    GPS örneğinde de görüldüğü gibi, GPS API,otomobilin hangi şirket tarafından imal edildiğine bakmaksızın
    kendisinden beklenilenleri gerçekleştiriyor.

    Polimorfik yaklaşım "Otomobil" interface'i ile sağlanmış.(Otomobil interface'inin gerçeklenmesi önşart)

    Oysa polimorfizm inheritance(kalıtım) ile sağlanamaz mıydı?

    Otomobil adında
    abstract class oluşturma önşart'ı olamaz mıydı? veya
    Otomobil adında
    super class oluşturma önşartı olamaz mıydı ?
    alıntı.

  8. #8
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

    Standart

    Altuğ Altınbaş tarafından hazırlanmış olup full java arayüz konusu içermektedir.

    http://www.kodcu.com/pdf/Bolum-7.pdf

    İNGİLİZCE OLARAK TASARLANMIŞ ÇOK GÜZEL BİR JAVA EĞİTİM SİTESİDİR:
    http://home.cogeco.ca/~ve3ll/jatutor5.htm

  9. #9

  10. #10
    Ehil Üye zeet06 - ait Kullanıcı Resmi (Avatar)
    Üyelik tarihi
    Jul 2008
    Mesajlar
    1.022

+ Konu Cevaplama Paneli

Konu Bilgileri

Users Browsing this Thread

Şu an 1 kullanıcı var. (0 üye ve 1 konuk)

     

Benzer Konular

  1. Risale-i Nurlar (Cep Telefonu İçin, Java - Kitaplar)
    By fbsamet in forum Mobil Paylaşım
    Cevaplar: 63
    Son Mesaj: 01.09.09, 16:10
  2. C Programlama
    By zeet06 in forum Bilişim Haberleri ve Bilimsel Makaleler
    Cevaplar: 13
    Son Mesaj: 14.01.09, 13:59
  3. Java Yardımı
    By Lebid24 in forum Bilişim Haberleri ve Bilimsel Makaleler
    Cevaplar: 1
    Son Mesaj: 18.11.08, 19:14
  4. Java Script Öğreniyorum...
    By zeet06 in forum Bilgisayar ve İnternet Sorunları
    Cevaplar: 2
    Son Mesaj: 01.11.08, 19:02

Bu Konudaki Etiketler

Yetkileriniz

  • Konu Acma Yetkiniz Yok
  • Cevap Yazma Yetkiniz Yok
  • Eklenti Yükleme Yetkiniz Yok
  • Mesajınızı Değiştirme Yetkiniz Yok
Google Grupları
RisaleForum grubuna abone ol
E-posta:
Bu grubu ziyaret et

Search Engine Friendly URLs by vBSEO 3.6.0