You are on page 1of 82

Eclipse ile Java Laboratuvar Klavuzu (J2sdk v1.4.

2)

Yusuf Kenan YILMAZ v1.50 16 Haziran 2007

Sibnet Java eitimleri laboratuvar almas kitapdr. 2007

Sibnet letiim Bilgileri Tel Faks Web : 0216-658 80 84 (pbx) : 0216-658 80 85 : www.sibnet.com.tr

Dier Java & J2EE & WebSphere eitimlerimiz


Kod SW225 SW243 SW233 SW257 SW530 SW237 SW246 SW569 Kurs Application Track IBM WebSphere JSP and Servlet Development with Introduction to EJBs Introduction to Java using IBM WebSphere Studio Application Developer IBM WebSphere Studio Application Developer Bootcamp Using EJBs to Develop Enterprise Apps with WebSphere Studio 5.0 IBM WebSphere Portal Version 5 Installation and Deployment Developing Web Applications with WebSphere Studio 5.0 Admin Track Administration of WebSphere App. Server Portal Track IBM WebSphere Portal 5.1 Application Development Gn 5 5 5 5 5 3 4 3

Sibnet Java Eitimi Lab almas

indekiler Lab 2: Literals .................................................................................................................................... 4 Lab 3: Building Classes ....................................................................................................................... 7 Lab 4: Inheritence ............................................................................................................................ 12 Lab 5: Interface ............................................................................................................................... 19 Lab 6.1: Java Collections ................................................................................................................. 22 Lab 6.2: Java 2 Collections Clone & Sort ........................................................................................ 27 Lab 7: MultiThreaded Programming................................................................................................... 32 Lab 8: Exception Handling ................................................................................................................ 39 Lab 9: I/O Stream ............................................................................................................................ 45 Lab 10: Object Serialization............................................................................................................... 50 Lab 11: RTTI & Reflection................................................................................................................. 53 Lab 12: Applet API ........................................................................................................................... 56 Lab 13: RMI ..................................................................................................................................... 59 Lab 14: Utility Classlar ..................................................................................................................... 64 Lab 15: Java 2 Security..................................................................................................................... 68 Lab 16: JDBC ................................................................................................................................... 70 Ek-A : Swing API .............................................................................................................................. 72 Ek-B : Java tools (native2ascii).......................................................................................................... 75 Ek-C : Java SDK ............................................................................................................................... 76 Ek-D: JavaDoc ................................................................................................................................. 79 Ek-E Eclipse Notlar........................................................................................................................... 81

Sibnet Java Eitimi Lab almas

Lab 2: Literals

Literals ve Operators 1. Aadaki kodda hata nedir? Nasl dzeltilir? float f; f=7.1; 2. y'nin deeri nedir? int x = 3; int y = x << 3;

3. Aadaki satrda b'nin deeri nedir? int x=3; int z=5; boolean b = (x==z); 4. num1=5 ve num2=0 veriliyor. Aadaki ilemlerin sonunda saylarn deeri ne olur? a) num2=num1++; b) num2=++num1; 5. Aadaki ilemin sonucu nedir? System.out.println(1 + 2 + 3 6. Aadaki ilemin sonucu nedir? int i=9; int j=3*3; System.out.println(i==j==false); Scope Aadaki main() metodunun kts nedir?
class ScopeTest { static int classTotal=0; public static void main(String[] args) { int methodTotal=75; classTotal=100; System.out.println("classTotal = " + classTotal); System.out.println("methodTotal = " + methodTotal); minor(); System.out.println("Back in main, classTotal = " + classTotal); System.out.println("methodTotal = " + methodTotal); } public static void minor() { int methodTotal=55; classTotal=120; System.out.println("In minor, classTotal = " + classTotal); System.out.println("In minor, methodTotal = " + methodTotal); } }

+ " eittir " + 1 + 2 + 3);

String
Sibnet Java Eitimi Lab almas

Java'da String zel bir Object tipidir, primitive tip deildir. Ancak ok kullanldndan dolay dier Object tiplere gre zelletirilmitir. Her String nesnesi read-only'dir. Dier bir deyile String nesneleri immutabledr. rnein, aadaki rnekte ikinci satrdan sonra str referans heapde farkl bir adresi gsterir. String str = "Hello"; str = str + " world";

Anonymous String. Aadaki rnekte str1 ve str2 referanslar ayn String nesnesini gsterir.
String s1 = "Hello"; String s2 = "Hello";

immutable object : statei bir kere olutuktan sonra bir daha deimeyenobjectler immutabledr. Stringclass ve Integer class immutabledr. String Nesnelerini Karlatrmak == operatr String karlatrma amacyla kullanlmamaldr. rnein bu operatr aadaki rneklerde farkl sonular verir. String s1 = "armut"; String s2 = "armut"; String s3 = new String("armut"); if (s1 == s2) // 1 System.out.println(true); // true if (s1 == "armut") // 2 System.out.println(true); // true if (s1 == s3) // 3 System.out.println(true); // false String - StringBuffer Append (ya da String birletirme) ilemi String ve StringBuffer nesnelerinden hangisi iin daha hzl alr? rnein String a iin aadaki toplama (yani ekleme) ileminin yapldn varsayn. String a = new String("hello"); a=a+"merhaba"; StringBuffer iin ise aadaki ilem yaplmaktadr. StringBuffer sb1 = new StringBuffer("hello"); sb1.append("merhaba"); Hangisi daha hzldr? Bu soruyu yantlamak iin bir class yazn.

Yantlar Literals 1. f=7.1f;


Sibnet Java Eitimi Lab almas

2. y=3*2^3=24 3. b=false 4. a) num1=6 num2=5

b) num1=6 num2=6
5. 6 eittir 123 6. false

Scope: classTotal = 100 methodTotal = 75 In minor, classTotal = 120 In minor, methodTotal = 55 Back in main, classTotal = 120 methodTotal = 75 String-StringBuffer package sib.collections; public class StringBufferX { public static void main(String[] args) { String a = new String("hello"); int loop = 1000; long t1 = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { a = a + "merhaba"; } long t2 = System.currentTimeMillis(); System.out.println(t2 - t1); StringBuffer sb1 = new StringBuffer("hello"); t1 = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { sb1.append("merhaba"); } t2 = System.currentTimeMillis(); System.out.println(t2 - t1); System.out.println(a); System.out.println(sb1); } }

Sibnet Java Eitimi Lab almas

Lab 3: Building Classes Constructor Elma e1 = new Elma() ifadesinde son parantezler Elma()'nn bir metod olduunu gsterir. Class ile ayn ad tayan metoda constructor denir. Eer constructor parametre almaz ise zero-argument constructor adn alr. Eer bir constructor parametre almaz ve gvdesi bo ise default constructor adn alr. Bir class tanm iinde default constructor tanmlanmam ise JVM otomatik olarak bir default constructor varsayar.
Elma constructor

1. Elma class'na aadaki constructor'lar ekleyin: Elma() { } Elma(String r) { Renk = r; }

2. imdi Start.java programn aadaki gibi deitirin. Artk Elma nesnelerinin renklerini yaratlrken atayabilirsiniz. class Start { public static void main(String args[]) {
Elma e1 = new Elma("Krmz"); System.out.println(e1.getRenk()); } }

Overloading Birden fazla metod ayn ismi alabilir. Ancak bu metodlarn en azndan parametre tipleri (veya saylar) ayrt edici zellikte olmaldr. 1. Bir classn birden fazla constructor'u olabilir. Elma class tanmna aadaki constructoru da ekleyin. Bu constructor Elma nesnelerini yaratlrken renklerin saysal verilmelerini salar (1: yeil, 2: krmz gibi) Elma(int i) { switch (i) { case 1 : setRenk("Yeil"); break; case 2 : setRenk("Krmz"); break; case 3 : setRenk("Sar"); break; default : setRenk("Mor"); break; } }
Sibnet Java Eitimi Lab almas

2. imdi Start.java programnza aadaki deiiklii yapn: Elma e1 = new Elma(2); System.out.println(e1.getRenk());

Garbage Collector Aadaki kodu inceleyin: Elma e2 = new Elma("krmz"); Elma e3 = new Elma("yeil"); e2=e3; lk iki satr heap'de iki Elma nesnesi iin yer ayrlmasna sebep olur. Son satr e2'nin e3' gstermesini salar. Bylece e2 iin ayrlan bellek alan sahipsiz kalr. Aada da null assignment heapde ayrlan bellein sahipsiz kalmasna yol aar. Elma e1 = new Elma("Yeil"); e1 = null;

Elma e1 = new Elma(yeil)

e1 = null;

e1

e i l

e1

e i l

unreferenced object

Aadaki kod garbage collector'u devreye sokar. Garbage collector bir class'n finalize() metodu varsa o nesneyi heapden silmeden nce bu metodu arr.

Garbage Collector JVM iinde dk ncelikli bir threaddir. Sistem younken devreye girmez. Programc
normalde Garbage Collectoru armak iin bir ey yapmaz. Garbage Collector arka planda alr. Ancak aadaki kodda Garbage Collector System.gc() ile zellikle devreye sokulmutur. Bunu test etmek iin: 1. Elma class'na aada finalize() metodunu ekleyin: public void finalize() { System.out.println("bye"); } 2. Start.java iinde aadaki deiiklii yapn: // garbage collector Elma e2 = new Elma("krmz"); Elma e3 = new Elma("yeil"); e2=e3; System.gc();
Sibnet Java Eitimi Lab almas

Parameter Passing Parametreler metodlara geirilirken ya by value ya da by reference (by address) geirilir. Java'da btn parametreler metodlara by value geer. Parametre tipi primitive ise (int, char, float gibi) primitive deer stack stne kopyalanr. Metod parametreleri stack stne kopyalanan bu deerlere initialize edilir. Parametre tipi Object ise (aslnda variablelar hibir zaman Object olamaz, Object reference demek daha doru olur) bu kez Object reference stack stne kopyalanr. Metod alrken bu referens deerlerini kullanr. Ancak 1. 2. 3. Object reference stack zerine kopyalansa da metod gerek Object zerinde alr. Sonu olarak: primitive tipler method tarafndan deitirilemezler, object tipler metod tarafndandeitirilirler, immutable Object tipler (String ve Integer classlar gibi) metod tarafndan deitirilemezler.

By reference parametre geiinde Object adresleri stacka kopyalanmaz, metod parametreleri dorudan gerek parametreleri gsterir. Teknik deyimle actual parametrelerin l-valuelar formal parametrelerin lvaluelar eittir.
Aadaki rnekte bu iki durum karlatrlmtr: public class ParameterPassing { public static void main(String[] args) { int a=5; System.out.println("a= " + a); asgA(a); System.out.println("a= " + a ); StringBuffer s = new StringBuffer("Merhaba"); System.out.println("s= " + s); asgS(s); System.out.println("s= " + s ); } static void asgA(int x) { x=30; } static void asgS(StringBuffer x) { x.append(" Dnya"); } } Bu programn kts nedir? Encapsulation Aadaki main() metodunu inceleyin. e1 nesnesinin rengi nasl set edilmi? e1.setRenk("krmz") yerine dorudan Renk property'si zerinde ilem yaplm. OO dillerde property'lere dier nesnelerden dorudan eriilmesi yerine getter/setter metodlaryla ilem yaplmalar genel bir kuraldr.

Sibnet Java Eitimi Lab almas

10

public static void main(String[] args) { Elma e1 = new Elma(); e1.Renk = "Krmz"; System.out.println(e1.getRenk()); } Elma class'nn Renk property'sini korumaya aln: class Elma{
private String Renk;

Yukardaki main() artk almayacaktr. Package Package kabaca dizine (ya da folder) karlk gelir. Bir package yaratmak aslnda bir dizin yaratmaktr. JVM'nin arad classlar bulabilmesi iin (default dizinde deilse) class'n bulunduu dizinin belirtilmesi gerekir. letim sistemlerinde dizinler-alt dizinler \ ile ayrlrken (rnein c:\winnt\system32...) package'ler . (nokta) ile ayrlrlar. (rnein java.util package'i aslnda ..\java\util dizini demektir). Class'n iinde ardnz ancak farkl package'lerde bulunan dier class'lar belirtmek iin import kullanlr.

1. com.xnet.p1 ve com.xnet.p2 adl iki package yaratn. 2. com.xnet.p1 altnda Elma.java, com.xnet.p2 altnda Start.java class'lar oluturun. Start iindeki main() aadaki gibi olabilir: Elma e1 = new Elma(2); System.out.println(e1.getRenk()); 3. Start.java'y altrn. Elma class'n bulamayacaktr. 4. imdi Start iindeki main() metodunu aadaki gibi deitirip altrn: com.xnet.p1.Elma e1 = new com.xnet.p1.Elma(2); System.out.println(e1.getRenk());
Alternatif olarak aadaki de alr:

import com.xnet.p1.Elma; ... Elma e1 = new Elma(2); System.out.println(e1.getRenk());

static keyword static keyword ile nitelenen property (field) ya da metod bir class'n nesnesine deil, kendisine aittir.
Static variable ve static metodlara class variable / class metod da denir. Metod iinde static variable tanm yaplamaz. Metod iinde sadece local variable tanmlanr.

class'n

Her new Elma() ifadesi yeni bir Elma nesnesi yaratr. Herhangi bir anda toplam ka tane Elma nesnesi yaratldn bulabilir miyiz? 1. Elma classna bir static property ekleyin:

Sibnet Java Eitimi Lab almas

11

static int cnt = 0;

2. Elma class'nn constructor'larn her seferinde cnt'yi arttracak ekilde dzenleyin:


Elma() { cnt++; } Elma(String r) { cnt++; Renk = r; }

3. Birka tane Elma nesnesi yarattktan sonra static deikene erimek iin aadaki kural kullann:
System.out.println(Elma.cnt);

4. static deikene class ad yerine nesne zerinden de eriirsiniz ancak ou compiler bu satra uyar verecektir:
System.out.println(e1.cnt);

Static initializer Static deikenler Class JVM tarafndan yklendii anda (o class iin Heapde bir Class classndan instance olutuunda) initialize edilir (classn bir static metodu arldnda ya da classdan yeni bir instance elde edildiinde). Peki ya bir static deikeni initialize etmek iin birden fazla statement verekirse ne olacak? rnein static bir DataSource nesnesini JNDIden bulup nasl initialize edebiliriz? static code block ile statik deikenler initialize edilebilir. Aadaki rnekte static { } blou sadece bir kere, JVM class ykledii anda alacaktr.
Class Data { static int i; static { i=3+5; i=9; } ... }

Not: Birden fazla static initializer block olabilir. Compile hepsini birletirir.

Yantlar Paramater Passing


a= a= s= s= 5 5 Merhaba Merhaba Dnya

Sibnet Java Eitimi Lab almas

12

Lab 4: Inheritence Inheritence Elma class'n daha nce tanmlamtnz. Elma class'nn daha zellemi hali YElma class'na gereksinim duyuluyor. Bu almada da YElma classn yazacaksnz. 1. yelma adl yeni bir package yaratn. 2. Dier paketlerin birinden Elma classn yelma paketine kopyalayn. 3. YElma adl yeni bir class yaratn. main() metodu olmasn. YElma classnn Elma classndan tretilmi olduunu gstermek iin aadaki yazm kuraln kullann: class YElma extends Elma 4. Yaratlan her YElma nesnesinin renginin yeil olmas iin default constructor'u deitirin: public class YElma extends Elma { YElma() { setRenk("Yeil"); } } imdi yeni bir Start.java yaratn. main() metoduna aadaki satrlar yazarak default constructor'un altn test edin. Dikkat edecek olursanz YElma class tanmnda getRenk() adnda bir metod yoktur. Bu method YElma'nn superclass'nda tanmldr. Ancak YElma bu metodu sanki kendinde tanmlym gibi kullanabilir.
YElma ye1 = new YElma(); System.out.println(ye1.getRenk());

5. YElma constructor'unda aadaki deiiklii yapn. super() keyword YElma'nn superclass' Elma'nn constructor'unu armak iin kullanlr. Elma class'nn birden fazla constructoru olabilir ancak Elma(String) imzal (method signature konusunu hatrlayn) constructor devreye girecektir. YElma() { //setRenk("Yeil"); super("yeil"); } SuperClass ye1 nesnesinin superclass'nn adn renmek istiyoruz. main() metodunda ne eklememiz gerekir? toString() Metodu System.out.println() metoduna Elma ve YElma nesnelerini geirdiimizde standart outputa (genellikle ekrana) anlaml bir mesaj ksn istiyoruz. System.out.println() methodu parametre olarak verilen nesnenin (varsa) toString methodunu kullanarak onun String tipinde mesajn yazabilir. toString() methodunu Elma class'na ekleyebiliriz.

public String toString()


Sibnet Java Eitimi Lab almas

13

{ return "Bu elma " + getRenk()+ " renktedir"; } imdi Start.java main() iine aadaki satr ekleyin: System.out.println(ye1); toString() metodu Object class'nn (btn class'larn superclass') bir metodudur. Bir classda override edilmedike Object iindeki toString() alr. Bu metod ise nesnenin class ile beraber hashCode() unu hex olarak dner. Yani : toString : com.sibnet.lab.Elma@(hex of Object.hashCode()

Method Overriding Yukardaki rnekte toString() metodu Elma class'na eklenmitir. YElma class' da bu metodu superclass' araclyla kullanr. Ancak YElma class' da isterse toString() metodunu yeniden tanmlayabilir. O durumda System.out.println ye1 parametresini grdnde toString() metodunu Elma'dan deil YElma'dan kullanr. 1. YElma class'na aadaki toString methodunu ekleyin: public String toString () { return "yeil_toString: Bu elma yeil renktedir"; } 2. imdi Start.java aadaki satra hangi kty retiyor? System.out.println(ye1); final Metotlar final metodlar override edilemez. rnein aadaki Elma metodu getRenk() YElma snf iinde yeniden tanmlanamaz. final public String getRenk() { return renk; } super ve this (ve instance variable overriding) YElma iinde renk deikeni tanmlayabilir miyiz? Elma iinde renk deikeni olduunu unutmayn. Evet. Subclasslar Superclass iindeki instance variablern aynsn tanmlayabilirler. Subclass her iki deikeni de super ve this yardm ile kullanabilir. YElma iinden super.renk Elma iindeki renk nesnesini, this.renk ise YElma iindeki renk resnesini gsterir. Metod lookup Ayn mantk override edilen metodlar arrken de geerlidir.
Sibnet Java Eitimi Lab almas

14

YElma iinden super.toString() metodu arldnda Elma iindeki toString (ya da orada bulamazsa daa superclasslardaki) kullanr. Yani super.f() ifadesinde method lookup superclassdan balar. Bulamaz ise daha st class larda arar: class YElma { public void setRenk(String renk) { this.renk = renk; String s = super.toString(); } rnein bu durumda toString ilk olarak Elma classnda aranr, bulamaz ise Object classndaki kullanlr. Polymorphism Method overriding Bir class hiyerarisinde, superclass ve subclass ayn method signaturelarn tayorlarsa bir nesne hangi constructor ile yaratlm ise (new keywordu ile arlan) o classdaki metod dikkate alnr. 1. Elma classna aadaki toString() metodunu ekleyin. public String toString() { return "Elma: " + Renk; } 2. YElma classna ise aadaki toString() metodunu ekleyin. Her iki metodda da kime ait olduu bilinsin diye class ad yazldna dikkat edin. public String toString() { return "YElma: " + Renk; } 3. imdi Start.java main() iinde aadaki tanmlar yapn. Programn kts olarak ne bekliyorsunuz? Hangi classdaki toString() metodu arlacak? Elma e = new YElma(); System.out.println(e); 4. imdide ak olarak hangi metodu armak istediimizi belirtelim. Sonu deiti mi? System.out.println(((Elma)e).toString()); Polymorphism rnei ve Run Time (Dynamic) Metod Binding Aadaki kodun ktsn inceleyin: Vector v = new Vector(); v.add(new Integer(5)); v.add(new Elma("Krmz")); v.add(new String("Merhaba")); for (int n = 0; n < v.size(); n++) { Object o = v.get(n); System.out.println(o); }

Sibnet Java Eitimi Lab almas

15

kt: 5 getrenk: Krmz Merhaba System.out.println(o) ifadesinde, System.out.println o nesnesinin toString() metodunu arr. Ancak toString metod adnn gerek alacak kod ile ilikilendirilmesi ancak run-time srasnda (dynamic) olur. Buna Dynamic binding denir. (binding ; metod adnn kod ile ilikilendirilmesi). teyandan Object o = v.get(i) satrnda upcasting yaplmtr. Run timeda toString metodunun aranmas (metod lookup) gerekte yaratlan objectte balar. Yukardaki rnekte Elma class dahil btn classlar toString metodunu override etmitir. Bu nedenle System.out.println(o) satr her nesnenin kendi toString metodunun arlmasna sebep olur. Subclass-superclass assignment Upcasting new ile subclassdan (ya da derived class) yaratlan bir nesne her zaman superclass (ya da base class) tipinde bir referansa( reference; nesne adresi) atanabilir. Buna upcasting denir. Upcasting her zaman gvenle yaplabilir. Yukardaki altrmada compiler aadaki satra hata verdi mi? Elma e = new YElma(); DownCasting

Downcasting ise bir derived class referansa base class nesnesnin atanmasdr. Downcasting upcasting gibi
gvenli deildir. Uygun olmayan durumlarda downcasting ClassCastException yaratr. imdi u satr deneyin: YElma ye = new Elma(); Compiler bu satra hata verdi mi? Bunu dzeltmek iin explicit casting yapmanz ( ak yazmanz ) gerekir. YElma ye = (YElma) new Elma(); Program altrdnzda ne oluyor? Program altrdnzda (runtimeda) ClassCastException hatas alrsnz. JVM Elma nesnesini YElma tipinde bir nesneye dntremez. Ancak aadaki gibi durumlarda downcasting hata vermeden alr. ex nesnesinin zaten orijinalinde YElma snfna ait olduuna dikkat edin. Elma ex = new YElma(); // downcasting //YElma ye1 = new Elma(); // Compile time Error //YElma ye2 = (YElma) new Elma(); // Runtime // Error:ClassCastException YElma ye3 = (YElma) ex; // OK.

Sembol Resolution Aadaki kodun kts nedir? class A { String s; A() { s = "Class_a"; }

Sibnet Java Eitimi Lab almas

16

} class B extends A { String s; B() { s = "class_b"; } String print() { return "class_b_print"; }; } class C extends B { String s; C() { s = "class_c"; } void m(String s) String p = String q = String w = String r = { s; this.s; super.s; ((A) this).s;

System.out.println(p); System.out.println(q); System.out.println(w); System.out.println(r); System.out.println(print()); } String print() {return super.print();} public static void main(String[] args) { C t = new C(); t.m("knidos"); } }

Access Modifiers
private Bir derived class (subclass) bir base (superclass) classn btn metodlarna sahip olabilir mi? 1. Elma.java iinde setRenk() metodunu private yapn. private void setRenk(String r) { Renk=r; } 2. Start.java iinde yeni bir YElma nesnesi yaratn: YElma ye = (YElma) new YElma(); ye.setRenk("Krmz"); Compiler ye.setRenk("Krmz") satrna hangi mesaj veriyor?

protected 1. Daha nce yaratlmam ise com.xnet.p1 ve com.xnet.p2 adl iki package yaratn. 2. com.xnet.p1 iine Elma.java, com.xnet.p2 iine YElma.java classlarn koyun. Daha nceden bu classlar var ise onlar da kullanabilirsiniz.

Sibnet Java Eitimi Lab almas

17

3. Elma.java iinde setRenk() aadaki gibi tanmlansn: void setRenk(String r) { Renk=r; } 4. YElmann constructorunu aadaki gibi tanmlayn. Compiler setRenk() satrna hangi hatay veriyor? YElma() { setRenk("yeil"); } 5. Bu hatay dzeltmek iin Elma classndaki setRenk() metodunu public yapabilirsiniz. Ancak public, bu metodun herhangi bir nesne iinden arlabilmesi anlamna geliyor. Oysa siz bir subclassn iinden superclassnn bir methodunu armak istiyorsunuz (o metod zaten inheritance ile geliyor). Bunun iin protected keywordn kullann. Yani Elma.java iinde setRenk()i aadaki gibi deitirin: protected void setRenk(String r) { Renk=r; } Default access modifier Soru: Hi bir ey yazmadnz zaman (public, protected ya da private) bir method ya da propertynin default access modifier nedir? Compilation Unit Bir source dosyas iinde birden fazla class tanm yazabilirsiniz. Bu dosyann tamamna compilation unit denir. Ancak bir compilation unit iinde sadece bir public class tanm olabilir. Ve sadece bu Java source iinde main() methodu olabilir. Herhangi bir package iinde daha nce yarattnz YElma.java ve Start.javay ayn dosya iine alarak bu durumu test edin.

Yantlar SuperClass ad Class c = ye1.getClass().getSuperclass(); System.out.println(c.getName());

Sembol Resolution knidos class_c class_b Class_a class_b_print void m(String s) { String p = s; // method parameter s String q = this.s; // class C property s String w = super.s; // class B propert s String r = ((A) this).s; // class A property s

Sibnet Java Eitimi Lab almas

18

Default access modifier Hi biri. Verilmedii zaman ismi olmayan drdnc bir access modifier varsaylr. Bu access modifier friendli ya da package diye de bilinir. Bu access modifier o package iindeki btn methodlarn bu methoda erimesini salar.

Sibnet Java Eitimi Lab almas

19

Lab 5: Interface Interface Elma ve Armut class'larnn ayn method tanmlarna (ayn method signature ) uymalarn zorlayabiliriz. Bunun iin genel bir Meyve interface'i yazp, Elma ve Armut class'larnn implement etmesi gereken methodlar belirleyebiliriz.

1. Meyve Interface'ini oluturun. public interface Meyve { String getRenk(); void setRenk(String r); } 2. Elma class'n Meyve Interface'inden implement edin. Aadaki satr bunu salar. imdi artk Meyve iinde belirtilen methodlar Elma iinde tanmlamak zorundasnz. public class Elma implements Meyve { 3. Implement edilen methodlarn'un signature' ayn olmak zorunda ama gvdesi bo olabilir. rnein getRenk() methodunu aadaki iki biimde de implement edebilirsiniz: String getRenk() { return Renk; } Ya da public String getRenk() { //empty body return ; } 4. Aadaki satr deneyin? Ne sonu verdi? Meyve v; 5. Peki ya u satr? Meyve v2 = new Meyve(); Interface'lerin deikenleri olabilir ama Interfaceden yeni bir nesne (instance) yaratlamaz. imdi u satrlar test edin: Meyve v; v=new Elma("sar"); System.out.println(v.getRenk()); Bu konu (polymorphism) daha nce de allmt. new ile subclassdan (ya da derived class) yaratlan bir nesne her zaman superclass (ya da base class) tipinde bir referansa( reference; nesne adresi) atanabilir. Buna upcasting denir. Ama tersi downcasting her zaman mmkn deildir. Uygun olmayan durumlarda downcasting ClassCastException yaratr. Constant Deerler Bir interface iinde sabit deerler de tanmlanabilir. Aada IConst interfaceinde baz matematiksel sabitler tanmlanmtr. IConst ve Circle kodlarn yazp test edin.

Sibnet Java Eitimi Lab almas

20

IConst.java public interface IConst { double pi = 3.14; double e = 2.71; double getArea(); } Circle.java public class Circle implements IConst{ double rad; public double getArea () { return pi*rad*rad; }; Circle(double r) { rad = r; } public static void main(String[] args) { Circle c1 = new Circle(2.0); System.out.println(c1.getArea()); //Circle.pi=3.00; hata System.out.println(Circle.pi); } } 1. Circleda main() iinde pi deerini yazdrmak istiyoruz. Hangi satr eklerdiniz? 2. Circleda main() iinde pi deerini yaklak 3 almak iin aadaki satr ekliyoruz. Ancak hata veriyor. Neden? Circle.pi=3.00;

RMI Interface kavram RMI (Remote Method Invocation) gibi distributed programming konularnda okca bavurulan bir zelliktir. RMI serverdaki Java nesnelerinin remote sistem (client) zerinden eriilmesidir. Nesneler networkten geer. Networkte nesneleri tayon protokol Java Remote Method Protocol (JRMP) adn alr. Ancak CORBAnn tayc protokol IIOPyi kullanan RMI versiyonu da vardr (RMI-IIOP).

Serverda aadaki IElma interfacei ve onu implement eden Elma class olsun. public interface IElma { String getRenk(); void setRenk(String r); } public class Elma implements IElma{ String Renk; public String getRenk() {
Sibnet Java Eitimi Lab almas

21

return Renk; }; public void setRenk(String r) { Renk = r; }; Elma(String r) { Renk = r; } } Aadaki Main classnda server ve client olmak zere iki ayr blm bulunmaktadr. Bu kod gerek bir RMI uyarlamas deildir. Gerekte Main iindeki server site ksm RMI server tarafnda alan, client taraf ise remote siteda alan iki ayr classdr. Ayrca RMI iin naming gibi ilemler de gereklidir. Ancak burada Interface konusunun nasl ilem grd konusunda bir rnek bulunmaktadr. Server ksm bir elma nesnesi yaratp bir vector nesnesi iine koymaktadr. Client blmnde ayn nesne vectorden alnmaktadr. Vectorden nesneyi alrken nesnenin Object tipini (Elma) kaybettiini hatrlayn. Bu nesneyi cast ederek Elma nesnesine evirmemiz gerekir. Ancak bunu iin client tarafnda Elma classnn da bulunmas gerekir. Ancak Elma class iinde pek ok implementation (methodlarmzn nasl alt gibi) bulunmaktadr. Elma class kod bykl olarak uzun ve de gizli olabilir (en azndan client ile ayrntlar paylamak istemeyebiliriz). Oysa aadaki koddan da anlalaca gibi client tarafnda casting iin sadece IElma interfaceinin olmas yeterlidir. IElma interfacei sadece method adlarn tutar. Bu nedenle hem ksadr hem de iinde implementation yoktur. import java.util.Vector; public class Main { public static void main(String[] args) { // Server Site Vector v = new Vector(); Elma e1 = new Elma("green"); v.add(e1);

// Client (Remote site) IElma ex = (IElma) v.elementAt(0); System.out.println(ex.getRenk()); } } Yantlar Sabit Deerler Intefacedeki deerler sabit (final) ve static deerlerdir. Interfacei implement eden class iinden statik deerler gibi eriilebilir. Ancak assignment yaplamaz. System.out.println(Circle.pi);

Sibnet Java Eitimi Lab almas

22

Lab 6.1: Java Collections Vector Bir vector nesnesi ilk yaratld anda ka tane hcresi oluturulmutur? Baka bir adan soralm: add() methodu bir nesneyi vector nesnesinin hcresine eklerken, bu hcre hazr mdr? Yoksa her add() ilemi ilk nce bir hcre mi oluturur? Bunu renmek iin vector nesnesine 11 adet (her seferinde Integer deerini bir arttrarak) add() ilemi yapan bir class yazn. Class debugger ile altrn. v Vector nesnesinin iine debuggerdan bakn. v.addElement(new Integer(1)); Vector Aadaki satrda hata nedir? int i=9; Vector v = new Vector(); v.add(i); Vector Vector class' dinamik olarak byr. Her vector 'hcresi' ayr bir class tipinde nesne alabilir. 1. Aadaki gibi 4 adet nesne yaratn. String s = "Merhaba"; Vector v = new Vector(); Elma e = new Elma("sar"); int i[] = new int[]{2,3,7}; 2. Bu nesneleri depolayacanz vector nesnesini yaratn. Vector v2 = new Vector(); 3. Yukarda yarattnz nesneleri vector'e ekleyin. v2.add(s); v2.add(v); v2.add(e); v2.add(i); 4. imdi de vector nesnesinden nesneleri birer birer alp class isimlerini yazdralm: for (int c = 0; c<v2.size(); c++) { Class cls = v2.elementAt(c).getClass(); System.out.println(cls.getName()); } 5. Nesneler vector'e eklenirken class tiplerini kaybederler. Vector iine hepsi Object tipine dnr. Tekrar elde ettiimizde orijinal tipine evirmemiz (type casting) gerekir. Aadaki ilk satr vector iindeki aramay gsterir. int x = v2.indexOf(e); Elma e2 = (Elma) v2.elementAt(x); System.out.println(e2.getRenk());

Sibnet Java Eitimi Lab almas

23

Bu blmden itibaren Java 2 ile gelen Collection class'lar greceiz.

Properties 1. Input iin Notepad ile C:\p.txt adnda bir dosya yaratn: 2. Dosyann ierii aadaki gibi olmaldr: # yorum user = db2admin pass = pass 3. Aadaki Java program ile dosya iindeki deerlere eriin: package sib.colls; import java.io.FileInputStream; import java.util.Properties;

public class Prop { public static void main(String[] args) {

Properties props = new Properties(); try { // TR iin J2SE 1.42 native2acsii programn kullann props.load(new FileInputStream("c:\\p.txt")); } catch (Exception e) { e.printStackTrace(); } System.out.println(props.get("user")); } } Not: Eer properties dosyas Proje foldernn hemen altndaysa file path vermeden kullann. Iterator Iterator class Enumeration class'in yeni versiyonudur. 1. Aadaki kodu yazarak test edin. Vector nesnesinin Iterator nesnesi ile nasl okunduuna dikkat edin. Iterator nesnesinden remove ilemi ise gerekte Vector nesnesi zerinde etkilidir. Vector v = new Vector(); v.add(new String("1")); v.add(new String("2")); v.add(new String("1")); // iterator Iterator iter = v.iterator();

Sibnet Java Eitimi Lab almas

24

System.out.println("size= " + v.size()); while (iter.hasNext()) { System.out.println((String) iter.next()); iter.remove(); // remove from vector } System.out.println("size= " + v.size()); iter = v.iterator(); while (iter.hasNext()) { //nothing to print System.out.println((String) iter.next()); } 2. Programn ktsn yazn. Set Bu class matematikdeki kme tanmnn karldr. Bir kmede ayn isimli iki eleman olamaz. rnein A = {a,b,a} = {a,b} olur. Ayn ekilde bir Set nesnesine ayn eleman eklemenin etkisi yoktur. Aada Set nesnesinin elemanlarna erimek iin Iterator kullanlmtr. // set System.out.println("\nHashSet - near constant time complexity:"); v.add(new String("1")); v.add(new String("2")); v.add(new String("1")); Set hs = new HashSet(); hs.addAll(v); hs.add(new String("2")); // has no effect iter = hs.iterator(); while (iter.hasNext()) { System.out.println((String) iter.next()); } // System.out.println("\nTreeSet (ordered)- logaritmic time complexity:"); Set ts = new TreeSet(); ts.addAll(v); iter = ts.iterator(); while (iter.hasNext()) { System.out.println((String) iter.next()); }

Yukardaki programn kts nedir?

Set ve equals() metodu imdi Elma nesnelerini Set iine ekleyelim. Aadaki programn kts 3 ayr Elma nesnesidir. Set hs = new HashSet(); hs.add(new Elma("K")); // has no effect hs.add(new Elma("K")); hs.add(new Elma("K"));
Sibnet Java Eitimi Lab almas

25

Iterator iter = hs.iterator(); while (iter.hasNext()) { System.out.println( iter.next()); } Set iine eklerken add() metodu 3 Elma nesnesinin de ayn olduunu anlamaz. nk Elma nesnelerinin ayn olduunu test etmekiin equals() metodunu arr. equals() metodu Object classnda gelir. Default olarak referance karlatrmas yapar (e1==e2). Bu metodunun Elma iinde override edilmesi gerekir. Elma iinde equals() metodunu overide ederek yukardaki kodu tekrar deneyin. public boolean equals(Object obj) { if(this == obj) return true; if((obj == null) || (obj.getClass() != this.getClass())) return false; // object must be Test at this point Elma e = (Elma)obj; return (renk == e.renk) || (renk !=null && renk.equals(e.renk)); } public int hashCode() { int hash = HashCodeUtil.SEED; hash = HashCodeUtil.hash( hash, renk ); return hash; } Not: equals() metodu override edildiinde hashCode() metodu da override edilmelidir. Collection APIsinin (set, map, list) almas iin bu gereklidir. Birbirine eit olan objectler ayn hashCode() u vermelidir. Yani e1.equals(e2) ise e1.hashCode() = e2.hashCode() olmaldr.Tersi zorunlu deil. Yani Birbirine eit olmayan objectler farkl hash kodu retmek zorunda deil.

BitSet BitSet bitwise ilemler yapmak iin kullanlan bir class'dr. Aadaki kodun kts nedir? // BitSet System.out.println("\nbitSet:"); BitSet b = new BitSet(); b.set(0); System.out.println(b.size()); ArrayList ve LinkedList Aadaki programn kts nedir? import java.util.*; public class ListExample { public static void main(String args[]) { List list = new ArrayList();
Sibnet Java Eitimi Lab almas

26

list.add("Bernadine"); list.add("Elizabeth"); list.add("Gene"); list.add("Elizabeth"); list.add("Clara"); System.out.println(list); System.out.println("2: " + list.get(2)); System.out.println("0: " + list.get(0)); LinkedList queue = new LinkedList(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); queue.removeLast(); queue.removeLast(); System.out.println(queue); } }

Yantlar Iterator size= 3 1 2 1 size= 0 Set HashSet - near constant time complexity: 2 1 TreeSet (ordered)- logaritmic time complexity: 1 2 BitSet bitSet: 64 ArrayList ve LinkedList [Bernadine, Elizabeth, Gene, Elizabeth, Clara] 2: Gene 0: Bernadine [Clara, Elizabeth, Gene, Elizabeth, Bernadine] [Clara, Elizabeth, Gene]

Sibnet Java Eitimi Lab almas

27

Lab 6.2: Java 2 Collections Clone & Sort Cloneable Interface Bir objectin kopyasn clone() methodunu ararak oluturabilirsiniz. Bunun iin: Objectin class tanm Cloneable interfaceini implement etmeli. Cloneable interfacei bir marker interface. Yani hibir methodu yok. Sadece JVMye bu nesnenin clone() methodunu kullanabileceini sylyor. Class iinde clone() methodunu yazmalsnz. Bu clone methodu Object class iindeki clone() methodunu armal. Object classndaki clone() protected methoddur. Baka bir classn iindeyken Code assist ile grlemez. Ayrca Object classnn kendisinin Cloneable olmadna dikkat edin. Bu nedenle her class Cloneable interfaceini kendi implement etmek zorunda. Cloneable Elma 1. Elma classn Cloneable yapn: public class Elma implements Cloneable { String Renk; StringBuffer stf = new StringBuffer(); Bu tanm iinde bir adet StringBuffer nesnesi eklenmitir. 2. clone() methodunu ekleyin: public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(); } } 3. Main.java iinden aadaki gibi Elma nesnesinin kopyasn yaratn. Elma e1 = new Elma("sari"); Elma e2 = (Elma) e1.clone(); Her iki Elma nesnelerinin ayr renk alanlar oldu. Ancak her iki nesne de ayn stf adl nesneyi gryor. Main.java iinden aadaki gibi clone ileminin etkisini kontrol edin. System.out.println(e1.getRenk()); e1.stf.append("e1 renk"); System.out.println(e1.stf.toString()); Elma e2; e2 = (Elma) e1.clone(); System.out.println(e2.getRenk()); e2.setRenk("Kirmizi"); e2.stf.append("e2 renk"); System.out.println(e2.getRenk()); System.out.println(e2.stf.toString());

Sibnet Java Eitimi Lab almas

28

e2.stf.append() ilemi e1.stf nesnesi zerinde etkili olacaktr. 4. Elma class tanmndan Cloneable ifadesini kaldrn. Yani class aadaki gibi tanmlansn. Main.javay altrn. Hangi hatay alyorsunuz? public class Elma {...} Yant: Program altrdnzda CloneNotSupportedException hatasn alrsnz. Shallow Copy Sz konusu kopyalama ilemi Shallow Copy adn alr. Source konumundaki Elma nesnesinin iindeki btn primitive data tiplerinin ( ve String ) ayr bir kopyas alnr. Ancak object referencelar assignment (=) ilemine tabi tutulur. Yani e2 = e1.clone() ilemi, birbirlerinden bamszca update edilebilen iki ayr e1.Renk data tipi yaratr. Ancak e1.stf ile e2.stf ayn StringBuffer nesnesini gsterir.

e1 e2

Renk Stf

clone() ilemi ncesi

e1 e2

Renk Stf

Renk Stf

clone() ilemi sonras

Soru Aadaki iki ilemin fark nedir? Vector v2 = v.clone(); ve v2=v; Vector clone() Aadaki kodun kts nedir? import java.util.*; public class Clone {
Sibnet Java Eitimi Lab almas

29

public static void main(String args[]) { Vector v = new Vector(); Elma e1 = new Elma("mavi"); v.add(e1); Vector v2 = (Vector) v.clone(); Elma e2 = (Elma) v.elementAt(0); if (e1 == e2) System.out.println("eit"); else System.out.println("deil"); if (v == v2) System.out.println("eit"); else System.out.println("deil"); }

Sorting (sralama) Aada 4 elemandan oluan bir vektr verilmitir. Vector v = new Vector(); v.add("sar"); v.add("mavi"); v.add("krmz"); v.add("siyah"); Bu vektrn elemanlarn outputa yazdrmak iin Iterator nesnesini kullanabiliriz. Iterator i = v.iterator(); while (i.hasNext()) { System.out.println(i.next()); } Ancak output vektrn elemanlarn add() ileminin srasna gre verecektir. Vektrn elemanlarn nasl harf srasna gre yazdrabiliriz? Collections classnn static sort() methodu bir collection nesnesi iindeki elementleri doal srasna gre dizer. (Collections ve Collection adlarnda iki farkl class olduunu unutmayn). Collections.sort(v); i = v.iterator(); while (i.hasNext()) { System.out.println(i.next()); } Elma Sorting imdi aadaki List nesnesini dnn. (List nesnesi ile Vector nesnesi arasnda sort ilemi asndan bir fark yoktur). List list = new ArrayList();

Sibnet Java Eitimi Lab almas

30

list.add(new Elma("sar")); list.add(new Elma("krmz")); list.add(new Elma("yeil")); Collections.sort(list); // use compareable

Collections.sort() methodu elmalar nasl, hangi kritere gre dizecektir? sort() methodu primitive data tipleri doal sralamalarna gre (nmerik ya da alfabetik sralama) dizer. Ancak Elma gibi user defined data tiplerini sralay bilemez. Bu yzden Collections.sort() satr Exception (ClassCastException) frlatacaktr. implements Comparable Elma classnn sort() methodu ile sortable hale gelmesi iin bu classn Comparable interfaceini implements etmesi gerekir. public class Elma implements Comparable { Bu interfacein compareTo() methodu iki Elma nesnesini karlatrr. compareTo() methodunu dilediimiz gibi yazabiliriz. public int compareTo(Object o) { String r1 = ((Elma) o).getRenk(); String r2 = getRenk(); return r2.compareTo(r1); } Not: String iin compareTo() aadaki rnekteki gibi Stringlerin ilk charlarnn ASCII code fark olarak alr. (ilk charlar ayn ise ikinci charlara bakar) "A".compareTo("C") = -2 (A ile Cnin ASCII fark : 65-67 = -2)

implements Comparator Sorting iin bir baka alternatif daha var. Bir class Comparator interfaceini de implement edebilir. class Elma2 implements Comparator Comparator interfaceinin public int compare(Object o1, Object o2) adl methodu bulunmaktadr. compare() methodu compareTo() ile karlatrldnda iki adet parametre alr. public int compare(Object o1, Object o2) { String r1 = ((Elma2) o1).getRenk(); String r2 = ((Elma2) o2).getRenk(); return r1.compareTo(r2); }

imdi Collecitons.sort() methodunu aadaki gibi armak gerekir: Collections.sort(list, new Elma2("xxx")); // use comprator, Elma2(xxx) nesnesi dummy bir nesnedir. sort() methodu btn nesneleri bu dummy nesne ile karlatrr. Dummy nesne aslnda herhangi bir Elma2 nesnesi olabilir.

Sibnet Java Eitimi Lab almas

31

Yantlar Soru ki ilem ayr eyler. Test etmek iin: v2=v ilemi sonrasnda if(v2==v) doru sonu verir nk v2=v ifadesi sonras v ve v2 referanslar heap'de ayn vector nesnesini gsterir ( not: vector de heapde bir nesnedir ). Ancak v2=v.clone() satr sonrasnda heap'de ikinci bir vector daha oluur.Ancak sonuta bu iki vector de ayn objeleri gosteriyor. Biri deiince dieri de deiiyor. Bu durumda if(v2==v) ifadesi false (yanl) deerini alr. Vector clone() eit deil Not: Vector gibi collection nesnelerine clone() ilemi uyguladmzda iki tane vector oluuyor. Ancak bu iki vectorun slotlar ayn nesneyi/nesneleri gsteriyor. Vector'un slotlar heap de yaratlan adres alanlar aslnda.

Sibnet Java Eitimi Lab almas

32

Lab 7: MultiThreaded Programming

terminated

Start

Ready-to-run

Running

dead completed

Non-runnable Waiting Sleeping Blocked


Process State Tablosu Concurrent Processing Aadaki class' yazp altrn. 5 thread srayla baladna gre class'n kts niin sral gelmiyor? public class Thread1 extends Thread { int index; public static void main(String argv[]) { Thread1 t1 = new Thread1(1); Thread1 t2 = new Thread1(2); Thread1 t3 = new Thread1(3); Thread1 t4 = new Thread1(4); Thread1 t5 = new Thread1(5); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } //end main Thread1(int i) { index = i; } //end constructor public void run() { // dummy job String a = null; for (int i=0; i<500; i++) a = a + "Hello"; System.out.println("Thread " + index + " is finished"); } } Aada bu sralamaya etki edebilecek join, sleep ve priority gibi eitli teknikler greceksiniz. join() Method'u

Sibnet Java Eitimi Lab almas

33

join() methodu bir thread'in bir baka thread'in sonlanmasn beklemesini salar. rnein aadaki kodu altran bir thread bu satrdan sonraki satra tx threadi bitmeden geemez; tx'in bitmesini bekler. Bu method Exception frlattndan try-catch iine yazlmaldr. tx.join() Yukarda verilen Thread1 class'nda 3 nolu thread'in 4 nolu thread'den mutlaka nce bitmesini salayn.

sleep() Method'u sleep() method'u CPU'nun bir thread'in geici olarak sleep moduna almasn salar. Bu durumdaki bir thread bloklanmtr. sleep() methodu statik bir methoddur. Aadaki gibi arlr. Method parametresi olarak verilen deer milisaniye cinsinden uyuma sresidir. Thread.sleep(1000) Thread1 classnda 2 nolu thread'i 5 saniye uyutun. En son hangi thread tamamland?

Thread Priority Btn thread'lere 1-10 aras ncelik verilebilir. 10 en yksek 1 en dk nceliktir. Default ncelik deeri 5'dir. Aada t1 thread'inin ncelii 8'e ykseltilmitir. Thread t1 = new Thread(); t1.setPriority(8); t1.start(); Thread prority zelliini kullanarak 1,2, 4 ve 5 nolu thread'lere en yksek (10); 3 nolu thread'e ise en dk ncelii verin. Programn ktsnda en son tamamlanan thread hangisidir? Threadlerin mutlaka ncelik srasna gre tamamlanmadna dikkat edin. Synchronized Lock Aadaki programda iki adet thread t1 ve t2 threadleri yaratlp balatlmtr. start() ile threadin run() methodu devreye girer. ki threadin paylat bir kaynak vardr: System.out. Threadler run methodlarnda bu kayna kullanarak outputa thread adyla beraber 1-4 aras saylar srayla yazdrmaktadr. Ancak 2 thread ayn kayna kullandndan (System.out) kt srayla gelmemekte, iki threadn kts birbirine girmektedir. Aada bu classn bir kts var. Thread-1 started Thread-1----- 0 Thread-2 started Thread-2----- 0 Thread-2----- 1 Thread-1----- 1 Thread-2----- 2 Thread-1----- 2 Thread-1----- 3 Thread-2----- 3 Thread-1 terminated Thread-2 terminated

Sibnet Java Eitimi Lab almas

34

makeLoad() methodu CPUya yapay bir yk yaratmak iin kullanlmtr. Yoksa CPU bir threadi (run methodunu) bir time-slice sresi iinde bitirebilir. Bu da Threadlerin (tesadfen) ktlarnn srayla yazlmasna sebep olur. package sib.thread; public class Thread1 extends Thread { public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread1 t2 = new Thread1(); t1.start(); t2.start(); } // make artificial load for CPU void makeLoad() { String g = null; for (int j = 0; j < 5000; j++) g = g + "merhaba"; } // thread's main execution public void run() { System.out.println(this.getName() + " started"); for (int i = 0; i < 4; i++) { System.out.println(this.getName() + "----makeLoad(); }

" + i);

System.out.println(this.getName() + " terminated"); } } Threadlerin run methodlarnn ayn kaynaa eriimini srayla yapmak iin synchronized keyword kullanlr. Yukardaki kodda run methodunu aadaki gibi deitirin. public void run() { synchronized (System.out) { System.out.println(this.getName() + " started"); for (int i = 0; i < 4; i++) { System.out.println(this.getName() + "----makeLoad(); }

" + i);

System.out.println(this.getName() + " terminated"); } } Classn kts aadaki gibi olacaktr. Thread-1 started Thread-1----- 0 Thread-1----- 1 Thread-1----- 2
Sibnet Java Eitimi Lab almas

35

Thread-1----- 3 Thread-1 terminated Thread-2 started Thread-2----- 0 Thread-2----- 1 Thread-2----- 2 Thread-2----- 3 Thread-2 terminated synchronized method Aadaki programda t1 ve t2 threadlerinin ktlar sraya dizilmitir ve aadadr: Thread-1----Thread-1----Thread-1----Thread-1----Thread-2----Thread-2----Thread-2----Thread-2----0 1 2 3 0 1 2 3

Bu classda static Print pr=new Print() statik tanm yerine Print pr=new Print() eklinde tanmlandnda sralama kark gelmekte ve synchronized tanm almamaktadr. Neden ? class Print { synchronized void count(String threadName) { for (int i = 0; i < 4; i++) { System.out.println(threadName + "----makeLoad(); } } void makeLoad() { String g = null; for (int j = 0; j < 5000; j++) g = g + "merhaba"; } } public class Thread2 extends Thread { static Print pr=new Print(); public static void main(String[] args) { Thread2 t1 = new Thread2(); Thread2 t2 = new Thread2(); t1.start(); t2.start(); } // thread's main execution public void run() { pr.count(this.getName()); } } synchronized code block
Sibnet Java Eitimi Lab almas

" + i);

36

Yukardaki kod aadaki biimde de altrldnda threadlerin ktlar sraya dizilir: Integer lock = new Integer(2); void count(String threadName) { synchronized (lock) { for (int i = 0; i < 4; i++) { System.out.println(threadName + "----makeLoad(); } } } lock nesnesi iki thread tarafndan ortak olarak eriilebilir. Aadaki kod iinde lock nesnesi local bir nesne olarak tanmlandndan kt kark gelir. Neden? void count(String threadName) { Integer lock = new Integer(2); synchronized (lock) { for (int i = 0; i < 4; i++) { System.out.println(threadName + "----makeLoad(); } } } Deamon Thread Javada 2 eit thread vardr: user thread ve deamon thread. main() methodu user threadlerin bitmesini beklerken, deamon threadleri keser. rnein bir GUI uygulamasnda print ilemi bir deamon thread ise, print ilemi balatp hemen (print bitmeden) programdan kmaya karar veriseniz, deamon thread olarak set edebilirsiniz. ki thread arasndaki fark grmek iin aadaki run() methodunu kullannz: run() { for (int i=0; i<500; i++) { System.out.println(Thread...); } } Bir user threadi deamon thread yapmak iin aadaki format kullann: t1.setDeamon(true);

" + i);

" + i);

Java Thread ile ilgili Dier Notlar

wait() ve notify() synchronized ile beraber kullanlr. Bir kaynaa erien thread bir arta gre kayna serbest brakabilir.

Sibnet Java Eitimi Lab almas

37

wait() komutu threade elinde tuttuun lock'lar release et ve sleep moduna ge bilgisi verir. Bylece dier lock bekleyenlerden biri lock ele geirme frsat yakalar.

interrupt : wait yapan threadi tekrar running moda evirir. sleep ile yield fark. sleep metodunu altran thread kendini blocked queue ya koyar. Yield metodu ise CPUnun time slice sresini bitirmesini beklemeden kes ve kendini running queue ya koy, demektir. Ancak yield yapan process blocklanm saylmaz. consumer - producer rnei : consumer depoya eriiirken: 1. depoyu lock et, 2. depoya bak. 3. depo bo ise wait i ar 1. lock release et 2. sleep et produces 1. depoyu lock et 2. depoya koy 3. locku kaldr ve 4. notify ile uyuyan processi uyandr

Yantlar sleep () Method'u run() methodu: public void run() { try { if (index == 2) Thread.sleep(4000); } catch (Exception e) { } // dummy job String a = null; for (int i = 0; i < 500; i++) a = a + "Hello"; System.out.println("Thread " + index + " is finished"); }

Thread Prority t1.setPriority(10); t2.setPriority(10); t3.setPriority(1); t4.setPriority(10); t5.setPriority(10); t1.start(); t2.start(); t3.start(); t4.start(); t5.start();

Sibnet Java Eitimi Lab almas

38

Synchronized Method Print pr=new Print() eklindeki tanm her iki threadin de iki ayr Print nesnesi yaratmasna sebep olur. Bu da synchronized void count(String threadName) satrnn iki ayr nesne stnde almasna yol aar. Bir synchronized methodun alm aadaki gibidir: synchronized void m() {...} void m() { synchronized(this) { ..... } } synchronized(lock) keywordn altran iki ayr threadin senkronize olmas iin her iki threadin the ayn lock nesnesini grmesi gerekir. Oysa yukardaki ekilde iki ayr Print nesnesi iki ayr this nesnesi oluturmaktadr. Synchronized Code Block count() methodu iindeki local Integer nesnesi lock olarak kullanlamaz nk count methodunun her arlnda new ile ayr nesneler yaratlr. Lock olarak kullanlacak nesne threadler iin global olmaldr. ki ayr nesne olamaz.

Sibnet Java Eitimi Lab almas

39

Lab 8: Exception Handling Exception Elma class iinde bir takm kabul edilemez koullar kullancya uygun mesajlar vererek dzenlemek istiyoruz. rnein setRenk() methodu null () string ile arldnda bunun bir hata olduunu belirtmek istiyoruz. Ayrca setRenk() methodu komut satrndan (args[0] ile) renk bilgisi alyor olabilir. Kullancnn olas geersiz renk deerlerini bir ekilde zmlemeliyiz. Bunun bir yolu setRenk() methodunu aadaki gibi yazmaktr: int setRenk(String r) { if (r.equals("")) return -1; else Renk = r; return 1; } Program iinde bu methodu arrken return deerine dikkat etmelisiniz. if (e.setRenk(args[0]) == -1) System.out.println(bir renk girmelisiniz); Ancak Exception Handling mekanizmas daha doal bir zm sunar. 1. Elma.java iinde setRenk() methodunun gvdesini ( gvdesi { } arasna yazlan her ey) aadaki gibi deitirin: if (r.equals("")) { Exception e = new Exception(); throw e; } else Renk = r; Programnz compile ettiinizde hata mesaj ile karlarsnz. Gvdesinde Exception gnderen (throw komutu ile) bir methodun balk ksmnda bunun belirtilmesi gerekir. Balk ksmn aadaki gibi yazn: void setRenk(String r) throws Exception { Notlar: a. Exceptionn bir class olduuna dikkat edin. Bir hata durumu ile karlaldnda nce Exception classndan bir nesne (object ya da instance) yaratlyor, sonra bu nesne throw keyword ile frlatlyor. b. Bir method gvdesinde birden fazla tipte Exception nesnesi frlatyorsa btn nesneleri balk ksmnda listelemeli. Aada gibi: void setRenk(String r) throws Exception, IOException { c. Yukardaki ifden sonraki iki satrn tek satrda yazlabileceine dikkat edin: throw new Exception();

Object

Throwable

Error

Exception

2. Start.java iinde main() methodunda aadaki kodu oluturun:

Sibnet Java Eitimi Lab almas

40

Elma e1 = new Elma(); e1.setRenk("sar"); Compiler u hata mesajn verecektir: Unhandled exception type Exception. Bunun sebebi main() methodu iinde hata frlatma potansiyelinde olan bir method arlmtr (setRenk() ) ve bu methodun retebilecei Exception nesnesinin yakalanp gerekli ilemin yaplmas (Exception handling) gerekmektedir. main() methodu bunu iki ayr (alternatif) yntemle gerekletirebilir: a. Exception handling yapmayp kendi gvdesinde meydana gelebilecek Exception nesnelerini kendisini aran bir st methoda transfer etmek. b. Try-catch ile Exception handling yapmak. 3. imdi main methodunun setRenk()in retebilecei hatalar kendisini (main()i ) aran bir st methoda transfer etmesi iin aadaki deiiklii yapn: public static void main(String[] args) throws Exception { 4. Ya da setRenk() methodunu try-catch iine alarak Exception nesnesini yakalayabiliriz: public static void main(String[] args) { Elma e1 = new Elma(); try { e1.setRenk(""); System.out.println(e1.getRenk()); } catch (Exception e) { System.out.println("hata"); e.printStackTrace(); } } Exception Class 5. Acaba Exception nesnesi yerine daha kullanl olabilecek kendi Exception snfmz tanmlayabilir miyiz? Aada ElmaException class tanm verilmitir. Ayn ekilde Java programlarnda grdmz IOException, ArrayIndexOutofBound gibi Exception classlar da Exception classndan tretilmitir. Package iinde yeni bir ElmaException.java class yaratn: class ElmaException extends Exception { String msg; ElmaException(String s) { msg = s; } } 6. Artk setRenk() methodu Exception yerine ElmaException nesnesini frlatabilir. Aada setRenk() iinde iki ayr tipte Exception nesnesi frlatlmtr. Elma nesnesinin rengi (null) olduunda ElmaException, renk mavi olduunda (mavi Elma olmayaca iin) Exception nesnesi frlatlmtr. Aslnda her ikisi iin de ElmaException nesneleri yaratlp frlatlabilirdi ancak sadece rnek amacyla iki ayr Exception tipi verilmitir. void setRenk(String r) throws ElmaException, Exception { if (r.equals("")) { throw new ElmaException("renk bo olamaz"); } else if (r.equals("mavi")) throw new Exception("renk mavi olamaz");

Sibnet Java Eitimi Lab almas

41

Renk = r; } 7. main() iinde her iki Exception nesnesinin de catch() ile yakalanmas gerekmektedir. Ancak aadaki noktalara dikkat edin. Aada verilen kod paralarnn her birini yazarak test edin. a. Doru (compile asndan) kod. Exception nesnesi ElmaExceptionn superclass olduudan hem Exception hem de ElmaException nesnelerini catch(Exception e) ile yakalayabilir. Elma e1 = new Elma(); try { e1.setRenk(""); System.out.println(e1.getRenk()); } catch (Exception e) { e.printStackTrace(); } b. Hatal kod. catch(ElmaException e) sadece ElmaException nesnesini yakalar. Dier Exception nesnesini ya throws Exception ile aran methoda transfer etmeli ya da catch() ile yakalamalsnz. Elma e1 = new Elma(); try { e1.setRenk(""); System.out.println(e1.getRenk()); } catch (ElmaException e) { e.printStackTrace(); } c. Doru kod. Elma e1 = new Elma(); try { e1.setRenk(""); System.out.println(e1.getRenk()); } catch (ElmaException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } d. Hatal kod. Daha genel olan Exception class daha alt satra yazlmal. Yoksa catch(Exception e) satr btn Exceptionlar toplar ve catch(ElmaException e) blouna hibir zaman eriilemez. Compilern verdii hata: Unreachable catch block. Elma e1 = new Elma(); try { e1.setRenk(""); System.out.println(e1.getRenk()); } catch (Exception e) { e.printStackTrace(); } catch (ElmaException e) { e.printStackTrace(); }

8. Son olarak ElmaException nesnesini aadaki gibi kullanabileceinize dikkat edin: catch (ElmaException e) { System.out.println(e.msg); e.printStackTrace(); }
Sibnet Java Eitimi Lab almas

42

finally finally iindeki kod, try-catch iindeki koda bakmakszn her durumda alr. try-catch iinde aadaki tipte kod alsa bile finally mutlaka devreye girecektir. throw return break continue rnein aadaki metod 3 deil 4 deerini dnecektir. public int method3() { try { return 3; } finally { return 4; } } try-finally try-finally, catch olmadan da kullanlabilir. Bir kod grubundan doabilecek olas bir Exception nesnesini catch ile yakalamayp bir st fonksiyona geirmek isteyebilirsiniz. Ancak hala, kod hatal bir ilemle krldnda (yani Exception nesnesi yaratldnda ) bir st fonksiyona gemeden nce mutlaka almasn istediiniz kod olabilir (ak dosyalar kapatmak gibi). Aadaki rnekte main() metodunda throws Exception ifadesinin hala yazlmas gerektiine dikkat edin. public static void main(String[] a) throws Exception { try { Elma e = new Elma(); e.setRenk(""); } finally { // ......... } Uncheck Exception Baz Exception nesneleri try-catch blou gerektirmez. rnein aadaki satr potansiyel olarak ArrayIndexOutOfBoundsException nesnesi frlatabilir ancak try-catch blou ya da throws Exception gerekmez. int a[]=new int[2]; a[4]=0; NullPointerException ve NumberFormatException da bu tip Exception nesneleridir.

Sibnet Java Eitimi Lab almas

43

Hangi tip Exception nesneleri try-catch gerektirmez? Yukardaki ekilden de anlald gibi RuntimeException snfndan tretilen Exception nesneleri Unchecked Exceptions adn alr. Unchecked Exception nesneleri try-catch gerektirmez. Yantlar Elma.java package sib.except; class Elma { String Renk; void setRenk(String r) throws ElmaException, Exception { if (r.equals("")) { throw new ElmaException("renk bo olamaz"); } else if (r.equals("mavi")) throw new Exception("renk mavi olamaz"); Renk = r; } String getRenk() { return Renk; } Elma() { } Elma(String r) { Renk = r; } } ElmaException.java package sib.except; class ElmaException extends Exception { String msg; ElmaException(String s) { msg = s; } } Start.java package sib.except; public class Start {

Sibnet Java Eitimi Lab almas

44

public static void main(String[] args) { Elma e1 = new Elma(); try { e1.setRenk(""); System.out.println(e1.getRenk()); } catch (ElmaException e) { System.out.println(e.msg); e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } }

Sibnet Java Eitimi Lab almas

45

Lab 9: I/O Stream FileCopy Function DOS copy komutunu java ile yazalm. 1. main() methodu olan bir Start.java class' yaratn. 2. Input ve Output dosyalar FileInputStream ve FileOutputStream olarak aalm. Dosya isimleri komut satrndan girilsin. FileInputStream fin = new FileInputStream(args[0]); FileOutputStream fout = new FileOutputStream(args[1]); 3. imdi input dosyadan okuyup outputa yazalm. Bunun iin read() write() methodlarn kullanabiliriz. File sonuna gelindiinde read() 1 dnecektir. int c; c = fin.read(); while (c != -1) { fout.write(c); c = fin.read(); } 4. Kopyalama bittiinde stream'ler kapatlmal. fin.close(); fout.close(); System.out.println("done"); 5. Yukardaki ilemlerin try-catch iinde yazlmas gerekiyor. catch ile FileNotFoundException ve IOException nesnelerini yakalayn. 6. Komut satrna bir input ve output dosya ad yazarak program test edin. Not: Komut satrndan ad verilen dosyalar package folder altnda deil, projenin olduu folder altnda aranmaldr. BufferedFileCopy Function

1. FileInputStream ve FileOutputStream buffer kullanmaz. O nedenle fazla verimli almazlar. Bu stream'lere BufferedInputStream ve BufferedOutputStream balayarak (chaining) kopya srasnda bellek buffer alan kullanlmasn salayalm: BufferedInputStream bin = new BufferedInputStream(fin); BufferedOutputStream bout = new BufferedOutputStream(fout); 2. imdi yukardaki programn ana dngs zerinde aadaki deiiklii yapalm. Okuma ve yazma methodlar artk bin ve bout zerinde alyorlar. int c; c = bin.read(); while (c != -1) { bout.write(c); c = bin.read(); }

Sibnet Java Eitimi Lab almas

46

bout.flush(); 3. Kopyalama bittiinde stream'ler kapatlmal. Yukarda olduu gibi sadece fin ve fout kapatlabilir. nk bu ikisi kapandnda kendilerine bal bout ve bin gibi nesneler de kapatlr.

Character Encoding Trke karakterleri bir output stream'e nasl yazdrrz? 1. main() methodu olan Yeni bir Start.java yaratn. 2. Bir FileOutputStream yaratn. FileOutputStream out = new FileOutputStream(args[0]); 3. out nesnesine balanan OutputStreamWriter nesnesi yaratn. Ancak OutputStreamWriter yaratlrken character encoding de TR karakter kodu olarak belirtin. Trke kod 8859_9'dur. OutputStreamWriter wout = new OutputStreamWriter(out, "8859_9"); 4. imdi PrintWriter nesnesini wout nesnesine balayn. Ve Trke karakterleri "i" yazdrn. PrintWriter pw2 = new PrintWriter(wout); pw2.println("i"); pw2.close();

5. FileNotFoundException ve IOException nesnelerini catch ile yakalayn.

Line Reader Aadaki class ise bir dosyadan satr satr okuyup, bir satr iindeki merhaba szcklerini hello ya eviriyor. Eer output ekrana gnderilecekse (System.out) PrintWriter nesnesini aadaki gibi deitirin: PrintWriter pw = new PrintWriter(System.out, true); rnek: package sib.io; import java.io.*; public class LineRead { public static void main(String[] args) { try { FileReader fr = new FileReader("e:\\ps\\info.txt"); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter("e:\\ps\\info2.txt"); PrintWriter pw = new PrintWriter(fw, true); //PrintWriter pw = new PrintWriter(System.out, true); final String msg = "merhaba"; String s = br.readLine(); while (s != null) { if (s.equals(msg)) pw.println("hello");
Sibnet Java Eitimi Lab almas

47

else pw.println(s); s = br.readLine(); } pw.flush(); fr.close(); fw.close(); System.out.println("done "); } catch (Exception e) { e.printStackTrace(); } } }

Random Access u ana kadar grdmz btn IO ilemleri sequential access yapar. Aadaki kod random access iin. Bu kod at dosyann en sonuna gidip bir satr ekliyor. package sib.io; import java.io.*; public class RandomAccess { public static void main(String[] args) { try { File log = new File("e://ps//info.txt"); if (log.exists()) { RandomAccessFile raf = new RandomAccessFile(log, "rw"); raf.seek(raf.length()); raf.writeBytes("--last line--"); raf.close(); } } catch (IOException e) { e.printStackTrace(); } } }

New IO Aadaki programda java nio ile kopya yapan program verilmitir. infile ve outfile deerlere kopyalamak istediiniz dosya adn yazn. import java.io.*; import java.nio.*; import java.nio.channels.*; public class Copy { static public void main( String args[] ) throws Exception {

Sibnet Java Eitimi Lab almas

48

String infile = "c:\\temp\\j2sdk.exe"; String outfile = "c:\\temp\\j.exe" ; FileInputStream fin = new FileInputStream( infile ); FileOutputStream fout = new FileOutputStream( outfile ); FileChannel fcin = fin.getChannel(); FileChannel fcout = fout.getChannel(); ByteBuffer buffer = ByteBuffer.allocate( 1024); while (true) { buffer.clear(); int r = fcin.read( buffer ); if (r==-1) { break; } buffer.flip(); fcout.write( buffer ); } System.out.println("bitti"); } }

Yantlar BufferedFileCopy package sib.io; import java.io.*; public class BufferedFileCopy { public static void main(String[] args) { try { FileInputStream fin = new FileInputStream(args[0]); FileOutputStream fout = new FileOutputStream(args[1]); BufferedInputStream bin = new BufferedInputStream(fin); BufferedOutputStream bout = new BufferedOutputStream(fout); int c; c = bin.read(); while (c != -1) { bout.write(c); c = bin.read(); } bout.flush(); fin.close(); fout.close();
Sibnet Java Eitimi Lab almas

49

System.out.println("done"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException ie) { ie.printStackTrace(); } } }

CharacterEncoding package sib.io; import java.io.*; public class CharTREncoding { public static void main(String[] args) { try { FileOutputStream out = new FileOutputStream(args[0]); OutputStreamWriter wout = new OutputStreamWriter(out, "8859_9"); PrintWriter pw2 = new PrintWriter(wout); pw2.println("i"); pw2.close(); System.out.println("done"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

Sibnet Java Eitimi Lab almas

50

Lab 10: Object Serialization JVM herhangi bir anda bellekteki bir nesneyi disk file'a yazabilir. Bu ilem zellikle byk nesneler iin persistency (kalclk) salar. Yani sistemin durmas sonucunda deiken diskten okunabilir. Bu yntemin bir dier sonucu da nesnelerin bir bilgisayardan dierine aktarlabilmesidir. String [] Class rnek olarak bir String [] nesnesini diske yazp tekrar okumaya alalm. Kullanlacak olan class'lar ObjectInputStream ve ObjectOutputStream. Aadaki rnek kod nce String strArr[] = {"Kemal", "Atatrk"} satryla bir String nesnesi oluturur. Ardndan bu nesne obj-store.dat adl dosyaya yazlr ve readData() metodu diskten nesneyi okur. Ancak nesne diske yazlrken Object class'na dnmtr. Bu nedenle readData() Object nesnesini String[] tipine casting ile dntrmek zorundadr.

import java.io.*; public class Start { void writeData(Object obj) { try { // setup storage FileOutputStream outFile = new FileOutputStream("obj-store.dat"); ObjectOutputStream outStream = new ObjectOutputStream(outFile); // Write data outStream.writeObject(obj); //close outStream.flush(); outStream.close(); } catch (IOException e) { e.printStackTrace(); } } Object readData() { Object o = null; try { // open stream FileInputStream inFile = new FileInputStream("obj-store.dat"); ObjectInputStream inStream = new ObjectInputStream(inFile); // read object o = inStream.readObject(); } catch (Exception e) { e.printStackTrace(); } return o; } public static void main(String[] args) { Start s = new Start(); String strArr[] = { "Kemal", "Atatrk" }; s.writeData((Object) strArr);
Sibnet Java Eitimi Lab almas

51

String inStrArr[] = (String[]) s.readData(); System.out.println(inStrArr[0]); System.out.println(inStrArr[1]); } }

Serializable Elma Class' 1. imdi Elma class'ndan bir nesneyi diske yazalm. Yukardaki programn main() metoduna aadaki eklemeleri yapn: // Write Elma object Elma e1 = new Elma("krmz"); s.writeData((Object) e1); Elma e2 = (Elma) s.readData(); System.out.println(e2.getRenk()); 2. Hangi hata mesajn aldnz? JVM Elma nesnesinin Serializable olduunu bilmediinden NotSerializableException hatasn verecektir. 3. Elma class'n Serializable yapmak iin class tanmn aadaki gibi deitirirn. public class Elma implements java.io.Serializable {...} 4. Yukardaki program tekrar altrn. Bu kez Elma nesnesi diske yazlp okunabilecektir. transient Bir nesnenin bir ksmnn diske yazlmas engellenebilir mi? Gvenlik sebebiyle gizli bir alann diske yazlmasn istemeyebilirsiniz. transient keyword ile nitelenen alanlar diske yazlmaz. Ayrca statik olarak nitelendirilen alanlar da diske yazlmaz. 5. Elma class'nda Renk alannn tanmn aadaki gibi deitirin. transient String Renk; 6. Yukardaki program tekrar altrn. Renk olarak ne okuyorsunuz? Renk deikeni diske yazlamadndan diskten okuma srasnda null deer alacaktr.

Baka Bir rnek 2 ayr java dosyas. Write.java


public static void main(String[] args) { Elma e = new Elma("Krmz"); //String e = new String("bugn pazar"); try { FileOutputStream fout = new FileOutputStream("c:\\elma.ser"); ObjectOutputStream out = new ObjectOutputStream(fout); out.writeObject(e);

} catch (Exception exp) { Sibnet Java Eitimi Lab almas

52

exp.printStackTrace(); }

Read.java
public class MSerRead {

public static void main(String[] args) { Elma e; //String e; try { FileInputStream fin = new FileInputStream("c:\\elma.ser"); ObjectInputStream in = new ObjectInputStream(fin); e = (Elma) in.readObject(); System.out.println(e);

} catch (Exception exp) { exp.printStackTrace(); }

Serialver package sib.serial; import java.io.Serializable;

public class Test implements Serializable{ static final long serialVersionUID = 5; int t=0; int r=9; public static void main(String[] args) { } }
Projenin iinden altrn. C:\workspace\eclipse32\ja351\MySecond>serialver com.hsbc.lab1.Elma com.hsbc.lab1.Elma: static final long serialVersionUID = 9203969605142872328L ;

Sibnet Java Eitimi Lab almas

53

Lab 11: RTTI & Reflection

instanceof instanceof RTTInin basit bir formatdr. Aadaki kodu altrn. Ne kt veriyor? Dzeltmek iin ne yapmalsnz? String s = null; if (s instanceof String) System.out.println("done"); else System.out.println("no done");

Class class Bir nesnenin class adn bulabilir miyiz? rnein Vector nesnesinde depolanm bulunan nesneler acaba hangi classdan yaratlm sorusunu nasl zebiliriz? Vector v = new Vector(); v.add(new String("merhaba")); v.add(new Integer(5)); for (int i = 0; i < v.size(); i++) { Object o = v.elementAt(i); Class c = o.getClass(); System.out.println(c.getName()); } Dinamik Instance Yaratmak ve Classloading Bir class, komut satrndan girilen baka bir class isminden dinamik olarak nesneler yaratabilir mi? 1. nce Elma.java dosyasn altnz package iine aln. Ve aadaki eklentileri yapn. Bu eklentiler daha ncede grdmz gibi herhangi bir anda ka Elma nesnesini grebilmek iin yaplmaktadr. static int no=0; static int getNo() { return no; } Elma(){ no++; } 2. Programn ana dngsnden nce aadaki kodu ekleyin. Class adnn tam olarak (package name ile birlikte) girildiine dikkat edin. Class ad program komut satrndan da girilebilirdi. Size deikeni komut satrndan giriliyor ve ka Elma nesnesi yaratlacan belirtiyor. Class c = Class.forName("sib.rtti.Elma"); int size = Integer.parseInt(args[0]); Object o[] = new Object[size]; 3. Programn ana dngs iinde nesneler yaratlyor. Elma.getNo() statik metodu ta Elma nesnesinin yaratldn syleyecektir. for (int i=0; i<size; i++) {
Sibnet Java Eitimi Lab almas

54

o[i] = c.newInstance(); } System.out.println(Elma.getNo());

Metodlara Eriim Bir classn btn metodlarn listeleyebilir misiniz? rnein bir class adn biliyorsunuz fakat metod isimleri aklnzda deil. (.class dosyas JVMnin eriip ykleyebilecei bir class). Aadaki kod Elma classnn btn public metodlarn (superclasslarndan da gelen) listeliyor. Eer sizin metodlar listede yoksa Elma.java iinde o metodu public yapn. try { Class c = Class.forName("sib.rtti.Elma"); Method m[] = c.getMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); }; Yantlar instanceof String s = new String();

Listing /* * Yusuf Kenan YILMAZ, Sibnet, Aug 13, 2003 */ package sib.rtti; import java.lang.reflect.Method; import java.util.Vector;

public class RTTI { public static void main(String[] args) { //instanceof String s = ""; if (s instanceof String) System.out.println("done"); else System.out.println("no done"); //class class Vector v = new Vector(); v.add(new String("merhaba")); v.add(new Integer(5)); for (int i = 0; i < v.size(); i++) { Object o = v.elementAt(i); Class c = o.getClass(); System.out.println(c.getName());
Sibnet Java Eitimi Lab almas

55

} //dynamic class instance creation try { Class c = Class.forName("sib.rtti.Elma"); int size = Integer.parseInt(args[0]); Object o[] = new Object[size]; for (int i = 0; i < size; i++) { o[i] = c.newInstance(); } System.out.println(Elma.getNo()); } catch (Exception e) { e.printStackTrace(); } //method access try { Class c = Class.forName("sib.rtti.Elma"); Method m[] = c.getMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); }; } }

Sibnet Java Eitimi Lab almas

56

Lab 12: Applet API

Applet skeleti import java.applet.*; public class MyApplet extends Applet { public void init() { //add initialization code here } public void start() { //add starting code here } public void stop() { //add stopping code here } public void destroy() { //add termination code here } public void paint() { //add drawing code here } } Not: Sadece gerekli metodlar yazn. rnek: package com.sib.app; import java.awt.*; import java.applet.*; public class MyApp2 extends Applet { public void init() { setBackground(Color.blue); } //end init public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(0, 0, 100, 100); for (int i = 0; i < 256; i++) { g.setColor(new Color(100, i, i)); g.setFont(new Font("sansserif", Font.BOLD, 16)); g.drawString("Merhaba DTM IT ",10*i,15*i); } } //end paint } //end class

Sibnet Java Eitimi Lab almas

57

HTML <BODY> <APPLET width="300" height="300" code="com/sib/app/MyApp2.class" codebase="App/" ></APPLET>

</BODY>

Parametre HTMLden Applet iine parametre geirebiliriz. Bunun iin HTML aadaki gibi olmaldr: <APPLET width="300" height="300" code="com/sib/app/MyApp2.class" codebase="App/" > <PARAM name="Msg1" value="Merhaba DTM"> <PARAM name="ID" value="2100"> </APPLET> Applet iinde public void start() iine aadaki kodu ekleyin. s1=getParameter("Msg1"); s2=getParameter("ID"); s2 deikenini class dzeyinde tanmlayn. imdi paint iinden s1 deerini yazdrn.

Java Console Applet iindeki System.out.println mesajlar nereye gider? System.out.println("Hello, world!")

LiveConnect JavaScript Java nesnelerine (metod ve fieldlara) eriebilir mi? LiveConnect ile eriebilir. package com.sib.app; import java.applet.Applet; import java.awt.Graphics; public class Hello extends Applet { String myString; public void init() { myString = new String("Hello, world!"); } public void paint(Graphics g) { g.drawString(myString, 25, 20); } public void setString(String aString) { myString = aString; repaint(); } } HTML
Sibnet Java Eitimi Lab almas

58

<BODY> <APPLET CODE="com/sib/app/Hello.class" codebase="App/" NAME="Hello" WIDTH=150 HEIGHT=25> </APPLET> <FORM NAME="form1"> <INPUT TYPE="button" VALUE="Set String" onClick="document.Hello.setString(document.form1.str.value)"> <BR> <INPUT TYPE="text" SIZE="20" NAME="str"> </FORM> </BODY> Not: document.Hello document iindeki Hello adl applet demektir. Ayn Applete document.Applets[0] ile de eriilebilir.

Sibnet Java Eitimi Lab almas

59

Lab 13: RMI

RMI Elma Implementation Bu altrmada remote server zerindeki Elma nesnesine client zerinden erieceksiniz.

Client: IElma e1 = (IElma) ctxt.lookup("ELMAX"); e1.setRenk("Mavi");

Server: Elma e = new Elma(); ctxt.bind("ELMAX", e);

Client
e1 e1

Server

IElma

IElma

Elma

ElmaCli

ElmaSrv

Elma_Stub

Elma_Skel

Client ve Serverdaki Classlar ve Interface

1. IElma interface IElma adl interfacei yazn. Bu interface client tarafnda Remote Elma Objectin referansn almak iin kullanlacaktr. package sib.rmi.elma; import java.rmi.*; public interface IElma extends Remote { public void setRenk(String value) throws RemoteException; public String getRenk() throws RemoteException;
Sibnet Java Eitimi Lab almas

60

} Bu interface hem server hem de client sistemde bulunmaldr. 2. Elma class Ardndan Elma classn oluturun. Elma class serverda bulunacak ve IElma interfaceini implement edecektir. package sib.rmi.elma; import java.rmi.server.*; public class Elma extends UnicastRemoteObject implements IElma { //RemoteException exception public Elma() throws java.rmi.RemoteException { super(); }

private String Renk; public void setRenk(String r) { Renk=r; } public String getRenk() { return Renk; } } Notlar: Elma class java.rmi.server.UnicastRemoteObject classn extend ederek RMI servera balanr. Ancak Elma class eer baka bir classdan extend edecekse, UnicastRemoteObjecti metod olarak arabilir. Elma classnn default constructorn override etmek gerek. Bunun sebebi default constructor iindeki super() RemoteException frlatr. Onu default constructor iinde handle etmek gerek.

3. ElmaSrv class ElmaSrv classn oluturun. Bu class serverda alan ve Elma nesnesini RMI ile clienta servis veren classdr. package sib.rmi.elma; import java.util.Hashtable; import javax.naming.*; public class ElmaSrv {

public static void main(String[] args) { try { Elma e1 = new Elma(); Hashtable parms = new Hashtable(); parms.put( Context.INITIAL_CONTEXT_FACTORY,

Sibnet Java Eitimi Lab almas

61

"com.sun.jndi.rmi.registry.RegistryContextFactory"); parms.put(Context.PROVIDER_URL, "rmi://localhost"); Context ctxt = new InitialContext(parms); ctxt.bind("ELMAX", e1); } catch (Exception e) { System.out.println("Trouble: " + e); } } } Notlar: ElmaSrv class kendi iinde bir Elma nesnesi yaratyor. Ardndan Elma nesnesini Name Servera register ediyor. Kullanlan name server url: rmi://localhost. Bu nameserver servis olarak implement eden rmiregistry.exe programdr. Name servera register ederken bir isim vermek, rnekteki ELMAX gibi, durumdadr. Client elma nesnesini bu isim ile bulacaktr. 4. ElmaCli class ElmaCli classn oluturun. Bu class clientda alacaktr. Bu class Remote elma nesnesini bulup kullanack olan classdr. package sib.rmi.elma; import java.util.Hashtable; import javax.naming.*; public class ElmaCli { public static void main(String[] args) { try { System.out.println("Connecting to Elma server..."); Hashtable parms = new Hashtable(); parms.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); parms.put(Context.PROVIDER_URL, "rmi://localhost"); Context ctxt = new InitialContext(parms); IElma e1 = (IElma) ctxt.lookup("ELMAX"); e1.setRenk("Mavi"); System.out.println("Renk: " + e1.getRenk()); } catch (Exception e) { e.printStackTrace(); } } } Notlar: ElmaCli class name serverda ELMAX adyla Elma nesnesini aryor.

Sibnet Java Eitimi Lab almas

62

ctxt.lookup(ELMAX) remote nesnenin referansn (adresini) dner. e1.setRenk() metodu server zerindeki Elma nesnesinin rengini deitirir.

5. RMIC (RMI Compiler) Client server arasnda tanacak olan Elma nesnesidir. Dier bir deyimle client remote server zerindeki Elma nesnesine eriecektir. Client sanki Elma nesnesi local address space iinde tanmlym gibi nesnenin rengini set edebilir: e1.setRenk(krmz); Remote bir nesneye sanki local bir nesne gibi eriebilmek iin bir eit proxy metodu kullanlmaktadr. Bu proxy Elma nesnesi ayrca class olarak implement edilir. Bu proxy nesneler hem client hem de server tarafnda bulunmaldr. Bu proxy classlar yaratmak iin RMIC.EXE (RMI compiler) kullanlabilir. RMIC.EXE Java JDK iinde (bin dizininde) bulunur. Bu program DOS komut satrndan aadaki gibi altrn: >RMIC Elma Output olarak Elma_Stub ve Elma_Skel classlar yaratlacaktr. Elma_Stub class clientda bulunmas gereken proxydir. Elma_Skel ise (Skeleton^dan geliyor) serverda bulunur. RMIC Eclipe (ya da WSAD) zerinden ayrlmadan aadaki gibi altrabilirsiniz: Run --> External Tools-->External Tools mensne gidip aadaki ayarlar yapn ve run edin. Console viewda hi bir hata gelmezse RMIC gerekli classlar yapm demektir. Bu classlar grmek iin Resource Perspectivei kullanabilirsiniz. Location: Working Directory: Arguments: D:\java\j2sdk141\bin\rmic.exe ${workspace_loc:/sibJava} sib.rmi.elma.Elma

Sibnet Java Eitimi Lab almas

63

6. RMIREGISTRY Client ile Server bir name server zerinden haberleirler. Server objectlerini name servera bir adla kaydeder. Client bu adla name serverdan remote objectin referansna ular. Name server bir servistir. Java JDK bin dizininde bulunan RMIREGISTRY.EXE bu servisi implement eder. Bu program altrn. Yine Eclipse platformundan ayrlmadan aadaki ayarlarla External Tools mensnden altrabilirsiniz:

Location: Working Directory: Arguments:

D:\java\j2sdk141\bin\rmiregistry.exe ${workspace_loc:/sibJava} -yok-

Not: Aadaki kod RMI name servise (rmiregistry.exe) JNDI Interfacei ile erime yoludur. JNDI dnda RMI name servise erime yollar da bulunmaktadr. Hashtable parms = new Hashtable(); parms.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory"); parms.put(Context.PROVIDER_URL, "rmi://localhost"); Context ctxt = new InitialContext(parms); IElma e1 = (IElma) ctxt.lookup("ELMAX"); 7. Test imdi sistemi test edin. 7.1. 7.2. 7.3. 7.4. 7.5. 4 class oluturun. RMIC compiler Elma class zerinde altrp Elma_Stub ve Elma_Skel classlarnn olumasn salayn. RMIREGISTRY.EXEy altrn. ElmaSrvyi altrn. Bu class iinde bir loop olmad halde terminate etmeyip ElmaCli clientn almasn bekleyecektir. ElmaCliyi altrn.

Sibnet Java Eitimi Lab almas

64

Lab 14: Utility Classlar Regular Expression Bu regular expression'da parantezler art deil, ancak grup oluturuyor. String regex = "(\\w+)@(\\w+\\.)(\\w+)(\\.\\w+)*"; rnein, daha sonra aadaki ifade bir nolu grubu yazdrmak iin kullanlacaktr. System.out.println("Found a match: " + matcher.group(1));

Kod Listesi import java.util.regex.*; public class EMail { public static void main(String[] args) { // Compile the regex. String regex = "(\\w+)@(\\w+\\.)(\\w+)(\\.\\w+)*"; Pattern pattern = Pattern.compile(regex); // Create the 'target' string we wish to interrogate. String targetString = "You can email me at g_andy@example.com or andy@example.net.tr.x to get more info"; // Get a Matcher based on the target string. Matcher matcher = pattern.matcher(targetString); // Find all the matches. while (matcher.find()) { System.out.println("Found a match: " + matcher.group()); System.out.println("Start position: " + matcher.start()); System.out.println("End position: " + matcher.end()); System.out.println("Found a match: " + matcher.group(1)); System.out.println("Found a match: " + matcher.group(2)); System.out.println("Found a match: " + matcher.group(3)); } } }

Regular Expression -2 package sib.regex; import java.util.regex.*; public class RegEx { public static void main(String[] args) { // s.mathes(regex) in anlam: // s regex kuralna uyacak. // sfr ya da daha fazla sayda a ve bir b String s = "ab"; // diger match edenler :"b" , "ab", "aab"
Sibnet Java Eitimi Lab almas

65

boolean b = s.matches("a*b"); System.out.println(b); // en az bir a ve sfr ya da daha fazla b s = "aabbb"; // diger match edenler :"a" , "ab", "aab" "aabbb" b = s.matches("a+b*"); // a veya b (bir tane) ve bir ya da daha fazla c s = "accc"; // diger match edenler :"ac" , "bc", "a" "b" b = s.matches("[a|b]c*"); // "Hello" ile balayacak ve herhangi bir karakterden // birden fazla olabilir. s = "Hello World"; // b = s.matches("Hello.*"); // inde "Hello" geen string s = "Merhaba Hello World"; b = s.matches(".*Hello.*"); // E-Mail adres kontrol s = "yky1@sibnet.com.tr"; // @ olmaz zorunda // ondan nce rakam ve harf ieren herhangi birey olabilir. b = s.matches("[a-z|0-9]*@.*"); System.out.println(b); /////////////////////////// String sp[] = "ank ist adana".split(" "); System.out.println(sp[0]); // virgule gre ayr, // virglden sonra sfr, bir ya da daha fazla boluk olabilir sp = "appels,oranges, pears".split(",\\s*"); System.out.println(sp[0] + "~" + sp[1]); ///////////////////////////// // ,? : bir ya da hi virgul // !? : bir ya da hi ! // \\s+ : en az bir space olmal. // also matching: // "Hello, World!" "Hello World" "hello world" String x = "dhello, World!"; b = x.matches("^[Hh]ello,?\\s+[Ww]orld!?$"); System.out.println(b); /* ////////////////////// group // virglden ncesi ve sonras ayn ise true x = "hello, hello"; // also matches //x = "hellx, hellx"; b = x.matches("([a-z]*), \\1"); System.out.println(b); ///////////// // bir char ve 3 digitlik her ey. // \\d{3} : 3 digit demek
Sibnet Java Eitimi Lab almas

66

String roaster = "X123"; // Kenan123456"; String re = "([A-Za-z]\\d{3})"; //.*\\((\\d{6})\\)"; Pattern p = Pattern.compile(re); Matcher m = p.matcher(roaster); while (m.find()) { System.out.println(m.group(1)); //System.out.println(m.group(2)); } } /////////////// ///////////// // bir char ve 3 digitlik her ey. // \\d{3} : 3 digit demek { String roaster = "X123.123456"; String re = "([A-Za-z]\\d{3}).*(\\d{6})"; Pattern p = Pattern.compile(re); Matcher m = p.matcher(roaster); while (m.find()) { System.out.println(m.group(1)); System.out.println(m.group(2)); } */ } }

DateFormat Class DateFormat inFormatter = DateFormat.getDateInstance(DateFormat.SHORT); DateFormat outFormatter = DateFormat.getDateInstance(DateFormat.LONG); Date today = inFormatter.parse("12.1.2001"); System.out.println(outFormatter.format(today)); System.out.println(outFormatter.format(new Date())); System.out.println(inFormatter.format(new Date())); Output: 12 Ocak 2001 Cuma 29 Kasm 2006 aramba 29.11.2006

GregorianCalendar Class Calendar calendar = new GregorianCalendar(); calendar.setTime(new Date()); System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); Output 333 29 (29 Kasmda yaplan test) ki tarih arasndaki Fark Calendar cal_1 = new GregorianCalendar();
Sibnet Java Eitimi Lab almas

67

Calendar cal_2 = new GregorianCalendar(); cal_1.set( 1997, Calendar.MARCH, 1, 0, 0, 0 ); cal_2.set( 1998, Calendar.APRIL, 2, 0, 0, 0 ); long time = cal_2.getTime().getTime() - cal_1.getTime().getTime();// ms long days = Math.round( (double)time / (24. * 60.*60.*1000.) ); //days System.out.println( "Fark: " + days );

Sibnet Java Eitimi Lab almas

68

Lab 15: Java 2 Security Java 2de Appletler mutlaka java.security.manager tarafndan denetlenir. Local code ise ancak aadaki gibi istenirse java.security.manager tarafndan gvenlik kontrolnden geirilir.

Java 2 Security Lab almas

Bu almalarda Eclipse ya da WSAD kullanlacaktr. 1. Aadaki kod file sisteme eriip dummy.txt adl dosyay oluturur. Bu kodu yazp test edin. import java.io.*; public class FileIOX { public static void main(String[] args) { try { FileWriter out = new FileWriter("c:\\dummy.txt"); out.write("Java2X"); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } }

2. Bu kod security manager olmadan alr. imdi security manager devreye sokun. Bunun iin JVMyi Djava.security.manager parametresi ile altrn. Aadaki hata mesajn alrsnz.
java.security.AccessControlException: access denied (java.io.FilePermission c:\dummy.txt write)

3.

Security Manager aadaki kod ile de devreye girer. main() metodunda ilk satra ekleyebilirsiniz: System.setSecurityManager(new SecurityManager());

4.

imdi sec.policy adl (herhangi bir ad olabilir) policy file yapn. a. Bu dosyay yaratmak iin j2sdk\bin\policytool.exe adl program kullann. b. Add Policy Entry ile yeni bir policy ekleyin. Add Permission ile aadaki ayarlar girin. Bu ekilde btn dosyalara Read-Write-Execute-Delete hakk vermi olursunuz. c. Bu file ..\jre\lib\security altna sec.policy adyla kopyalayn.

5. imdi yarattnz policy dosyasnn JVM tarafndan dikkate alnmasn salayn. Bunun iin aadaki satr
..\jre\lib\security altndaki java.security dosyasna ekleyin. Numaray (..url.3) uygun ekilde java.security dosyasndaki sraya gre deitirin:
Sibnet Java Eitimi Lab almas

69

policy.url.3=file:${java.home}/lib/security/sec.policy

Not: Policy file file sistemde herhangi bir yerde olabilir. Aadaki gibi yerini belirtebilirsiniz. policy.url.3=file:/C:/Test/mypolicy 6. imdi -Djava.security.manager ile run edin. imdi dummy.txt file yaratlabilmeli.

Sibnet Java Eitimi Lab almas

70

Lab 16: JDBC

Cloudscape iin: Driver=com.ibm.db2j.jdbc.DB2jDriver JAR=C:\IBM\WID602\runtimes\bi_v6\cloudscape\lib\db2j.jar Url=jdbc:db2j:C:\scape2;create=true

Start.java
public class Start { public static void main(String[] args) { EmployeeHome.select(); } }

EmployeeHome.Java
public class EmployeeHome { static final String DRIVER ="com.ibm.db2j.jdbc.DB2jDriver"; static final String URL = "jdbc:db2j:C:\\employee"; static { try { Class.forName(DRIVER); } catch (Exception e) { e.printStackTrace(); } } public static void select() { try {

Connection conn = DriverManager.getConnection(URL); Statement query = conn.createStatement(); ResultSet rs = query.executeQuery("select * from app.users"); User u = new User(); while(rs.next()) { u.setId(rs.getInt(1)); u.setFistName(rs.getString(2)); u.setLastName(rs.getString(3)); System.out.println(u); }

rs.close(); conn.close(); System.out.println(conn);

} catch (Exception e) { e.printStackTrace(); }

} }

Sibnet Java Eitimi Lab almas

71

User.java
public class User implements Serializable{ private int id; private String fistName; private String lastName; public User() { } public String getFistName() { return fistName; } public void setFistName(String fistName) { this.fistName = fistName; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String toString() { return "id=" + id + " + lastName; }

ad="+fistName + "

soyad="

Sibnet Java Eitimi Lab almas

72

Ek-A : Swing API Java ile standalone grafik uygulamalar yapabilirsiniz. Bunun iin kullanabileceiniz iki API var: AWT ve Swing API. Ayrca SWT ile Eclipse plug-in de yapabilirsiniz. JMenuBar JFrame f = new JFrame(); Container c = f.getContentPane(); // // JMenuBar mb = new JMenuBar(); JMenu m1 = new JMenu("File"); // file JMenu m2 = new JMenu("Edit"); // edit JMenuItem it1 = new JMenuItem("Open"); JMenuItem it2 = new JMenuItem("Save"); it1.addActionListener(this); m1.add(it1); m1.add(it2); mb.add(m1); mb.add(m2); // c.add(mb); // yanl, aadakini kullann. f.setJMenuBar(mb); Not: Bu rnekte sadece it1 iin Event Listener eklenmitir. JmenuItem iin gereken listener Jbutton iin kullanlan ActionListener ile ayndr. actionPerformed(ActionEvent e) metodu implement edilmelidir.

Event Handling Event Handling iin aadaki ilem yaplr: lgili XXXListener implement edilir. Component setXXListener metodunu kullanarak Listener instancen register eder. Bunun iin 3 yntem vardr: 1. Listener ayr bir class olarak implement edilir. class MyFrame extends JFrame { JButton b = new JButton(); b.addActionListener(new MyListener()); } Class MyListener implement ActionListener { public void actionPerformed(ActionEvent e) {...} } Sorun: actionPerformed iinde aadaki satr kullanlamaz: if (e.getSource() == b1) 2. Listener Frame class iinde implement edilir.
Sibnet Java Eitimi Lab almas

73

class MyFrame extends JFrame implements ActionListener { JButton b = new JButton(); b.addActionListener(this); ... public void actionPerformed(ActionEvent e) {...} } 3. Inner class. Jframe f=new Jframe(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.out.println("---- k"); Window w = (Window) e.getSource(); w.setVisible(false); w.dispose(); System.exit(0); } } Not: WindowAdapter kullanlmasnn sebebi implement edilecek metod saysn azaltmak. Sadece istediklerimizi implement etmek. Aslnda WindowAdaper abstruct bir class. inde dummy metod implementationlar var. Biz istediimizi override ediyoruz. rnek Aada basit bir Swing uygulamas verilmitir. Bu programn kts ekilde grlen penceredir.
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Sw2 { private static String labelPrefix = "Number of button clicks: "; private int numClicks = 0; public Component createComponents() { final JLabel label = new JLabel(labelPrefix + "0 JButton button = new JButton("I'm a Swing button!"); button.setMnemonic(KeyEvent.VK_I); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks); } }); label.setLabelFor(button); /* * An easy way to put space between a top-level container * and its contents is to put the contents in a JPanel * that has an "empty" border. */ JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder( 30, //top 30, //left 10, //bottom
Sibnet Java Eitimi Lab almas

");

74

30) //right ); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label); return pane; } public static void main(String[] args) { try { // UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); // UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); // UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

} catch (Exception e) { } //Create the top-level container and add contents to it. JFrame frame = new JFrame("SwingApplication"); Sw2 app = new Sw2(); Component contents = app.createComponents(); frame.getContentPane().add(contents, BorderLayout.CENTER); //Finish setting up the frame, and show it. frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } }

Sibnet Java Eitimi Lab almas

75

Ek-B : Java tools (native2ascii) Properties dosyasnn Trke karakterleri desteklemesi iin Unicode karakterler kullanmalsnz. Bunun iin properties dosyasna TR karaklerleri yazdktan sonra aadaki gibi dntrn: C:\Eclipse\j2sdk142\bin>native2ascii -encoding iso8859_9 a=\u00f6\u00e7\u011f\u00fc\u015f\u0131
a.txt dosyasinn ierii aadadr: a=gsi

a.txt

Sibnet Java Eitimi Lab almas

76

Ek-C : Java SDK Bu altrma Java aralarn (JDK: Java Development Kit) tanmaya yneliktir. Bu kapsamda katlmc ilk Java programn Sun Java JDK ve Eclipse zerinde gelitirecektir. Not: Java2den sonra JDK yerine SDK ifadesi kullanlmaya balamtr. Sun JDK 1. Eitmenin bilgisi dahilinde PCnize Sun JDK 1.4.x kurulumunu yapn. 2. Bir MS-DOS komut satr penceresi an. 3. MSDOS penceresinden programnz koyabileceiniz bir dizin yaratn ve bu dizine gein (aadaki komutlar kullanabilirsiniz) md c:\java cd c:\java 4. Notepad ile Elma.java dosyas yaratn. class Elma { String Renk; String getRenk() { return Renk; } void setRenk(String r) { Renk = r; } public static void main(String args[]) { Elma e1; e1 = new Elma(); e1.setRenk("Krmz"); String r = e1.getRenk(); System.out.println(r); } } 5. Aadaki komut ile Elma.java programn compile edin (Sun Java ..\bin dizini PATHde olmal). Compile sonucunda Elma.class dosyas olumu olmal. Javac Elma.java 6. Programnz (Elma.class) aadaki komutla altrn: Java Elma Sun JDK 2 ayr class 1. Yukardaki program iki ayr java dosyasna bln. Birinci dosya Elma.java. kinci dosya Start.java. Ancak bu kez Elma.java iindeki main() metodunu Start.java iine tayn. 2. Start.java ve Elma.java programlarnda class ismi ile dosya isminin ayn olmas gerekiyor. Start.java iinde gerekli deiiklikleri yapn. 3. Elma.java ve Start.javay compile edin: Javac Elma.java Javac Start.java

Sibnet Java Eitimi Lab almas

77

4. Start.class dosyasn altrn. Java Start

Sun JDK 2 ayr class 1. C:\java altnda bir lib adl alt dizin an ve Elma.* dosyalarn lib dizini altna tayn (copy yerine move ilemi yapn) 2. Start.class dosyasn altrn.
Java Start

3. JVM hangi hatay veriyor? Nasl dzeltirsiniz? Eclipse

Bu altrmadan nce eitmeniniz size Eclipse stnde rnek bir uygulama gsterecektir. 1. Eitmenin verdii bilgiler dorultusunda sisteminize Eclipse'i kurun. 2. JavaX adl yeni bir Java Project yaratn. 3. Yarattnz Java projesi altnda com.xnet.demo adl Java package yaratn. 4. com.xnet.demo package altna iki adet Java Class yaratn. Bu class'larn ad Elma ve Start olsun. Class'larn ieriini yukardaki altrmada yaptnz Elma.java ve Start.java dosyalarndan copy paste ile oluturabilirsiniz. 5. Start.java dosyasn altrn. 6. Start.java program iinde gerekli deiiklii yaparak, Elma nesnesinin rengini komut satrndan alabilecek duruma getirin. Programnza komut satrndan parametrelerini aadaki pencereden vereceksiniz.
Sibnet Java Eitimi Lab almas

78

7. Eclipse debug perpective'i WSAD'daki debug perspectivine benzer. Start.class dosyasn debug edin.

Yantlar Start.java class Start { public static void main(String args[]) { Elma e1; e1 = new Elma(); e1.setRenk("Krmz"); String r = e1.getRenk(); System.out.println(r); } } Sun JDK 2 ayr class Sun JDK baka dizinlerdeki class dosyalarn ancak CLASSPATH environment deikeninde arar. JDK'nn Elma.class dosyasn bulabilmesi iin CLASSPATH deikenini aadaki gibi set etmelisiniz. set CLASSPATH=.\;c:\java\lib Start.java (Komut Satr kullanan versiyon) class Start { public static void main(String args[]) { Elma e1; e1 = new Elma(); e1.setRenk(args[0]); String r = e1.getRenk(); System.out.println(r); } }

Sibnet Java Eitimi Lab almas

79

Ek-D: JavaDoc JavaDoc Java API documentation yaratma aracdr. Aada Elma nesnesi iin yaratlan HTML formatnda API dokman grlmektedir. Eclipse iinden Javadocu kullanabilirsiniz. 1. Eclipse iinde Window Preferences dialog penceresinde Java Javadoc seeneine gidin. Burada Javadoc komutunun yerini sormaktadr (Javadoc Command ) . Javadoc.exe JDK 1.3 ya da 1.4de bin dizinindedir. 2. Eclipse File Export mensnden Javadoc Wizard tklayn. Istediiniz proje (ya da paketi) setikten sonra finish ile ilemi balatn. 3. Console viewdan javadocun almasn izleyin. Eer kodlarnnzda hata yoksa Javadoc ilgili classlar iin ayn proje iinde HTML dokmanlar yaratacaktr. rnein Elma class iin retilen API dkman (HTML formatnda) aadadr. 4. Javadoc rettii HTML kodu iindeki bilgileri nereden alr? Aslnda bu bilgiler yazdmz Java kodlar iindeki comment satrlardr. Ancak szkonusu comment satrlar iki yldz (/**) ile balar. Bu comment satrlar iindeki @author gibi alanlar javadoc toolunun tand alanlardr.

/** * @author Administrator * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */

Package Class Use Tree Deprecated Index Help


PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes All Classes DETAIL: FIELD | CONSTR | METHOD

sib.interfacex Class Elma


java.lang.Object | +--sib.interfacex.Elma All Implemented Interfaces: IElma public class Elma extends java.lang.Object implements IElma Author: Administrator To change the template for this generated type comment go to Window - Preferences - Java Code Generation - Code and Comments

Method Summary
java.lang.String getRenk() void setRenk(java.lang.String r)

Sibnet Java Eitimi Lab almas

80

Methods inherited from class java.lang.Object equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Method Detail
getRenk
public java.lang.String getRenk() Specified by: getRenk in interface IElma

setRenk
public void setRenk(java.lang.String r) Specified by: setRenk in interface IElma Package Class Use Tree Deprecated Index Help
PREV CLASS NEXT CLASS SUMMARY: NESTED | FIELD | CONSTR | METHOD FRAMES NO FRAMES All Classes All Classes DETAIL: FIELD | CONSTR | METHOD

Sibnet Java Eitimi Lab almas

81

Ek-E Eclipse Notlar Eclipse 3.x Notlar Template : Preferences Java Editor Template.

Alan bir ssl parantezin ( kod blou { ) nerede kapandn bulmak iin; ssl parantezin bulunduu satra gidip ift tklayn. Kod blounun kapand noktaya kadar taranacaktr.

Sibnet Java Eitimi Lab almas

82

Sibnet Java eitimleri laboratuvar almas kitapdr. 2006

Sibnet letiim Bilgileri Tel Faks Web : 0216-658 80 84 (pbx) : 0216-658 80 85 : www.sibnet.com.tr

Sibnet Java Eitimi Lab almas

You might also like