Java da Static ve Instance Initialize Bloklar

Java 2 tür Initialize blok vardır.

->Static Block
->Instance Block

Static initialize blocklar main metodundan önce sınıf yüklendiğinde çalışacaktır.
Static blocklar ilk önce ve sadece 1 kereliğine çalışır.
Instance blocklar ilgili obje/instance oluşunca çalışacaktır.
Instance blocklar her obje oluşturulduğunda tekrar çalışacaklardır.

class Test {
	
}

public class InitializeTest {

	// static initialize block
	// static initialize blocklar main metodundan once sinif yuklendiginde
	// calisacaktir.
	// birden fazla initialize block oldugunda tanimlanma sirasina gore
	// calisacaktir.
	static {
		System.out.println("static initialize block 1");
	}

	static {
		System.out.println("static initialize block 2");
	}

	static {
		System.out.println("static initialize block 3");
	}

	// instance initialize block
	// instance initalize blocklar ilgili sinif tipinde obje olusunca calisacaktir.
	// tanimlandigi sirada calisirlar.
	// 
	{
		System.out.println("instance initialize block");
	}

	// instance initialize block
	{
		System.out.println("instance initialize block2");
	}
	
	InitializeTest(){
		System.out.println("Constructor!!!");
	}

	public static void main(String[] args) {
		System.out.println("main");
		
		InitializeTest test = new InitializeTest();
		InitializeTest test2 = new InitializeTest();
//kactane obje olusturursak okadar kez instance blocklar calisacaktir.
//Bir obje oluşuturulduğunda ilk önce instance block çalışır daha sonra constuctor çalışır.

/* Çıktı:
static initialize block 1
static initialize block 2
static initialize block 3
main
instance initialize block
instance initialize block2
Constructor!!!
instance initialize block
instance initialize block2
Constructor!!!
*/
	}

}

#initialize-block, #instance-block, #java, #java-dersleri, #static-block

Java da Pass By Value Kavramı

Java da Pass By Value:

Metotlara parametreler geçilmeden önce parametrenin değeri belirlenir.Bu belirlenen değer bellekte bir alana kopyalanır ve daha sonra parametre aktarımı yapılır.Parametre aktarımı yapılırken ise,bu bellek alanının adresinin kendisi değil kopyası metoda gönderilir.
Bu olaya “Pass by value” denir.

public class passbyvalue {

 public static void main(String[] args) {
  int num=5;
  // 5 degerini temsil eden bit yapisinin kopyasi alinir ve add metoduna gecer.
  addvalue(num);
  System.out.println("Ilk deger"+ num);
  
  
 }
 
 public static void addvalue(int num)
 {
 int numa=num+5;
  System.out.println("Son deger"+numa);
}
}

#bit-pattern, #java, #java-dersleri, #pass-by-value

Java da – Veri Tipleri ve Değişkenler

Declaration nedir ? 

Declaration bir class içerisinde veri tipini tanımlamaktır . Ayrıca bellekte de yer ayrılır.

Local Variable(Local değişken nedir )? 

Java da metod içerisinde tanımladığımız değişkenlere local değişken diyebiliriz.
Local değişkenleri metod içerisinde kullanıyorsak ilk değer vermek zorundayız (initialize)
Değer vermediğimizde hata verecektir.

public static void main(String[] args) {

  int number ;
  //java number degiskenine 0 atamaz!
  //local degiskenler icin initialize yapilmaz!
  //burada degiskenin degeri 0 degildir.

  //compile error
}




Instance Variable nedir ? 

Bir class içerisinde tanımlanan static olmayan değişkenlere verilen isimdir.
İlk değer vermek zorunda değiliz (initialize)

Javada static ve instance degiskenlere otomatik olarak bir değer atanır.
Byte , short , int , long icin -> 0 atanir.
Float , double -> 0.0
Boolean -> false
Char –> ‘\u0000’
Object reference ve reference type icin -> null
 
Numeric Literals
Literal kavramı bir değişkenin alabileceği değerler kümesidir.
Eğer numeric değerin sonuca onun tipini belirten bir harf koymazsak int gibi davranılır.
Örnek verirsek long değişkenin sonuna L yada l harfini koyabiliriz
Ondalıklı sayılarda veri tipinin sonunda harf belirtmezsek double gibi davranır
Örnek verirsek float bir değişkenin sonuna F yada f harfini koyabiliriz
Java 7 de numeric literals arasına underscore koyarak sayının okunmasını kolaylaştırabiliriz
long numberOfUnits = 1234_567_897; 
byte b1 = 100; 
100 -> int tipindedir. //Burada otomatik olarak daraltma yapilir/narrow
byte b2 = (byte) 100;
 
 

#declaration, #instance-variable, #java, #java-dersleri, #local-variable, #numeric-literals, #veri-tipleri

Coupling(Bağlaşım) ve Cohesion(Yapışkanlık) Kavramları

Bağlaşım(Coupling):

 Bir yazılımda,uygulamada sınıflar birbiriyleriyle etkileşim haline girer ve çeşitli işler yapılır.
 Bu sınıflar birbirleriyle etkileşim haline girdiğinde aralarında bir bağımlılık oluşacaktir. Yani  bir sınıf üzerinde yapılan değişikliklerin diğer sınıflara sıçramaması gerekir.

Yapışkanlık(Cohesion):
 Cohesion kavramı sınıfın metodunun nasıl tasarlandığı ile ilgilidirHer sınıfın metodu iyi tanımlanmış görevi,amacı olmalıdır. Bir sınıf içerisinde birbiriyle alakasız metotlar olmamalıdır.
Her sınıfın sorumluluğu belli olmalıdır.
Her sınıfın sorumluluğu rolü net ve iyi tanımlı olmalıdır.
Bu yaklaşıma uyduğumuzda high cohesiona uygun olacaktır.

#baglasim, #cohesion, #coupling, #java, #java-dersleri, #yapiskanlik

Super ve This Anahtar Kelimeleri

Java da Super():

Bir alt-sınıf ne zaman üst-sınıfına erişmek isterse super anahtar sözcüğünü kullanabilir. super ‘in kullanımı iki türlü olur. Birincisi, üst-sınıfa ait nesne oluşturmak içindir. İkincisi, üst-sınıfın öğelerine erişmek içindir.(Bir üst sınıftaki default constructorı çağırır.)

Java da This():

This anahtar kelimesi o anda hangi nesne üzerinde işlem yapılıyorsa o nesnenin referansını döndürür. (Ayni sınıfta yer alan constructor i cağırmak için this() anahtar kelimesini kullanırız.)


class Animal {

 Animal(int a) {
  this();
  System.out.println("animal int ");
 }

 Animal() {
  super();
  System.out.println("Animal default");
 }
}

class Dog extends Animal {
 Dog() {
  // System.out.println("compile error. this ifadesi ilk ifade olmalidir!");
  this(10);

  System.out.println("dog default constructor");
  // super(); // hem super hem this olmaz. legal degildir, derleme hatasi
  // verecektir.

  // ayni sinifta yer alan constructor i cagirmak icin this() keywordunu
  // kullaniriz.

  // bir yapilandiricida ilk ifade ya this ifadesidir ya da super
  // ifadesidirir.
  // ikisi ayni anda olmaz!
 }

 Dog(int a) {
  super(a);
  System.out.println("dog int constructor");
  // this(); //Recursive constructor invocation Dog(int)
  // recursif olarak constructorlari cagirmaya calisirsak java bizim icin
  // derleme hatasi verecektir 🙂
 }
}

public class Test {
 public static void main(String[] args) {
  Dog dog = new Dog();
 }
}
/*
Ekran Çıktısı:
Animal default
animal int 
dog int constructor
dog default constructor
*/

#java, #java-da-anahtar-kelimeler, #java-dersleri, #super, #this

Constructor

Java da Constructor:

Javada yeni bir obje olustugunda (new anahtar kelimesi kullanıldığında) constructorlar çalışır.
Javada abstract/soyut classlar dahil tum sınıflarda en az bir tane constructor olmak zorundadır!
Eğer biz herhangi bir yapilandirici/constructor tanimlamazsak Java bizim icin bir tane constructor tanimlayacaktir. Bu constructer her zaman no-arg constructor. olacaktır.
Eğer bir tane bile constructor tanimlarsak bu durumda java bizim işimize karışmaz ve constructor tanımlamaz.

public class Yapilandirici {

 public Yapilandirici(){/* Biz eğer böyle bir yapılandırıcı tanımlamazsak 
         bunu java kendisi arka planda tanımlar.
 Eğer şimdiki gibi biz tanımlarsak java bizim işimize karışmaz.*/
  System.out.println("Comert Baldemir"); 
 }
 
 
 
 public static void main(String[] args) {
  
  Yapilandirici cs=new Yapilandirici();

 }

}

#constructor, #java, #java-dersleri, #yapilandirici

Overloaded

Java da Overloaded:

Javada metot parametreleri farkli olmak sartiyla (sira,sayi,tip,farklilidir.) tanimladigimiz metotlar constructorlar ; overloaded metotlar overloaded constructorlar ismini veriririz.

public class OverloadedTest1 {

 public static void main(String[] args) {

  overloaded(10, 100); // int
  // 10 --> int tipindedir.
  // 1.0 --> double tipindedir.
  // javada tamsayilar/integerlar varsayilan olarak "int" tipindedir.
  // noktali sayilar/kusuratli sayilar ise varsayilan olarak "double"
  // tipindedir.

  overloaded(1.0, 100); // 1.arguman double tipinde 2.arguman int tipinde
        // tam uyan metot(overloaded) yok bu nedenle
  // minimum yaklasim sergiler ve uyan en yakin metoda gider.
  overloaded(1.5, 1.567); //1.arguman ve 2.arguman double tipindedir.
  
  overloaded(1, 100.0); //1.arguman int tipinde 2.arguman double tipinde.
 }

 public static void overloaded(int a, int b) {
  System.out.println("int int");
 }
 

 public static void overloaded(double a, int b) {
  System.out.println("double int");
 }
 

 public static void overloaded(int a, double b) {
  System.out.println("int double");
 }

 public static void overloaded(double a, double b) {
  System.out.println("double double");
 }
}
       // double > float > int > short > byte sıralama bu şekildedir.

#java, #java-dersleri, #overloaded

Override

Java da Override:

Override türkçede ezmek, geçersiz kılmak anlamındadır. Bizim yapacağımız da budur  üst sınıftan alınan bir özelliği,alt sınıfta değiştirmektir.

class Animal{
 
 public void seslen()
 {System.out.println("Hayvannn");}
  
}

class Dogs extends Animal
{
@Override
public void seslen()
{
 System.out.println("Hav havv");
}
 
}

class Cats extends Animal
{
@Override
public void seslen()
{
System.out.println("Miyav miyavvv"); 
}

}


public class OverrideOrnek {

  public static void main(String[] args) {
 
  Cats kedi = new Cats();
 // Burada Cats sınıfına yazdığımız 'miyav' çalışır, animal sınıfından kalıttık ve override ile üzerine ezme yaptık.
  
  Dogs kop= new Dogs();// Dogs sınıfına yazdığımız çalışır.
  Animal hay = new Animal();//Animal sınıfında yazdığımız çalışır.
  Animal kopek= new Dogs();// Obje Dogs sınıfında tanımlandığından 'Hav Havv' yazdırır.
  kedi.seslen();
  kop.seslen();
  hay.seslen();
  kopek.seslen();
 }
/*Static metodlar ve değişkenler override edilemezler.
 * public > protected > default >private
 * Private sınırlı erişim old. override edilemezler.
 */




}

#java, #java-dersleri, #override

Kalıtım

Java da Kalıtım:
Nesne Yönelimli Programlama dillerinde kalıtım olgusu, bir sınıfta (class) tanımlanmış değişkenlerin ve/veya metotların (fonksiyon, procedure) yeniden tanımlanmasına gerek olmaksızın yeni bir sınıfa taşınabilmesidir. Bunun için yapılan iş, bir sınıftan bir alt-sınıf (subclass) türetmektir. Türetilen alt-sınıf, üst-sınıfta tanımlı olan bütün değişkenlere ve metotlara sahip olur. Bu özeliğe kalıtım özeliği (inheritance) diyoruz.



class Animal{
 
 public void seslen()
 {System.out.println("Hayvannn");}
  
}

class Dogs extends Animal
{
@Override
public void seslen()
{
 System.out.println("Hav havv");
}
 
}

class Cats extends Animal
{
@Override
public void seslen()
{
System.out.println("Miyav miyavvv"); 
}

}


public class OverrideOrnek {

  public static void main(String[] args) {
 
  Cats kedi = new Cats();
 // Burada Cats sınıfına yazdığımız 'miyav' çalışır, animal sınıfından kalıttık ve override ile üzerine ezme yaptık.
  
  Dogs kop= new Dogs();// Dogs sınıfına yazdığımız çalışır.
  Animal hay = new Animal();//Animal sınıfında yazdığımız çalışır.
  Animal kopek= new Dogs();// Obje Dogs sınıfında tanımlandığından 'Hav Havv' yazdırır.
  kedi.seslen();
  kop.seslen();
  hay.seslen();
  kopek.seslen();
 }
/*Static metodlar ve değişkenler override edilemezler.
 * public > protected > default >private
 * Private sınırlı erişim old. override edilemezler.
 */




}

#inheritance, #java, #java-dersleri, #kalitim

Enum

Java da Enum:
Enum(Enumaration) tanımlamaları programlama dillerinde belirli değerlere karşılık gelen sabit değerlerin temsili için kullanılırlar, haftanın günleri, bir şeyin boyutu,ölçüsü vs gibi. Geliştiriciye sağladığı faydalar ise kod okunabilirliğini arttırması, muhtemel değer kümesinin daraltılması ve tip güvenliğini sağlaması dolayısıyla hata payını en aza indirmesi.Daha okunabilir kod için enumlar kullanılmalıdır.


public enum EnumOrnek {

}
class Coffe{
enum Coffee{
 SHORT,TALL,GRAND,VENTI;
 
 
 }
Coffee size;// Bu şekilde Coffee 'size' olarak endeks edebiliriz.

/* Enum bir anahtar kelimedir.
 * Coffees sınıfında bu kadar fazla kod yazacağımıza enum anahtar kelimesinde tanımlamamız yeter.
 */

/*
public static final String TALL = "TALL";
 public static final String VENTI = "VENTİ";

 public static final String GRAND = "GRAND";
//Bu kadar kod yazacağımıza enum kullanarak kod fazlalığını önlemiş olduk.

 public static void main(String[] args) {
  Coffe coffee = new Coffe();
  
 System.out.println(coffee.size.TALL);
 System.out.println(coffee.size.VENTI);
 System.out.println(coffee.size.GRAND);
// Bu şekilde enumları yazdırabiliriz.

}

}

//Enumlara integer değerler de verebiliriz.



public class EnumlaraDevam {

  enum CoffeSize{
  
  SHORT(3),TALL(6),GRAND(8),VENTI(10);
  CoffeSize(int Price)
  {
   this.setPrice(Price);
  }
  public int getPrice() {
   return Price;
  }
  public void setPrice(int price) {
   Price = price;
  }
  private int Price;
 }
 
 
 
 public static void main(String[] args) {
 
  System.out.println(CoffeSize.GRAND);
  System.out.println(CoffeSize.SHORT.Price);
  //Burada Price çağırdığımız zaman SHORT'a tanımladığımız sayıyı çağırmış oluyoruz.
  System.out.println(CoffeSize.TALL);
  System.out.println(CoffeSize.VENTI.Price);
  
  for (CoffeSize cs:CoffeSize.values())
//For da : yazdırma tanımlı bir dizi ya da sayı topluluğu varsa bütün değerlerini yazdırır.
  {
   System.out.println(cs + " " + cs.getPrice() );
  }
//Burada SHORT 3 TALL 6 GRAND 8 VENTI 10 şeklinde yazdırdı.
  
 }

}

#enum, #java, #java-dersleri