Kompozisyon Bir Sınıf diğer sınıf nesne referanslarını içinde barındırabilir. Bu referanslar sınıfın üyeleridir.
* 1 // Fig. 8.9: Date.java * 2 // Date class declaration. * 3 * 4 public class Date { * 5 private int month; // 1-12 * 6 private int day; // 1-31 bir aylık * 7 private int year; // sene * 8 * 9 * 10 * 11 public Date( int theMonth, int theDay, int theYear ) * 12 { * 13 month = checkMonth( theMonth ); // ayı kontrol et * 14 year = theYear; // * 15 day = checkDay( theDay ); // * 16 * 17 System.out.println( "Date object constructor for date " + * 18 toDateString() ); * 19 * 20 } // end Date constructor * 21 * 22 // utility method to confirm proper month value * 23 private int checkMonth( int testMonth ) * 24 { * 25 if ( testMonth > 0 && testMonth <= 12 ) // validate month * 26 return testMonth;
* 27 * 28 else { // month is invalid * 29 System.out.println( "Invalid month (" + testMonth + * 30 ") set to 1." ); * 31 return 1; // maintain object in consistent state * 32 } * 33 * 34 } // end method checkMonth * 35 * 36 // utility method to confirm proper day value based on month and year * 37 private int checkDay( int testDay ) * 38 { * 39 int daysPerMonth[] = * 40 { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; * 41 * 42 // check if day in range for month * 43 if ( testDay > 0 && testDay <= daysPerMonth[ month ] ) * 44 return testDay; * 45 * 46 // check for leap year * 47 if ( month == 2 && testDay == 29 && ( year % 400 == 0 || * 48 ( year % 4 == 0 && year % 100 != 0 ) ) ) * 49 return testDay; * 50 * 51 System.out.println( "Invalid day (" + testDay + ") set to 1." ); * 52 * 53 return 1; // maintain object in consistent state * 54 * 55 } // end method checkDay
* 56 * 57 // return a String of the form month/day/year * 58 public String toDateString() * 59 { * 60 return month + "/" + day + "/" + year; * 61 } * 62 * 63 } // end class Date
* 1 // Fig. 8.10: Employee.java * 2 // Employee class declaration. * 3 * 4 public class Employee { * 5 private String firstName; * 6 private String lastName; * 7 private Date birthDate; * 8 private Date hireDate; * 9 * 10 // constructor to initialize name, birth date and hire date * 11 public Employee( String first, String last, Date dateOfBirth, * 12 Date dateOfHire ) * 13 { * 14 firstName = first; * 15 lastName = last; * 16 birthDate = dateOfBirth; * 17 hireDate = dateOfHire; * 18 } * 19 * 20 // convert Employee to String format * 21 public String toEmployeeString() * 22 { * 23 return lastName + ", " + firstName + * 24 " Hired: " + hireDate.toDateString() + * 25 " Birthday: " + birthDate.toDateString(); * 26 } * 27 * 28 } // end class Employee
* 1 // Fig. 8.11: EmployeeTest.java * 2 // Demonstrating an object with a member object. * 3 import javax.swing.JOptionPane; * 4 * 5 public class EmployeeTest { * 6 * 7 public static void main( String args[] ) * 8 { * 9 Date birth = new Date( 7, 24, 1949 ); * 10 Date hire = new Date( 3, 12, 1988 ); * 11 Employee employee = new Employee( "Bob", "Jones", birth, hire ); * 12 * 13 JOptionPane.showMessageDialog( null, employee.toEmployeeString(), * 14 "Testing Class Employee", JOptionPane.INFORMATION_MESSAGE ); * 15 * 16 System.exit( 0 ); * 17 } * 18 * 19 } // end class EmployeeTest Date object constructor for date 7/24/1949 Date object constructor for date 3/12/1988
* final anahtar kelimesi * Değişken güncelleştirilemez. * final değişkeni değiştirmeye kalkılsa hata verir. private final int INCREMENT = 5; * INCREMENT değişkeni sabit olarak tanıtılmıştır.
* Bir metodun birden fazla durum için kullanılabilmesi işlemi. * Sınıfın içinde metodun kullanılması gereken her durumun tanımlanması gerekmektedir. Bu metot başka bir metot tarafından çağırıldığında metottaki tanım ve parametre dizilişine göre hangi tanımın geçerli olduğu belli olacaktır. * Bir metodun fazladan yüklenmesi yapılırken sadece metoda girilen parametrelere bakılır. Metodun geri verdiği veri tipinin bir önemi yoktur.
* Örn. * Math.max (x,y) yazıldığında aynı metota int, long, float veya double veri tipi girilebilir. Bu durumda max metodu aşırı yüklenmiştir ve hangi veri tipinin hangi max metodunu kullanacağı girilen parametrelere göre ayarlanır.
public class fazladanYukleme { public void ayniSey() { System.out.println("Merhaba gencler..."); } public boolean ayniSey(int sayi) { boolean yanit; if(sayi%2==0) yanit=true; else yanit=false; return yanit; } public class fazladanYuklemeDeneme { public static void main(String[]args) { boolean yanit; int N; Scanner klavye = new Scanner(System.in); System.out.print("Bir sayi giriniz:"); N=klavye.next(); fazladanYukleme fark=new fazladanYukleme(); yanit=fark.ayniSey(N); if(yanit) System.out.println(N+" cift sayidir."); else System.out.println(N+" tek sayidir."); fark.ayniSey(); }
* Metot fazladan yüklemesi yapıldığında veri tipi çevirimlerine dikkat etmek gerekir. Eğer double parametresi bekleyen bir metoda int veri tipi girildiğinde, eğer int veri tipi bekleyen aşırı yüklenmiş metot tanımı yoksa int otomatik olarak double’a çevrilir ve metot kullanılır. Bunun tersi durumda ise (double’ı int’e çevirmek gerektiğinde) derleyici bir hata verir. Bu durumda veri zorlaması yapılması gerekmektedir. * public static void ornekMetot (double n1, int n2) public static void ornekMetot (int a1, double a2) ornekMetot (5,10); ornekMetot (5.0,10);
* Aynı parametrelere sahip, farklı veri tipi döndüren iki fazladan yüklenmiş metot Java’da aynı sınıf tanımı içinde kullanılamaz. * public static int ornekMetot () public static char ornekMetot () * Hata: Aynı parametreler girildiğinde hangi metodun kullanılacağı belli değil.
Doğru Yanlış
İSTİSNA YÖNETİMİ (EXCEPTION) İstisnalar, programımızın çalışma zamanında yani program çalışırken kullanıcı kaynaklı yanlış veri tipi girme gibi daha birçok şekilde ortaya çıkan olağan dışı durumlardır. Programcılık dilinde "programın kırılması" ile adlandırılan olaylarda aslında bir istisnanın meydana geldiğini göstermektedir. Örneğin bir sayının sıfıra bölünmesi gibi Exception in thread «main» java.lang.ArithmeticException: / by zero at Donusum1.main(Donusum1.java:14) Başka bir istisna örneği ise uyumsuz tipler arasında değer aktarımı gerçekleştirmeye çalışmaktır. Bir programcı olarak kod üzerinde her ne kadar detaylı çalışma yapsakta kullanıcı faktörü göz önüne alındığında çalışma zamanı hatalarının ( Runtime Error ) ortaya çıkması olasıdır.
Çalışma zamanında ortaya çıkabilecek bazı istisnalar. int sayi1 = 15; int sayi2 = 0; int sonuc = 0; sonuc = sayi1 / sayi2; // Sıfıra bölünme hatası sonuc = Integer.parseInt("Selam"); // Tür dönüşüm hatası Exception in thread "main" java.lang.ArithmeticException: / by zero at Donusum1.main(Donusum1.java:14) Exception in thread "main" java.lang.NumberFormatException: For input string: "Selam" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at Donusum1.main(Donusum1.java:15)
* Hataları ve istisnaları belirlemek ve bu istisnaları yakalayıp yönetmek için bir takım işlemler yapmak gerekmektedir. * Bir hatayı ortaya çıkmadan önce belirleyebilmek için öncelikle çalışma anı hatalarının ortaya çıkabileceği kodları belirlemek gerekir. Bu işlem yapıldıktan sonra önceden tanımlanmış bazı ifadelerden birini kullanarak istisna yakalama işlemi gerçekleştirilir. Bunlar; * 1. try catch * 2. try finally * 3. try catch finally *
int sayi1 = 15; int sayi2 = 0; int sonuc = 0; try { sonuc = sayi1 / sayi2; // Sıfıra bölünme hatası } catch(Exception hata) { JOptionPane.showMessageDialog(null, "Hata var: " + hata ); } try { Sonuc = Integer.parseInt("Selam"); // Tür dönüşüm hatası } catch(Exception hata) { JOptionPane.showMessageDialog(null, "Hata var: " + hata ); }
try { String[] Aylar = {"Ocak","Şubat","Mart","Nisan","Mayıs"}; for(int i = 0; i < 10; i++) { System.out.print(Aylar[i] + " "); } catch(ArrayIndexOutOfBoundsException hata) { System.out.println("Hata var : " + hata.toString()); } finally { System.out.println("Bitti"); }
InputStreamReader SatirOku = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(SatirOku); while (true) { System.out.print("Yarıçapı Girin: "); String str = br.readLine(); double yaricap; try { yaricap = Double.valueOf(str).doubleValue(); } catch (NumberFormatException nfe) { System.out.println("Hatalı veri tipi yeniden girin"); continue; } if (yaricap <= 0) { System.out.println("Yarıçap pozitif tamsayı olmalı!"); continue; } double alan = Math.PI * yaricap * yaricap; System.out.println("Alan: " + alan); return; } catch (Exception e) { e.printStackTrace(); }