Merhaba arkadaşlar bir önceki yazımızda statik olmayan gömülü sınıflardan bahsetmiştik ve bu tür sınıfların 3’e ayrıldığını, bunlardan bir tanesi olan Üye Dahili Sınıf hakkında bilgileri sizlere aktarmıştım. Şimdi 3’e ayrılan statik olmayan gömülü sınıflardan 2.si olan Yerel Dahili Sınıf’lardan bahsedeceğim.
Yerel Dahili Sınıflar metotların veya blokların içinde tanımlanırlar. Metotların içinde tanımlanmasını anladığınızdan eminim ancak blok konusunda anlaşılmayan bir yer kalmasın istiyorum. Burada blok olarak bahsettiğim şey SIB ve IIB bloklarıdır.
Şimdi Yerel Dahili Sınıfların davranış şekillerini örneklerle inceleyelim.
- Yerel Dahili Sınıflar mutlaka bir metot veya blok içinde tanımlanmalı dırlar.
class DisSinif {
static {
class YerelDahiliSinifBir {
//Sınıf, Static Initialization Block (SIB) içinde tanımlanmıştır.
}
}
{
class YerelDahiliSinifIki {
//Sınıf, Instance Initialization Block (IIB) içinde tanımlanmıştır.
}
}
void metotBir() {
class YerelDahiliSinifUc {
//Sınıf, statik olmatan metot içinde tanımlanmıştır.
}
}
static void metotIki() {
class YerelDahiliSinifDort {
//Sınıf, statik metot içinde tanımlanmıştır.
}
}
void metotUc() {
if (true) {
class YerelDahiliSinifBes {
//Sınıf, if bloğu içinde tanımlanmıştır.
}
}
for (int i = 0; i <= 5; i++) {
class YerelDahiliSinifAlti {
//Sınıf, for loop döngüsü içinde tanımlanmıştır.
}
}
}
}
- Yerel Dahili Sınıflar “static” olarak tanımlanmazlar.
class DisSinif {
void metotBir() {
static class YerelDahiliSinif {
//derleme zamanı hatası
//Yerel dahili sınıflar static olmaz.
}
}
}
- Yerel Dahili Sınıfların static üyeleri olamaz. Yerel dahili sınıfların içinde sadece statik olmayan üyelere izin verilir. Ancak yerel dahili sınıflar aynı anda static ve final olarak tanımlanmış alanlara (field) sahip olabilir.
class DisSinif {
void metotBir() {
class YerelGomuluSinif {
int i; //statik olmayan field olabilir.
static final int j = 10; //Aynı anda statik ve final olarak tanımlanmış field olabilir.
static int k; //Derleme zamanı hatası oluşur. : statik field bulunamaz.
{
//IIB blunabilir.
}
static {
//SIB blunamaz. Derleme zamanı hatası oluşur.
}
void metotBir() {
//Static olmayan metot bulunabilir.
}
static void metotIki() {
//Derleme zamanı hatası : Static metot bulunamaz.
}
}
}
}
- Yerel Dahili Sınıf üyelerine erişebilmek için, bu sınıftan bir örnek oluşturulması gerekmektedir.
class DisSinif {
void metotBir() {
class YerelDahiliSinif {
int i; //static olmayan field
static final int j = 10; //statik ve final olarak tanımlanmış field
void metotBir() {
System.out.println("YerelDahiliSinif içinden");
}
}
System.out.println(YerelDahiliSinif.j); //sstatic ve final olarak tanımlanmış field, drekt olarak sınıf adı kullanılarak erişilebilir.
YerelDahiliSinif dahili = new YerelDahiliSinif(); //YerelDahiliSinif'dan bir örnek oluşturuluyor.
System.out.println(dahili.i); //YerelDahiliSinif içindeki statik olmayan üyeye erişiliyor.
dahili.metotBir(); //static olmayan metot çağırılıyor.
}
}
public class DahiliSiniflar {
public static void main(String args[]) {
DisSinif dis = new DisSinif();
dis.metotBir();
}
}
- Yerel Dahili Sınıflar tanımlandıkları metot veya bloğa aittirler. Tanımlı olmadıkları bir metot veya blok içinde kullanılamazlar.
class DisSinif {
void metotBir() {
class YerelDahiliSinif {
int i; //static olmayan field
static final int j = 10; //static ve final olarak tanımlanmış field
void metotBir() {
System.out.println("YerelDahiliSinif içinden.");
}
}
YerelDahiliSinif dahili = new YerelDahiliSinif();
//Yerel Dahili Sınıfları tanımlı oldukları metot veya blok içinde kullanabilirsiniz.
}
void metotIki() {
YerelDahiliSinif dahili = new YerelDahiliSinif(); //derleme zamanı hatası oluşur.
//YerelDahiliSinif metotBir dışında hiç bir yerde kullanılamaz.
}
}
- Yalnızca yerel dahili sınıfın tanımlandığı metodun içindeki final olarak belirlenmiş değişkenler yerel dahili sınıf içinde kullanılabilir. final olarak tanımlanmamış olan değişkenler kullanılamaz.
class DisSinif {
void MetotBir() {
int i; //Statik olmayan yerel değişken
final int j; //final olarak tanımlı yerel değişken
class YerelDagiliSinif {
void metotBir() {
System.out.println(i); //Derleme zamanı hatası
//final olarak tanımlanmayan yerel değişkenler kullanılamaz.
System.out.println(j); //final olarak tanımlanmış değişğikenler kullanılabilir.
}
}
}
}
- Yerel Dahili Sınıflar erişim belirleyiciler ile birlikte kullanılamaz. Örneğin dahili sınıf private, protected ve public olamaz. Ancak Yerel dahili sınıflar içinde private, public, protected ve default türünden erişim belirleyiciler ile kullanılmış üyeler bulunabilir.
class DisSinif {
void metotBir() {
private class YerelDahiliSinifBir {
//Derleme zamanı hatası
//Yerel Dahili Sınıflar private olmaz.
}
protected class YerelDahiliSinifIki {
//Derleme zamanı hatası
//Yerel Dahili Sınıflar protected olmamaz.
}
public class YerelDahiliSinifUc {
//Derleme zamanı hatası
//Yerel Dahili Sınıflar public olamaz.
}
class YerelDahiliSinifDort {
private int i; //private üyeye sahip olabilir
protected int j; //protected üyeye sahip olabilir
public int k; //public üyeye sahip olabilir
int m; //default üyeye sahip olabilir
}
}
}
- Yerel Dahili Sınıflar abstract veya final olarak tanımlanabilirler. Ancak her iki tanımı birden aynı anda kullanamazlar.
class DisSinif {
void metotBir() {
abstract class YerelDahiliSinifBir {
//abstract Yerel Dahili Sınıf
}
final class YerelDahiliSinifIki {
//final yerel dahili sınıf
}
}
}
Bütün konuları ve kuralları anlattığımı düşünüyorum. Görüşmek dileğiyle.
İlk Yorumu Siz Yapın