OCP-I Chapter 1 Welcome to Java-III

Java'da Paket Yapısı

Java programlama dilinde sınıfları mantıksal olarak sınıflandırmamıza yarayan yapılara paket denir.Java , içerisinde binlerce built-in paket ile gelir.JDK' ya ait paketler java ve javax ile başlar.Bir paketi kodumuza ekleyip o paketteki sınıfları kullanabilmemiz için ilgili paketi kodumuza import etmemiz gerekmektedir.Kullandığımız herhangi bir sınıfın paketini import etmezsek kodumuz hata verir.Java da import edilmeden kullanılan tek sınıf System sınıfıdır.Ekrana bir satır basmak için kullanılan System.out.println(); ifadesindeki System sınıfı java.lang paketindedir ve bu paketi dışarıdan import etmemize gerek yoktur bu paket otomatik olarak import edilir.

Paket yapısı ile ilgii kod örneğimizi inceleyecek olursak;

import java.util.ArrayList;

public class MrRobot { 

    public static void main(String... args) {
        ArrayList<String> names = new ArrayList<String>();
        System.out.println(names.toString());
    }
}

kodumuzda main metodu içerisinde ArrayList sınıfından bir nesne oluşturduk dikkat edecek olursanız sınıf tanımının üstünde ArrayList sınıfını import ettiğimizi görürsünüz.Eğer bu import etme işlemini yapmazsak kodumuz hata verir.

Java'da bir paket altındaki tüm sınıfları koda import etmek mümkündür bunu yapmak için * operatörünü kullanırız.Yukarıdaki kodda java.util paketi altındaki tüm sınıfları import etmek için aşağıdaki ifade kullanılır.

import java.util.*;

Burda dikkat etmemiz gereken en önemli husus şudur ki; * operatörü paket içerisindeki sınıfları import eder alt paketleri koda dahil etmez.

İsim Çakışmaları

Farklı paketler içerisnde aynı isimde paketler bulunabilir.Bu gibi durumlarda conflict(çakışma) olmaması için kullanılacak sınıfın hangi paket altında olduğu açıkça belirtilmeli derleyici hangi paket olduğunu anlamalıdır.Kod üzerinden örnek verecek olursak;



public class MrRobot { 
    Date birthdate;
}

kodumuzda Date türünde bir alan vardır fakat bu Date sınfının hangi pakette olduğu belli değildir.Date isminde sınıf içeren iki paket vardır bunlar java.util.Date ve java.sql.Date dir.

Kodumuzu aşağıdaki şekilde değiştirirsek neler olur gelin beraber inceleyelim;


import java.util.Date;
import java.sql.Date;

public class MrRobot { 
    Date birthdate;
}

bu durumda derleyici hangi paketteki Date sınıfını kullanacağına karar veremez ve aşağıdaki hatayı fırlatır.

error: reference to Date is ambiguous

Peki bu durumda ne yapmamız gerekir bu durumda Java ya hangi paketi kullanması gerektiğini açıkça bildirmemiz gerekir yani hangi paketteki Date sınıfını kullanmamız gerektiğine karar verip diğer import ifadesini kaldırmalıyız.

Bir başka çözüm adımıda şu olabilir;


import java.util.*;
import java.sql.Date;

public class MrRobot { 
    Date birthdate;
}

gelin beraber düşünelim acaba Java burada hangi paketteki Date sınıfını kullanacak? Derleyici açıkça belirtilmiş sınıf ismini karakterine göre önceliklendirir.Yani *java.sql paketindeki Date sınıfı kullanılır.

Gelin durumu biraz daha zorlu hale getirelim diyelim ki programcı her iki paketteki Date sınıfınıda kodunda kullanmak istiyor bu durumda ne yapması gerekir? Cevabımızı kod üzerinden anlatacak olursak;


import java.sql.Date;

public class MrRobot { 
    Date birthdate;
    java.util.Date otherDate;
}

yada



public class MrRobot { 
    java.sql.Date birthdate;
    java.util.Date otherDate;
}

yukarıdaki iki kod bloğuda sorumuzun cevabıdır.

Yeni Paket Oluşturmak

Eğer paket tanımlamazsak kodumuz default package içindedir.Yeni paket oluşturmak için aşağıdaki yapı kullanılır.

package package_name;

Paket İle Çalıştırma

Paket içierisndeki kodlarımızı javac ile derlemek için;

javac packageName/MrRobot.java

bir paket altındaki tüm sınıfları derlemek için

javac packageName/*.java

komutları kullanılır.

Alternatif Derleme Klasörü

Varsayılan olarak kaynak kodlar ve derlenmiş kodlar aynı klasör içindedir.Derleme sırasında derlenmiş kod için yeni bir yol belirtebiliriz bu işlem aşağıdaki gibi yapılır.

javac -d alternateDirectory package/MrRobot.java

derleme sonucu üretilen .class dosyaları alternateDirectory içerisine yerleştirilir.

Derleme sonucu oluşan .class dosyalarını kullanıp programımızı çalıştırma aşamasında alternatif klasörün yolunu java ya bildirmemiz gerekir bunu 3 farklı şekilde yapabiliriz.

java -cp alternateDirectory package.MrRobot
java -classpath alternateDirectory package.MrRobot
java --class-path alternateDirectory package.MrRobot

yukarıdaki üç komutta aynı işlemi yapar.

Jar Dosyasıyla Birlikte Derleme

Derleme işlemimize herhangi bir jar dosyasını dahil edebiliriz bunu Linux işletim sisteminde aşağıdaki şekilde yaparız.

java -cp ".:/temp/otherLocation:/temp/myJar.jar" package.MrRobot

yukarıdaki kodda : ile ayrılmış kısımlara dikkat edecek olursak;

  • derleme işlemine /temp/otherLocation içindeki tüm jar dosyaları alınır fakat alt klasörler alınmaz

  • aynı zamanda /temp/myJar.jar dosyasıda derleme işlemine dahil edilir.

Yeni Jar Dosyası Oluşturma

Aşağıdaki komutlar yardımı ile jar dosyaları oluşturabiliriz.

jar -cvf myNewJar.jar

jar --create-verbose-file myNewJar.jar

herhangi bir klasör içine jar dosyası oluşturmak için

jar -cvf myNewJar.jar -C directory

Paket ile Birlikte Tek Satırda Derleme

Eğer programımızı javac kullanmadan tek satırda java java komutu ile derlemek istiyorsak tek şart şudur;Programımız JDK paketleri hariç başka bir paketi import etmemelidir.

Sınıf Elemenlarını Sıralama

  1. package
  2. imports
  3. class decleration
  4. fields
  5. methods

1,2,3 sıralaması şarttır 4 ile 5 nolu elemanlar yer değiştirebilir.

OCP Chapter 1 sonuna geldik bir sonraki chapterda Java yapı bloklarını anlatarak devam edeceğiz.