Bölüm 5 Nesneler ve Metotlar Bil 102 Bölüm 5 Nesneler ve Metotlar Bil 102
Metotlarla Programlama Bir metodun içinde başka bir metot çağrılabilir. Aynı sınıfın içinden çağrılıyorsa sadece metot adı ile çağrılır (veya this kullanılabilir this.metotadı). Farklı bir sınıf içinden çağrılıyorsa, nesneadı.metotadı şeklinde çağrılmalıdır. Farklı bir sınıf içinden çağrılabilmesi için metodun public olarak tanımlanmış olması gerekir. Bil 102
Metotlarla Programlama Başka sınıflar tarafından çağrılma gereksinimi olmayan metotlar private, diğer sınıflar tarafından çağrılması gereken metotlar public olarak tanımlanır. Bu şekilde private olarak tanımlanmış metotlara yardımcı metotlar denir. Bil 102
Sayı Oyunu Örneği Kod. Bil 102
Static Metotlar ve Değişkenler Static olarak tanımlanan bir değişken veya metot, nesnenin türüne ve durumuna bağlı olmaksızın kullanılabilen bir yapıdadır. Bu durumda sınıf ismi nesne yerine kullanılır. Ayrıca bir nesne oluşturulmaz. Math.sqrt(25); Sınıf ismi Metot ismi Bil 102
Static Metotlar ve Değişkenler Static olarak tanımlanan bir metot veya değişkenin değeri ya da kullanımı herhangi bir nesnenin durumundan bağımsız olmalıdır. Math.min(a,b) : Hangi nesne tarafından çağrılırsa çağrılsın verilen iki sayının küçüğünü hesaplar. Static olarak tanımlanabilir. Bil 102
Static Metotlar ve Değişkenler Yalnızca sınıf değişkenleri ve metotlar static olabilir; static sınıf olmaz. Static nesne ve metotları çağırırken: Sınıfadı.metotadı(); Sınıfadı.değişkenadı(); Static olmayan nesne ve metotları çağırırken: Nesneadı.metotadı(); Nesneadı.değişkenadı(); Bil 102
Static Metotlar ve Değişkenler Static olduğu halde nesneadı.metotadı() veya nesneadı.değişkenadı şeklinde çağrılması halinde derleyici hata vermez. Ancak static metot ve değişkenler, kaç tane nesne yaratılmış olursa olsun sadece tek bir adet değere ve referansa sahiptir. Static metot ve değişkenler this kullanılarak çağrılamaz Derleyici Hatası Bil 102
Static Metotlar ve Değişkenler public class StatikOrnek { public static int staticA; // statik degisken public int a; //statik olmayan degisken public static void setStaticA(int deger) { staticA = deger; } public void setA( int deger) { a = deger; } public int getStaticA() { return staticA; } public int getA() { return a; } } Bil 102
Static Metotlar ve Değişkenler public class DeneStatikOrnek { public static void main(String [] args) StaticOrnek s1 = new StaticOrnek(); StaticOrnek s2 = new StaticOrnek(); s1.setStaticA(5); s1.setA(10); s2.setStaticA(15); s2.setA(20); System.out.print(“s1 nesnesinin staticA degeri: ”); System.out.println(s1.getStaticA); System.out.print(“s1 nesnesinin A degeri: ”); System.out.println(s1.getA); System.out.print(“s2 nesnesinin staticA degeri: ”); System.out.println(s2.getStaticA); System.out.print(“s2 nesnesinin A degeri: ”); System.out.println(s2.getA); }} s1 nesnesinin staticA degeri: 15 s1 nesnesinin A degeri: 10 s2 nesnesinin staticA degeri: 15 s2 nesnesinin A degeri: 20 Bil 102
Static – Düzeltmelerden Sonra public class StatikOrnek { public static int staticA; // statik degisken public int a; //statik olmayan degisken public static void setStaticA(int deger) { staticA = deger; } public void setA( int deger) { a = deger; } public static int getStaticA() { return staticA; } public int getA() { return a; } } Bil 102
public class DeneStatikOrnek { public static void main(String [] args) StaticOrnek s1 = new StaticOrnek(); StaticOrnek s2 = new StaticOrnek(); StatikOrnek.setStaticA(5); s1.setA(10); StatikOrnek.setStaticA(15); s2.setA(20); System.out.print(“s1 nesnesinin staticA degeri: ”); System.out.println(StatikOrnek.getStaticA); System.out.print(“s1 nesnesinin A degeri: ”); System.out.println(s1.getA); System.out.print(“s2 nesnesinin staticA degeri: ”); System.out.print(“s2 nesnesinin A degeri: ”); System.out.println(s2.getA); } Bil 102
Örnekler C M,N için bir sınıf yazınız. Sınıfın metotları verileriAl (ve hesapla) M, N parametrelerini main’den girerek CM,N ’i hesapla. Bil 102
public class kombinasyon { public static int verileriAl(int M, int N) int c; c=nFaktoriyel(M) / (nFaktoriyel(N) * nFaktoriyel(M-N)); // c=this.nFaktoriyel(M) / (nFaktoriyel(N) * nFaktoriyel(M-N)); // derleyici yukaridaki satir icin hata verir return c; } public static int nFaktoriyel(int K) int nFakt; nFakt=1; for(int i=1; i<=K; i++) nFakt*=i; return nFakt; Bil 102
Import java.util.*; public class KombinasyonDeneme { public static void main(String[]args) int M,N,sonuc,gecici; Scanner klavye = new Scanner(System.in); System.out.println("M ve N sayılarını giriniz (M>N):"); M=klavye.nextInt(); N=klavye.nextInt(); if(M<=N) gecici=M; M=N; N=gecici; } sonuc=kombinasyon.verileriAl(M,N); System.out.println("c="+sonuc); Bil 102
Örnekler 1!+2!+3!+…+N! Static metot kullanarak Nesne kullanarak Bil 102
//static metot kullanarak yazilmis hali public class deneFaktoriyelToplami { public static void main(String[]args) long n, toplam=0; System.out.print("Bir tamsayi giriniz (n>2):"); Scanner klavye = new Scanner(System.in); n = klavye.nextInt(); for(long k=1; k<=n; k++) toplam = toplam + faktoriyel(k); System.out.println("1!+2!+...+"+n+"!="+toplam); } public static long faktoriyel(long sayi) long f=1; for(int k=1; k<=sayi;k++) f=f*k; return f; Bil 102
static metot static olmayan metot //nesne kullanilarak yazilmis hali public class deneFaktoriyelToplami { public static void main(String[]args) long n, toplam=0; faktoriyelToplami eleman = new faktoriyelToplami (); System.out.print("Bir tamsayi giriniz (n>2):"); Scanner klavye = new Scanner(System.in); n = klavye.nextInt(); for(long k=1; k<=n; k++) toplam = toplam + eleman.faktoriyel(k); System.out.println("1!+2!+...+"+n+"!="+toplam); } public class faktoriyelToplami public long faktoriyel(long sayi) long f=1; for(int k=1; k<=sayi;k++) f=f*k; return f; static metot static olmayan metot Bir static metot içinde static olmayan bir metot çağrılabilmesi için, static olmayan metoda ait bir nesne yaratılıp bu nesneyle beraber kullanılması gerekir. Bil 102
Bir static metot içinde static olmayan bir metot çağrılabilmesi için, static olmayan metoda ait bir nesne yaratılıp bu nesneyle beraber kullanılması gerekir. import java.util.*; public class DaireHesabi { public static final double PI=3.1415; private double daireCapi; public void setDaireCapi(double Cap) { daireCapi = Cap; } public static double alan(double yaricap) { return (PI* yaricap * yaricap); } public void alanGoster() { System.out.println(“Dairenin alani “+ alan(daireCapi/2)); } public static void alanBulma() { System.out.println(“Dairenin capini giriniz:”); Scanner klavye = new Scanner(System.in); double cap1 = klavye.nextDouble(); DaireHesabi daire1 = new DaireHesabi(); daire1.setDaireCapi(cap1); daire1.alanGoster(); } public class DeneDaireHesabi { public static void main(String [] args ) { DaireHesabi daire1 = new DaireHesabi(); daire1.setDaireCapi(2); DaireHesabi.alanBulma(); } } Bil 102
Static Değişkenler Static değişkenler nesneden bağımsız kullanım için uygundur. Static değişkenler = Sınıf değişkenleri Bir static metot içinde static olmayan bir değişken çağrılabilmesi için, static olmayan metoda ait bir nesne yaratılıp bu nesneyle beraber kullanılması gerekir. Static bir metot static bir değişkeni kullanıyorsa herhangi bir nesneye bağlı olmadan sadece sınıf değişkeni adıyla kullanabilir. Bil 102
Static main() metodu static bir metottur. Java programını çalıştırmak için kullanılır ve bir sınıf tanımının içinde yer almalıdır. main() metodu static olarak tanımlanmak zorundadır, aksi takdirde derleyici hata verir. Bil 102
Örnek public class DeneKitap { public static void main(String [] args) Kitap kitap1 = new Kitap(); kitap1.setBaslik(“TC Anayasasi”); kitap1.setBasimYili(2001); kitap1.setISBN(“123-45678-9”); kitap1.setSatisFiyati(24.50); kitap1.kitapYazdir(); } Kitap sinifini yazin. Bil 102
Math Sınıfı Math sınıfında kullanılan bütün metotlar static olarak tanımlanmıştır. Kullanırken nesne yaratmaya gerek yok. Sınıfadı.metotadı şeklinde kullanılır. Math.max(x,y) Bil 102
Fazladan Yükleme (Overloading) 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. Bil 102
Fazladan Yükleme Ö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. Bil 102
public class fazladanYukleme { public void ayniSey() { System. out 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) 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."); System.out.println(N+" tek sayidir."); fark.ayniSey(); Bil 102
Fazladan Yükleme 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); Hata! Bil 102
Fazladan Yükleme 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. Bil 102
Nesne Kurucular Bir nesne yaratıldığında nesnenin parametrelerine otomatik olarak veya kullanıcı vasıtasıyla çeşitli değerler atanabilir Nesne kurucusu vasıtasıyla Nesne kurucusu: new SınıfAdı (…) şeklinde çağrılır. Nesne kurucularda aşırı yükleme yapılabilir. Eğer bir nesne kurucusu tanımlanmamışsa Java kendisi otomatik olarak bir nesne kurucusu tayin eder. Bu otomatik kurucu herhangi bir nesne parametresini değiştirmez, new SınıfAdı () şeklinde oluşturulur. Eğer programcı bir nesne kurucusu tanımlamışsa, herhangi bir otomatik kurucu kullanılmaz. Bil 102
Nesne Kurucular Nesne kurucusu da sınıfın diğer metotları gibi bir metottur. Bu metodun kullanımı istenilen şekilde ayarlanabilir. Fakat normal şartlarda nesne değişkenlerine ilk değerleri vermek için kullanılır. Eğer gerekirse nesne kurucusu diğer metotları da çağırabilir. Nesne kurucusu çağırıldığında metot sona erdiğinde o sınıfa ait yeni bir nesne oluşturulmuş olur. Bil 102
public static void main(String [] args) { public class Araba { private String renk; private int beygirGucu; private int hiz; public Araba(String renk, int guc, int hiz) { this.renk = renk; this.beygirGucu = guc; this.hiz = hiz; } public Araba(String renk) { this.renk = renk; } public void veriGoster() { System.out.println(…); … }} public static void main(String [] args) { Araba ferrari = new Araba(“kirmizi”, 450, 320); Araba fiat = new Araba(“beyaz”); fiat.setBeygirGucu(70); fiat.setHiz(155); } Bil 102
Sarmalayan Sınıflar Temel veri türleriyle (int, double, char, long, float) programcı veya Java tarafından hazırlanmış veri türleri (String, vs.) arasında fark vardır. Temel veri türlerinin herhangi bir sınıf gibi kullanılabilmesi için sarmalayan sınıflar adı verilen veri sınıfları oluşturulmuştur. Tablo 5.2 Bil 102
Sarmalayan Sınıflar Sarmalayan sınıfların kullanımı diğer sınıfların kullanımı ile aynıdır. Integer i = new Integer(); i = 10; Temel veri türlerinde atama nasıl yapılıyorsa sarmalayan sınıflarda da öyle yapılır. Kullanıcı tarafından yaratılan sınıflarda atama işlemi yapmak için bu amaca yönelik metotlar yazılması gerekir. Bil 102
Sarmalayan Sınıflar Sarmalayan sınıfa ait bir nesnenin değerini temel bir veri türüne atamak için: int j = i.intValue(); int j = i; Avantaj Kullanıcıya kolaylık sağlayan çok sayıda metot ve değişkenler bulunuyor. Tablo 5.3, 5.4, 5.5 Bil 102
Referans : kadioğlu Bil 102