NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 9

Benzer belgeler
Arayüz (Interface) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1

(Interface and Inner Classes)

Java Dersi. Altuğ Bilgin Altıntaş

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 7

Nesne Yönelimli Programlama

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

7. HAFTA. Erişim Belirleyiciler

Erişim konusunda iki taraf vardır:

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

BİL-141 Bilgisayar Programlama I (Java)

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Nesne Yönelimli Programlama

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

İki Yöntem. Komposizyon (Composition) Kalıtım (Inheritance)

Sınıfların Tekrardan Kullanılması. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 5 1

HSancak Nesne Tabanlı Programlama I Ders Notları

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 4. Yrd.Doç.Dr.Hacer Karacan

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BMÜ-112 Algoritma ve Programlama-II Inheritance (Kalıtım) Yrd. Doç. Dr. İlhan AYDIN

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Sunum İçeriği. Programlamaya Giriş

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

public static int Toplam int x, int y

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

Nesne Yönelimli Programlama

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

(Interface and Inner Classes)

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 6

Ders 8 Konu Özeti ve Problemler

5. Bölüm Alt Sınıflar (Nested Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Java String İşlemleri

Bölüm 12. Nesne yönelimli programlama desteği

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

MOBIL UYGULAMA GELIŞTIRME

Decorator Tasarım Şablonu

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

Nesneye Dayalı Programlama

C# Metotlar ve Metot Tanımlama

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Kalıtım (Inheritance)

C++ Dersi: Nesne Tabanlı Programlama

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Java ve Yazılım Tasarımı ; Bölüm- 4 PAKET ERİŞİMLERİ

Öğr. Gör. Musa AYDIN Fatih Sultan Mehmet Vakıf Üniversitesi

BTEP243 Ders 3. class Yazım Kuralı:

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

Nesneye Dayalı Programlama

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 3

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

İÇİNDEKİLER VII İÇİNDEKİLER

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

Operator Aşırı Yükleme (Operator OverLoading)

Ders 8: Metotlar. barisgokce.com

YZM 2105 Nesneye Yönelik Programlama

POLIMORFIZM. Java ve Yazılım Tasarımı ; Bölüm- 6. Örnek: PolimorfizmOrnekBir.java (yorum ekle)

Polimorfizm. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 6 1

Bu parçalar arasındaki ilişkiyi kullanıp büyük çaplı programlar geliştirme tekniğine de nesne yönelimli programlama denir.

Ana sınıf içerisinde tanımlanmış bir yordam, ana sınıftan türeyen bir alt sınıfın içerisinde iptal edilebilir. ()

BMM3101 PROGRAMLAMA DİLLERİ

HSancak Nesne Tabanlı Programlama I Ders Notları

İsimler ve Kapsam. Hafta 4 Ders 2 BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

YZM 2105 Nesneye Yönelik Programlama

Nesne Yönelimli Programlama ve Kalıtım

Programlama Dillerinde Kullanılan Veri Tipleri

JAVADA METOTLAR. BMÜ-111 Algoritma ve Programlama. Yrd. Doç. Dr. İlhan AYDIN

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

SINIFLARIN TEKRAR KULLANILMASI

NESNEYE YÖNELİK PROGRAMLAMA

Java Class Yapısında Finalize Metotunun Kullanımı

Bölüm 11. Soyut veri tipleri ve kapsülleme kavramları ISBN

BİL-142 Bilgisayar Programlama II

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

Nesne Yönelimli Programlama

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Java da Program Denetimi ve Operatörler. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 2 1

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Java Programlamada Paket Yapısı Ve Import

Java Nitelemleri. Bölüm 1

3.Hafta. . Kontrol Deyimleri/İfadeler

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

Java da İstemci Tarafı Uygulamalar

BMH-303 Nesneye Yönelik Programlama

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 4. UYGULAMA

Transkript:

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 9

ARAYÜZLER VE DAHILI SINIFLAR 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.

Arayüz (Interface) Kavramı Java'da arayüz (interface), bir sınıfta olması gereken metod ve özellikleri tanımlayan yapıdır. Kendisi normal bir sınıf değildir, sadece neyin yapılacağını göstermekte, ancak nasıl yapılacağını göstermemektedir. Java da çoklu kalıtım dahili sınıflar ve arayüzlerle yapılmaktadır. Arayüzler değişkenler ve gövdesiz (soyut) metodlardan oluşur. Arayüzlerin kullanılmasındaki amaç farklı sınıfların, yapış şekilleri farklı dahi olsa aynı işlevleri yerine getirmelerini (polimorfizm) sağlamaktır.

Arayüz Oluşturma Arayüz tanımlanırken Class ifadesi yerine Interface ifadesi kullanılır. İçerdiği metodlar gövdesizdir. public interface Matter{ public double getdensity() public double getvolume(); public double getmass(); bir madde de ne gibi işlevler ve özellikler olması gerektiğini belirten bir interface Bu ifade, 'bir maddenin yoğunluğu, hacmi ve kütlesi olur demenin Java daki yoludur. Maddenin hacmi nasıl hesaplanır, kütlesi nasıl verilir, hiç bir şekilde belirtmemektedir. Sadece ne olması gerektiğini söylemektedir.

Arayüz Uygulaması Bir sınıfın arayüzdeki bütün metodları içerdiğini, gerçekleştirdiğini belirtmesine uygulama (implementation) denir ve 'implements' anahtar kelimesiyle ifade edilir. 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; public class SphereMatter implements Matter{ public double density=1.0; public double radius=1.0; public double getdensity(){ return density; public double getvolume(){ return (3.14*radius*radius*radius)/3; public double getmass(){ return density*(3.14*radius*radius*radius)/3; Burada "Küp/Küre diye bir nesnemiz var ve o bir maddedir, bir maddede olabilecek bütün nitelikler onda da bulunur." demiş olduk ve bunların nasıl hesaplandığını gösterdik.

Arayüz (Interface) Arayüzler, soyut (abstract) sınıfların bir üst modeli gibi düşünelebilir, Soyut sınıfların içerisinde hem iş yapan hem de hiçbir iş yapmayan sadece birleştirici rol üstlenen gövdesiz yordamlar (soyut yordamlar-abstract methods) vardır. Bu birleştirici rol oynayan yordamların, soyut sınıftan (abstract class) türetilmiş alt sınıfların içerisinde iptal edilmeleri (override) gerekir. Arayüzlerin içerisinde ise iş yapan herhangi bir yordam (method) bulunamaz; arayüzün içerisinde tamamen gövdesiz yordamlar (soyut yordamlar) bulunur. Bu açıdan bakılacak olursak, arayüzler, birleştirici bir rol oynamaları için tasarlanmıştır.

Arayüz (Interface) Arayüzlere ait gövdesiz (soyut) yordamlar otomatik olarak public erişim belirleyicisine sahip olurlar sizin bunu değiştirme imkanınız yoktur Arayüzlere ait global alanlar otomatik olarak public erişim belirleyicisine sahip olurlar otomatik olarak final ve statik özelliği içerirler sizin bunlara yine müdahale etme imkanınız yoktur

Birleştiricilik

Birleştiricilik

Arayüz (Interface) ve Soyut Sınıflar (Abstract Classes) Yukarıdaki örneğimizi derleyebilir miyiz? Derlense bile çalışma anında hata oluşturur mu? Soyut sınıfların amaçlarından biri aynı arayüz özelliğinde olduğu gibi birleştirici bir rol oynamaktır. Hem arayüzler olsun hem de soyut sınıflar olsun, bunların amaçları kendilerine ulaşan normal sınıflara, kendilerine ait olan gövdesiz yordamları iptal ettirmektir (override). O zaman yukarıdaki örnekte soyut olan Kedi sınıfı, Hayvan arayüzüne (interface) ait gövdesiz (soyut) avlan() yordamını iptal etmek zorunda değildir.

Arayüz (Interface) ve Soyut Sınıflar (Abstract Classes) Soru Kaplan sınıfı Hayvan arayüzünde tanımlanmış soyut olan avlan() yordamını iptal etmek zorunda mı? Cevap Evet, çünkü Kaplan sınıfı Kedi sınıfından türetilmiştir. Kedi sınıfı ise Hayvan arayüzüne ulaşmaktadır.

Arayüz (Interface) İle Çoklu Kalıtım (Multiple Inheritance) Bir altsınıfın sadece bir direk üstsınıfı olabilir. Ancak aynı anda bir sınıfı extend edip bir veya daha fazla arayüzü implement edebilir. extends anahtar sözcüğünün aksine, implements anahtar sözcüğüyle bir sınıfın aldığı hiç bir şey yoktur. Sadece bazı metodları implement etmeyi taahhüt etmektedir.

dememiz yeterlidir. Cube sınıfı Matter i implement etmeyi de miras yoluyla almış demektir. Arayüz (Interface) İle Çoklu Kalıtım (Multiple Inheritance) Cube sınıfı hem Body sınıfını extend edebilir hem de Matter arayüzünü implement edebilir. public class Cube extends Body implements Matter{ //... Üstsınıf'ın bir arayüzü implement etmesi durumunda altsınıf ta etmiş sayılır. public class Body implements Matter{ //... dersek public class Cube extends Body{ //...

Arayüz (Interface) İle Çoklu Kalıtım (Multiple Inheritance)

Arayüz (Interface) İle Çoklu Kalıtım (Multiple Inheritance)

Arayüzlerin Kalıtım (İnheritance) Yoluyla Genişletilmesi

Arayüzlerin Kalıtım (İnheritance) Yoluyla Genişletilmesi Jaguar sınıfı Avlanabilme arayüzüne ulaşarak, avlan(), dahahizlikos(), kos() yordamlarını iptal etmek (override) zorunda bırakılmıştır. Sebep Avlanabilme arayüzünün DahaHizliKosabilme arayüzünden, DahaHizliKosabilme arayüzünün de Kosabilme arayüzünden türemiş olması RoadRunner sınıfı ise sadece DahaHizliKosabilme arayüzüne erişerek, kos() ve dahahizlikos() gövdesiz (soyut) yordamlarını iptal etmek (override) zorunda bırakılmıştır. Sebep DahaHizliKosabilme arayüzünün Kosabilme arayüzünden türemiş olması

Arayüzlere Özel Bir arayüz (interface) birden çok arayüzden türetilebilir.

Çakışmalar A1 ve A3 arayüzlerinin içerisindeki gövdesiz (soyut) yordamların isimleri ve parametreleri aynıdır ama dönüş tipleri farklıdır.

Çakışmalar

Arayüzün (Interface) İçerisinde Alan Tanımlama Arayüzlerin içerisinde gövdesiz (soyut) yordamların dışında alanlar da bulunabilir. Bu alanlar uygulamalarda sabit olarak kullanabilir. Çünkü arayüzün içerisinde tanımlanan bir alan (ilkel tipte veya sınıf tipinde olsun) otomatik olarak hem public erişim belirleyicisine hem de final ve static özelliğine sahip olur.

Arayüzün (Interface) İçerisinde Alan Tanımlama public interface MathConstants{ double PI=3.14; public class Circle implements MathConstants{ private double radius=1.0; public getcircumference(){ return 2*PI*radius; Circle sınıfında tanımlanmadığı halde PI değişkeni, sadece MathConstants arayüzünü implement ettiği için erişilebilir durumdadır. Bu arayüzü implement eden başka bir sınıf ta aynı şekilde PI ye erişebilir. Bu anlamda PI bir sabittir. Ama PI sadece implement edilen class'lar tarafından görülmekte olduğundan global değildir. Zaten Java da global değişken ve sabit ihtiyacı duyulan yerlerde interface kullanılır.

Arayüzün İçerisinde Tanımlanmış Alanlara İlk Değerlerinin Verilmesi A7 arayüzünün içerisindeki ilkel (primitive) int tipindeki devir_sayisi ve t1 alanlarının değerlerini derleme anında bilebilmek imkansızdır. Bu değerler ancak çalışma anında bilenebilir.

Arayüzün İçerisinde Tanımlanmış Alanlara İlk Değerlerinin Verilmesi Dikkat edilmesi gereken bir başka husus ise A7 arayüzünün içerisindeki alanların ne zaman ilk değerlerini aldıklarıdır. Bir arayüzün içerisindeki alanlar final ve statik oldukları için, A7 arayüzüne ilk kez erişildiği zaman, A7 arayüzünün içerisindeki tüm alanlar ilk değerlerini alırlar.

Dahili Arayüzler (Nested Interface) Bir arayüz, başka bir arayüzün veya sınıfın içerisinde tanımlanabilir. Bir arayüzün içerisinde tanınlanan dahili arayüzler, protected, friendly veya private erişim belirleyicisine sahip olamaz. UML diyagramından anlaşılacağı üzere, ArayuzA arayüzünün içerisinde iki adet dahili arayüz (nested interface) tanımlanmıştır. Dışarıdaki iki sınıfımız, dahili olarak tanımlanmış bu iki arayüze erişebilmektedir.

Dahili Arayüzler (Nested Interface) Uygulamanın çıktısı aşağıdaki gibidir: Erisim1.isYap1() Erisim1.isYap3()

Sınıfların İçerisinde Tanımlanan Dahili Arayüzler

Dahili Sınıflar (Inner Classes) Dahili 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ı altında toplanır.

Dahili Üye Sınıflar Toplama sınıfı dahili üye sınıfı Hesaplama sınıfı çevreleyici sınıf 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.

Dahili üye sınıflara, public, friendly, protected veya private erişim belirleyicileri atanabilir, böylece dahili üye sınıflarımıza olan erişimi kısıtlamış/açmış oluruz. Dikkat edilmesi gereken diğer bir husus ise bir dahili ü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. Uygulama çıktısı:

Dahili Üye Sınıflar ve Erişim Hesaplama2Kullan sınıfı private erişim belirleyicisine sahip olan Bolme dahili üye sınıfına erişemez!

Dahili Üye Sınıflar ve Erişim Uygulama çıktısı:

Dahili Üye Sınıflar ve Bunları Çevreleyen Sınıflar Arasındaki İlişki Dahili üye sınıflar, içerisinde bulundukları çevreleyici sınıfların; tüm alanlarına (statik veya değil - private dahil) yordamlarına (statik veya değil -private dahil) erişebilirler.

Statik Dahili Üye Sınıflar Statik dahili üye sınıfına ait nesne oluşturmak için, onu çevreleyen sınıfa ait bir nesne oluşturma zorunluluğu yoktur Statik dahili ü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 Sebep kendisini çevreleyen sınıf ile arasındaki bağı kopartmış olması

Statik Dahili Üye Sınıflar Toplama4 sınıfına ait bir nesne oluşturulmak istenirse, bunun hemen öncesinde Hesaplama4 sınıfına ait bir nesne oluşturulmaz

Statik Dahili Üye Sınıflar 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 ;

Statik Dahili Üye Sınıflar 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 Statik dahili üye sınıflar ile bunları çevreleyen sınıflar arasında this bağlantısı yoktur

Statik Dahili Üye Sınıflar 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 Statik olmayan dahili üye sınıfların içerisinde statik global alan tanımlanamaz.

Statik Dahili Üye Sınıflar 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 Toplama4 statik dahili üye sınıfına ait nesne oluştururken, onu çevreleyen sınıfa ait herhangi bir nesne oluşturmak zorunda kalmadık.

Statik Dahili Üye Sınıflar 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

Statik Dahili Üye Sınıflar ve Statik Yordamlar 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 Uygulamanın çıktısı Sonuc = 16 + 8 = 27 public static void main(string args[]) { int sonuc = Hesaplama5.Toplama5.toplamaYap(16,8); // dikkat System.out.println("Sonuc = 16 + 8 = " + sonuc ); // class Hesaplama5

Statik ve Final Alanlar Statik olmayan dahili üye sınıfların içerisinde, statik alanlar ve yordamlar tanımlanamaz "statik ve final" alanlar tanımlanabilir Bir alan hem statik hem de final ise SABİT demektir Bu sebeple statik olmayan dahili üye sınıfların içerisinde statik ve final alanlar kullanılabilir.

Statik ve Final Alanlar 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

Dahili Üye Sınıflar ve Yapılandırıcılar (Constructors) 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(); Dahili üye sınıfını çevreleyen sınıfa ait bir nesne oluşturulduğu zaman, dahili üye sınıfına ait bir nesne otomatik oluşturulmaz. Bu ö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.

Dahili Üye Sınıflar ve Yapılandırıcılar (Constructors) 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(); 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() " yazmamız gerekirdi.

Uygulamanın çıktısı: İç içe Dahili Üye Sınıflar public class Abc { Abc nesnesi olusturuluyor Def nesnesi olusturuluyor Ghi nesnesi olusturuluyor 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 ic_ice = new Abc().new Def().new Ghi(); // class Abc

Uygulamanın çıktısı: Soyut (Abstract) Dahili Üye Sınıflar Kartal Ucuyor... Kartal Konuyor... 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ı zorunludur.

Uygulamanın çıktısı: Soyut (Abstract) Dahili Üye Sınıflar Kartal1 Ucuyor... Kartal1 Konuyor... 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ğiliz. Sebep Kus sınıfı statik dahili üye sınıf

Türetilebilen Dahili Üye Sınıflar

Yerel Sınıflar (Local Classes) Yerel sınıflar, yalnızca içinde tanımlandıkları, yordamın veya bloğun içerisinde geçerlidir. Dahili üye sınıfların çevreleyici sınıfları, yerel sınıfların ise çevreleyici yordamları vardır. Yerel sınıflar tanımlandıkları bu yordamların dışarısından erişilemezler. Yerel sınıflara ait özellikler: 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.

Yerel Sınıflar (Local Classes) interface Toplayici { public int hesaplamayap() ; public class Hesaplama6 { public int topla(int a, int b) { topla(int a, int b) metodu Yerel sınıf 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();

Yerel Sınıflar (Local Classes) 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 Uygulamanın çıktısı: Sonuc = 5 + 9 = 14

Yerel Sınıflar (Local Classes) 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 yanlı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.

Yerel Sınıflar (Local Classes) 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ımlanamazlar.

Neden Dahili sınıflar? Dahili sınıfların var olmasındaki neden çoklu kalıtıma (multiple inheritance) tam desteği sağlamaktır. Java, dahili sınıflar ile çoklu kalıtıma olan desteğini güvenli bir şekilde sağlamaktadır. Dahili 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.

Neden Dahili sınıflar? 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() );

Neden Dahili sınıflar? Uygulamanın çıktısı: Sonuc = B Sonuc = 15 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); 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.