Merhabalar.

Dart eğitimlerimize yeni bir konuyla devam ediyoruz.

Bir sınıf yarattığımızda bu sınıf içindeki tanımlanana değişkenler o sınıftan her yeni instance alındığında sınıfın var olan ilk hali gibi yaratılırlar.

Hemen bir örnek verelim.

void main(){

  
}

class Personal{
  
  String name;
  int counter = 0;
  
}

Personal diye bir sınıf yarattım ve iki property ekledim.

Şimdi main içinde bu sınıftan bir nesne türetip değişkenlerinin değerlerini güncelleyeceğim.

void main(){

  var p = Personal();
  p.name = "Murat";
  p.counter++;

  print("${p.name} + ${p.counter}");

}

class Personal{

  String name;
  int counter = 0;

}
H:\Dart_Tutorial\hello_dart\bin>dart 32_static_variable_function.dart
Murat + 1

Çıktısı gördüğünüz gibi oldu.

Şimdi bu sınıftan bir nesne daha türetip verileri güncelleyelim.

void main(){

  var p = Personal();
  p.name = "Murat";
  p.counter++;

  print("${p.name} + ${p.counter}");
  
  var p2 = Personal();
  p2.name = "Meryem";
  p2.counter++;

  print("${p2.name} + ${p2.counter}");
  
}

class Personal{

  String name;
  int counter = 0;

}

Çıktı olarak counter değeri kaldığı yerden 1 den başlayıp artırılınca 2 değerini mi yazacak yoksa yine 0 dan başlayıp 1 değerini mi yazdıracak?

H:\Dart_Tutorial\hello_dart\bin>dart 32_static_variable_function.dart
Murat + 1
Meryem + 1

1 yazdırdı. Çünkü sınıf her tanımlandığında ilk haliyle instance oluşturulur. Ve her instance farklı stack alanlarında yönetilir. Değerleri kendilerini bağlar.

Ancak ben istiyorum ki bu counter değeri her sınıf oluşturulduğunda yeniden oluşturulmasın ve kaldığı yerden değer almaya devam etsin ve son değeri ne ise ona istediğimiz zaman o haliyle ulaşabileyim.

İşte bunun için bu değişkenin static olarak belirtilmesi gerekir.

Şöyle yapacağız.

void main(){

  var p = Personal();
  p.name = "Murat";
  p.counter++;

  print("${p.name} + ${p.counter}");

  var p2 = Personal();
  p2.name = "Meryem";
  p2.counter++;

  print("${p2.name} + ${p2.counter}");

}

class Personal{

  String name;
  static int counter = 0;

}
static int counter = 0;

Artık bu alan static olarak yaratıldığı için RAM’de yeri bellidir ve static bir değerdir. Program çalıştığı süre boyunca bu değere oradan ulaşabilir ve kullanabiliriz.

Bu sebepten dolayı static tanımlanmış bir değişken ya da metod instace üzerinden çağrılamaz.

Yani ben

p.counter diye artık ulaşamam. Bunu deneyebilirsiniz.

Static bir değere direkt sınıfının ismiyle ulaşmam gerekir.

Yani

Personal.counter şeklinde ulaşabilirim.

Yapalım.

void main(){

  var p = Personal();
  p.name = "Murat";
  Personal.counter++;

  print("${p.name} + ${Personal.counter}");

  var p2 = Personal();
  p2.name = "Meryem";
  Personal.counter++;

  print("${p2.name} + ${Personal.counter}");

}

class Personal{

  String name;
  static int counter = 0;

}
H:\Dart_Tutorial\hello_dart\bin>dart 32_static_variable_function.dart
Murat + 1
Meryem + 2

Gördüğünüz gibi counter değeri artık kaldığı yerden sayıyor. Çünkü nesne türetilince değil sınıf oluşturulur oluşmaz RAM’de yerini aldı.

Static Metodlar

Sınıflar içinde static metodlarda yazabiliriz.

Normal metod yazma kuralları aynen geçerli ve sadece başına static belirtecini kullanıyoruz.

void main(){

  var p = Personal();
  p.name = "Murat";
  Personal.counter++;

  print("${p.name} + ${Personal.counter}");

  var p2 = Personal();
  p2.name = "Meryem";
  Personal.counter++;

  print("${p2.name} + ${Personal.counter}");

}

class Personal{

  String name;
  static int counter = 0;

  static void DeğerYaz(){
    print("${counter}");
  }

}
 static void DeğerYaz(){
    print("${counter}");
  }

Burada unutmamız gereken önemli bir nokta var. Bir static metod içinde static olmayan metodlar ve değişkenler çağrılıp kullanılamaz.

Yani bu metodun içinde name propertysine ulaşamayız. Sadece counter’a ulaşabiliriz.

void main(){

  var p = Personal();
  p.name = "Murat";
  Personal.counter++;

  print("${p.name} + ${Personal.counter}");

  var p2 = Personal();
  p2.name = "Meryem";
  Personal.counter++;

  print("${p2.name} + ${Personal.counter}");

  Personal.DegerYaz();

}

class Personal{

  String name;
  static int counter = 0;

  static void DegerYaz(){
    print("${counter}");
  }

}
Personal.DegerYaz();
H:\Dart_Tutorial\hello_dart\bin>dart 32_static_variable_function.dart
Murat + 1
Meryem + 2
2

Böylelikle bu konunda sonuna geldik.

Bir sonraki yazımda görüşmek üzere.


What's Your Reaction?

hate hate
0
hate
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win
Murat Bilginer
21 Şubat 1992 Doğumlu. Endüstri Mühendisi olarak Lisansını 2016 yılında tamamlamıştır. Industryolog Akademi - NGenius oluşumlarının kurucusudur. Şu anda kendi şirketi Brainy Tech ile hem Yazılım Hizmetleri Sunmakta Hem de Online Eğitimler Vermektedir.