Inner Class – Java

Selamlar,

    Inner classlar yani dahili sınıflar belli bir görevi yapan classların başka bir classın içinde gruplanması ile ortaya çıkan yapılardır.

İnner classlar sayesinde interfacelere ek olarak java da çoklu kalıtımı yapabilmiş oluyoruz. Açıklamalar  kodların arasında yeşil renkte yorum satırı olarak yapılacaktır.
Dört farklı inner class  bulunmaktadır.

  1. Statik olmayan Inner Class
  2. Statik Inner Class
  3. Lokal Inner Class
  4. Anonim Inner Class

1.Statik olmayan Inner Class

Örnek kod:

Matematik Sınıfı

package StaticOlmayanInnerClass;

import java.util.Scanner;

public class Matematik {
//Classımızı oluşturduk
private double PI = Math.PI;

public class Factorial
{//Class içindeki inner classımızı oluşturduk
public void faktoriyel()
{// Bu inner classa ait bir metod
Scanner scanner = new Scanner(System.in);
System.out.println("Bir sayi giriniz..");
int sayi=scanner.nextInt();
int fakt=1;
for (int i = 2; i <=sayi; i++) 
{fakt*=i; }
System.out.println("Faktöriyel :" +fakt);
}}
public class Asal
{// Bir başka inner class
public boolean asalMi(int sayi)
{// Bu inner classa ait bir metod
int i=2;
while(i
{if(sayi% i ==0)
{return false;}
i++;}return true;
}}
public class Alan
{// Bir başka inner class
public class DaireAlan{
// Inner class içinde bir inner class
public void daireAlan(int yariCap)
{
System.out.println("Dairenin Alanı:" + (yariCap*yariCap*PI));
// Buradaki private PI değişkenini aynı Matematik sınıfı içinde olduğumuzdan 
//dolayı kullanabilmekteyiz.
} }}}

Main Sınıfı

package StaticOlmayanInnerClass;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
//Inner classlardaki referaslar ile yeni nesne oluşturma
Matematik.Factorial factorial= new Matematik().new Factorial();
Matematik.Asal asal = new Matematik().new Asal();
Matematik.Alan alan = new Matematik().new Alan();
Matematik.Alan.DaireAlan daireAlan= new Matematik().new Alan().new DaireAlan();
//Matematik sınıfına bağlı alan ınner clasının içindeki daire alan inner clasından nesne oluşturma
Scanner scanner = new Scanner(System.in);
System.out.println("Bir sayi giriniz:");
int sayi = scanner.nextInt();

if(asal.asalMi(sayi)) 
{System.out.println("Bu sayi asaldir.");}
else{System.out.println("Bu sayi asal sayi değildir..");}
factorial.faktoriyel();
daireAlan.daireAlan(5);


}}

ÇIKTI:

Bir sayi giriniz:
5
Bu sayi asaldir.

Bir sayi giriniz..
5
Faktöriyel :120

Dairenin Alanı:78.53981633974483

Gerekli açıklama kısımlarını yeşil renkli yorum satırları ile kod
blokları arasında belirttim. Statik olmayan inner classların kullanımı
bu şekilde gerçekleşmektedir.En tepedeki class’dan yola çıkarak oluşturulmak istenen nesne için gerekli referans gösterimi için sizin belirtmeniz gereklidir.

Matematik sinifina bağlı Alan inner sinifina bağlı DaireAlan inner sınıfından manasına gelmektedir.

Matematik.Alan.DaireAlan daire alan = ……….

2.Statik Inner Class

Main Class

package StatikInnerClass;

public class Main {

public static void main (String[] args)
{
Matematik.Alan alan = new Matematik.Alan(); 
alan.daire_alan(5);}}

MATEMATİK Class

package StatikInnerClass;

public class Matematik {
private double PI=Math.PI ; 

public static class Alan
{
public void daire_alan(int yaricap)
{
System.out.println("Dairenin alanı "+ (yaricap*yaricap * PI));//Bu satır hata verir.
// Bu satirdaki hatanın nedeni PI değişkeni için nesne oluşturmadan kullanılmaya çalışmasıdır. 
//Bu hatayı gidermenin yolu yukarıdaki private pi değişkeninde static yapmaktır.} } }

3.Lokal İnner Class

package LokalinnerClass;

public class Main {
public static void main(String [] args)
{class Alan{
public void daire_alan(int yaricap)
   {
System.out.println("Dairenin alanı :" +(yaricap*yaricap*Math.PI));
//Burada lokal bir inner class tanımlandı. Ve bu inner class 
//sadece main metodu içinde geçerlidir.
     }}
Alan alan =new Alan();
// Buradaki obje oluşturma işi lokal inner class sayesinde yapılmıştır.
alan.daire_alan(10);
}}

4.Anonim Inner Class

   Anonim inner classlarda herhangi bir class tanımlama olmadan biz bir tane obje oluşturabiliyoruz.Bizim bir tane interface veya abstract classımız varsa bunlardan herhangi bir class türetmeden direk obje üretmek istiyorsak Anonim Inner class kullanıyoruz demektir.

package AnonimInnerClass;public class Main {

public static void main(String[] args)
{
IOgrenci ogrenci = new IOgrenci() {

@Override
public void derseGir() {
System.out.println("Derse giriyorum.");
}
@Override
public void dersCalis() {
System.out.println("Ders çalışıyorum.");
}};

ogrenci.dersCalis();
ogrenci.derseGir();
}
public interface IOgrenci
{void dersCalis();
 void derseGir();
 }}

Bilgi Paylaştıkça çoğalır paylaşarak buna destek ol.