1 / 45

Üye v e Sınıf Bildirimleri

Üye v e Sınıf Bildirimleri. Üye vs. Sınıf Bildirimleri. Aptal olmayın. Bir değişken sırf sınıf içerisindeki bir alan olarak tanımlandığı için üye değişken olacak diye bir şart yok. Ya sınıf değişkenidir ya da, üye değişkeni (instance variable)

affrica
Download Presentation

Üye v e Sınıf Bildirimleri

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Üye veSınıf Bildirimleri

  2. Üye vs. Sınıf Bildirimleri • Aptal olmayın. Bir değişken sırf sınıf içerisindeki bir alan olarak tanımlandığı için üye değişken olacak diye bir şart yok. • Ya sınıf değişkenidir ya da, • üye değişkeni (instance variable) • Benzer şekilde, bir metod sırf sınıf tanımı içerisinde tanımlandığı için üye metod olacak diye bir şart yok. • Ya sınıf metodudur ya da, • Üye metodu (instance method) • “Sınıf değişkeni” ve “sınıf metodu” ifadeleri özel birşeyler ifade eder.

  3. Üye vs. Sınıf Bildirimleri • Değişkenlere ve metodlara uygulanan bir ayırımdır. • Bir üye değişkeni o sınıfa ait bir nesneye aittir. Yani, üye değişken olarak tanımlanan alanlar, oluşturulan her nesne için ayrı ayrı oluşturulurlar. • Sınıf değişkeni ise, sınıfın kendisine aittir. Yani, sınıf değişkeni olarak tanımlanan alanlar, sadece bir kez oluşturulur; oluşturulan her nesne için ayrı ayrı oluşturulmazlar. Ancak, her nesne bu ortak sınıf değişkenine erişim hakkına sahiptir. • “static” ifadesi: • değişkenin veya metodun bir sınıf değişkeni veya metodu olduğunu belirtir. • bu ifade kullanılmadığı takdirde, değişken veya metod bir üye değişkeni veya metodudur.

  4. Üye vs. Sınıf Bildirimleri Farzedelim ki, programımızda oluşturulan nesnelerin sayısını tutmak istiyoruz : class Insan { String ad; int nufus = 0; public Insan (String ad) { this.ad = ad; nufus++; //HATA! } // yapılandırıcı sonu } // sınıf sonu Her üye için String türünde ve “ad” adında bir üye alanı oluşturur.Böylece her (Insan) kendine ait bir isme sahip olacaktır. Fakat aynı zamanda,her insan için ayrı ayrı “nufus” adında bir alan ayrılıyor. Bu yüzden, her insan değeri 1 olan kendi “nufus” değişkenine sahip olacaktır. Bu hiçbir şey ifade etmez!

  5. Üye vs. Sınıf Bildirimleri class Insan { String ad; static intnufus = 0; public Insan (String ad) { this.ad = ad; nufus++; }//yapılandırıcı sonu } // sınıf sonu NOTE: Her Insan kendine ait bir nufusa sahip olmayacaktır. . Insan sınıfına ait tek bir nufus değişken alanı oluşturulacaktır. İşte, bu bir sınıf değişkenidir. Böylece, her Insan ortak nufus alanını 1 artıracaktır. . Bir değişiklik! Her nesne, kendine aitString türünden “ad” alanına sahip olacaktır. Dolayısıyla her insan kendi ismine sahip olacaktır.

  6. Üye vs. Sınıf Bildirimleri Hangisini ne zaman kullanacağız • Üye değişkenleri, her nesnenin kendine ait bir değişkene ihtiyaç olduğu durumlarda kullanılır. • Örnek, • bir nesnenin özellikleri: • adı, yaşı, kilosu • Sınıf değişkeni ise, sınıfın kendisine ait sadece bir kopyasının olacağı bir veri alanına sahip olması gerektiği ve bütün üye nesnelerin bu alana erişeceği durumlarda kullanılır. • Örnek, • Nüfus sayımları, paylaşılan kaynaklar, vb.. Quiz Alarmı!

  7. Üye vs. Sınıf Bildirimleri Şimdi, hemen hemen bütün bütün sabitlerin neden static ve final tanımlandığını göreceğiz. Her nesne için ayrı fakat aynı değere sahip bir sabit tanımlanıyor. Hiç bir işe yaramayan bir israftır. Sabitlere geri dönüş: class SabitOrnegi{ final int iMaksBoyut = 10; } class SabitOrnegi { static final int iMaksBoyut = 10; } Bütün üyelerin kullanacağı ortak, tek bir sabit tanımlanıyor.

  8. Kendinizi sınayın! Aşağıdaki kodun neden çalışmayacağını tartışın: public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]){ sayHello(); } }

  9. Sınıflar ve Nesneler • Oluşan hata: “Can't make static reference to method void sayHello() in class test.” Yani: “test sınıfı içindeki void sayHello() metoduna static referans yapılamamaktadır.” • Neden?Cevap nesneler ile sınıflar arasındaki farkta yatmaktadır. Daha önceki slaytlarda belirtildiği üzere, sınıflar üye nesnelerden, temel türlerden ve metodlardan oluşur. Doğru düzgün düzenlendiği takdirde, sınıflar nesnelere ait durumları ve davranışları ifade eder. • Nesneye yönelik bir programlama olarak, veriyi işlemek için Java, nesneleri kullanmayı empoze eder. Bu yüzden, programlarımızı yazabilememiz için, sınıflara ait nesneleri oluşturmamız gerekmektedir.

  10. Başka bir bakış t1 t2 public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // WRONG! } }//class Test public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // WRONG! } } }//class Test t3 public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // HATA! } }//class Test public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // WRONG! } } }//class Test Test sınıfını oluşturduğumuz zaman, potensiyel olarak sonsuz sayıda bu sınıfa ait nesne oluşturabiliriz. Test t1 = new Test(); Test t2 = new Test(); // vb..

  11. ÜYELER SINIF Test t1 = new Test(); t1.x = 5; // erişici kullanılmalı public class Test { int x; static int y = 2; }//class Test t1 public class Test { int x; // now 5 static int y; // 2 }//class Test Yeni oluşturulan sınıf örnekleri static ya da sınıf değişkenleri hariç diğer her üye değişkenden bir kopyaya sahip olurlar. Static ifadesini sadece bir kopya anlamında düşünebiliriz. static int y; Test t2 = new Test(); t2.x = 3; // erişici kullanılmalı t2 public class Test { int x; // now 3 static int y; // 2 }//class Test static int y;

  12. t1 public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // HATA! } }//class Test t2 public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // WRONG! } }//class Test Öyleyse, Java bizim sınıfımıza baktığında şunu görür: * sonsuz sayıda oluşturulabilecek Test üyeleri, hepsi de kendi sayHello() metoduna sahip ve, *sadece bir adet (static) main metodu ki bu metod bütün üyeler tarafından paylaşılacak.

  13. public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // HATA! } }//class Test Sonsuz sayıda olabilir Sadece bir adet Öyleyse, bir metoda static referansta bulunrken yapılan bir hatayı “belirsizlik” olarak adlandırabiliriz. Javaya muhtemel pek çok Test sınıfı nesnesinden hangisinin “sayHello()” demek istediğini söylemedik

  14. Sınıflar ve Nesneler class test { public void sayHello(){ // etc. etc. } class test { public void sayHello(){ // etc. etc. } class test { public void sayHello(){ // etc. etc. } }//class test }//class test }//class test HEPSİ TARAFINDAN PAYLAŞILIR “sınıf” ya da “static”üye değişkenleri bütün üye nesneler için tanımlanır. Bütün üye nesneler, bu static alanlara ulaşabilir ve bu alanı diğer bütün nesneler için değiştirebilir. ÜYE NESNELER SINIF class test { public void sayHello(){ // etc. etc } public static void main (String[] argv) { } }

  15. Çözüm1 public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { Test t = new Test(); t.sayHello(); // Doğru } }//class Test Bu belirsizlik ortadan kalkarsa programımızda sorun kalmaz. Öyleyse, sınıfa ait örnek (üye) bir nesneoluşturun ve nesnenin elemanlarına referansta bulunun.

  16. YA DA

  17. Çözüm 2 public class Test { public static void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // Doğru } }//class Test Ya da sadece, metodu static yapın.

  18. Uyarı Daha önceki slaytları anlamadıysanız bu dersteki konular size çok zor gelebilir. Static konusunun daha önceki konularda su istimal edilmesi ikinci en büyük öldürücü hatadır.

  19. Aşağıdaki örneğe bakalım public class Ouch { int w = 0; static int x = 0; final int y = 0; final static int z = 0; public static void main(String [] args) { Ouch one = new Ouch(); Ouch two = new Ouch(); Ouch three = new Ouch(); // sorulara bakın } // main } // Ouch Bellekte kaç adet w oluşturuldu? Kaç adet x? Kaç adet y? Kaç adet z? Sabit var mı?

  20. Küçük sırlar Sınıf değişkenleri ve metodları hiç bir nesne oluşturulmasa bile kullanılabilir. Üye değişkenleri ve metodları ise kendi başlarına var olamazlar, mutlaka bir üye nesneye ait olmalıdırlar. Nesneler, hem sınıf hem de üye elemanlara erişmek için kullanılabilirler. Sınıflar ise sadece sınıf elemanlarına erişim için kullanılabilirler!

  21. Sorular?

  22. Duyurular • Web sayfasını sürekli olarak takip edin!Eğer takip etmezseniz riske girersiniz!

  23. String

  24. Stringler ve Nesneler • Her String daha önceden Java’da oluşturulmuş String sınıfının bir üyesidir. • Öyleyse, String ‘ler birer nesnedir. • Java, String ‘ler için ekstra bir destek sağlar. Bunun sebebi, String ifadelerin çokça kullanılmasıdır. • (Bu ayrıca, String ‘lerin neden temel (primitive) tür olarak görüldüğüne nedendir ama aslında onlar birer nesnedir. • String ‘lere verilen 3 aşikar destek: • String ‘leri ilk yapılandırırken ‘new’ deyimini kullanmanız gerekmez. Java otomatik olarak String nesnesini yapılandırır, yani “ ” işaretleri arasında kalan ifadeyi ilk değer olarak atar. • Örneğin . . .

  25. str1 = “Hello World”; box1 = iLn, iWd, iHt; str1box1 Hello World HATA: “new” ifadesi kullanılmalı ve yapılandırıcı çağırılmalı str1box1 Hello World str1 = “Hello World”; box1 = new Box(iLn, iWd, iHt); iLn, iWd, iHt str2 ?default? str2 = new String(); str2 = “Glib Folksies”; ?default? str2 Glib Folksies Stringler ve Nesneler Assignment w/References to Strings/Objects: Kod: Bellek: String str1; Box box1; str1 box1

  26. Önemli !! • Verilen: • String s = new String(); • İlk değer olarak ne atandığı hakkında nasıl emin olabiliriz? • API ifadesini hatırlayın? Download edin! • (http://www.javasoft.com/docs) • String sınıfına gidin • Yapılandırıcıları tıklayın • Default bir tanesini tıklayın ve dokümantasyonu okuyun • Gizem çözüldü! • Şimdi gösteriye geri dönelim…..

  27. Stringler ve Nesneler • Ne dediğimizi hatırlayalım: Java otomatik olarak String nesnesini yapılandırır, yani “ ” işaretleri arasında kalan ifadeyi ilk değer olarak atar. • Öyleyse, aşağıdaki kodda: • String str1 = “Hello World”;3 şeyi başarır: • 1. str1 adında String türünden bir alana referans oluşturur. • 2. String türünden bir üye nesne oluşturur. 3. Bu nesneyi ilk yapılandırır ve ilk değer olarak “Hello World” ifadesini atar.. • Bu, Java ‘nın diğer standart nesnelere nasıl davrandığını bakarsak tutarsızlık gibi gelebilir. • Standart nesneleri kulanırken açıkça: • new ifadesini kullanarak ilk örneklemeyi ve yapılandırıcıyı çağırarak ilk yapılandırmayı yapmanız gerekmektedir.

  28. String Stuff String ‘lere verilen 3 aşikar destek: 1. String ‘leri ilk yapılandırırken ‘new’ deyimini kullanmanız gerekmez. 2. ‘+’ operatörü overload edilerek yani String ler için yeniden tanımlanarakbirleştirme işlemi desteklenmiştir. örneğin, System.out.println(“This string is an example of” + “ one that is too long to fit on one line. Your TAs take off points” + “ for lines that exceed 80 column characters.”); 3. Daha önceden tanımlanmış ve bizim kullanımımıza sunulan String sınıfına ait birçok metod mevcuttur. Bunlardan bazıları: length( ) // bir string kendi uzunluğunu bilir.charAt(iIndex) // String ifadede iIndex pozisyonundaki harfi geri döndürür; // birinci karakterin pozisyonu 0 ‘dır. substring(iStartIndex) // String ifadede iStartIndex pozisyonundan başlayan ve sona // kadar devam eden alt string ifadeyi geri döndürür. substring(iStartIndex, iEndIndex) // String ifadede iStartIndex pozisyonundan // başlayan ve iEndIndex pozisyonuna kadar (dahil // değil) devam eden alt string ifadeyi geri // döndürür.

  29. String Stuff -- Örnekler 0 1 2 3 4 H e l l o String strExample = “Hello”; char c = strExample.charAt(1); // c deki değer ‘e’ String strBritishHowdy = strExample.substring(1); strBritishHowdy ---> “ello” String strTemperatureOutside = strExample.substring(0, 4); strTemperatureOutside --> “Hell”

  30. Stringler ve Nesneler • Ayrıca . . . • String nesnelerin içeriği değiştirilemez. • Size String ‘in içerisini değiştiriyorsunuz gibi gelebilir. Ancak, aslında bellekte meydana gelen hadise: • Yeni bir Stringoluşturuluyor • String referansınızı bu yeni oluşana yönlendirmiş oluyorsunuz • Eski String çöp oluyor; eskisine ait bir referansınız artık yok. • Örneğin: str1 Hello World String str1 = “Hello World” str1 = str1.substring(4) str1 Hello World o World Opsiyonel: Bu sınırlandırmadan kurtulmak için StringBuffer sınıfına bakın.

  31. Nesneler ve Referanslar: String ‘e özel bir durum Dikkat:Birazdan gelecek slaytlarda öğrenciler için çok karıştırılan konulara bakacağız. Bu yüzden biraz tekrar yapalım: 1. Temel türleri karşılaştırırken (int, float, etc.), ‘==‘ kullanın 2. Nesneleri karşılaştırırken (String, ya da oluşturduğunuz herhangi bir sınıfa ait), equals() metodunu kullanın. 3. Bir veri türü ya da kayıt olarak kullanacağınız bir sınıf oluşturuyorsanız, equals() metodu oluşturmayı unutmayın. Birazdan “==“ ifadesinin bazı olağanüstü durumlarda nesneleri karşılaştırmak için de kullanılabileceğini göstereceğiz fakat her zamanda değil. Şüpheye düşerseniz yukarıdaki prensiplere uyun.

  32. Nesneler ve Referanslar: Normal Durum için Önceki örneğin modeline bakalım: box1 = new Box(1, 2, 3); box2 = new Box(8, 5, 7);box1 = box2; System.out.println(box1 == box2); // ekrana true basar //box1,box2 ile aynı nesneye mi referans etmektedir? System.out.println(box1.equals(box2)); // ekrana true basar // box1 içeriği kendisi ile aynı olan bir nesneye mi işaret ediyor? //box2 nesnesi gibi? box1 box2 L=1, W=2, H=3 memory L=8, W=5, H=7

  33. Nesnelere referanslarda eşitlik: Stringler özeldir Javanın karakteristiği olarak Stringler özeldir. Her zaman olmamakla birlikte bazı durumlarda “==“ ifadesini .equals() gibi, nesneleri karşılaştırmak için kullanabiliriz. Bakınız: String strHello1 = “Hello”; String strHello2 = “Hello”; Yukarıdaki iki ifadeinin bllekte şu şekilde bir değişiklik oluşturacağını düşünebiliriz: Hello strHello1 strHello2 Hello Aslında bellekte olan hadise şudur: strHello1 strHello2 Hello

  34. Stringlere neden farklı davranılıyor? Derleyici, aşağıdaki ifadeler ile karşılaştığında : String strHello1 = “Hello”; String strHello2 = “Hello”; İki String ifadenin de aynı olduğunu anlayacak kadar zekidir. Böylece, bellekte ayrı bir yer harcamamak için aynı yeri gösterir. Aşağıdaki ifadeyi yazarsanız da aynı sonuçla karşılaşırsınız: String strHello2 = “Hell” + “o”; Bu, şu anlama geliyor ki, equals() ve ‘==‘ ikisi de çalışır: System.out.println (strHello1.equals(strHello2)); // doğru System.out.println (strHello1 == strHello2); // bu da doğru // fakat tehlikeli

  35. Stringlerde istisnanın istisnası Fakat bu özel durum her zaman çalışmaz . . . Bakınız: Eğer Stringlerden biri “new” ifadesi kullanılarak oluşturlmuş ise bu Stringler artık bellekte aynı alanı paylaşmazlar. Yani, “==” bu defa çalışmaz ancak .equals() eğerki nesnelerin içerikleri eşit ise çalışır. DERS:Bazı durumlarda izin verilse bile Stringler dahil nesneleri karşılaştırırken “==” kullanmayın Hatırlayın:Sadece temel türleri karşılaştırırken“==“ kullanın ; nesneler için .equals() kullanın!

  36. toString()olma ya datoStringolmama... Debugging:

  37. Hata ayıklama stratejileri • Adım adım: • Anafikir: Hatayı küçükken yakalayın(yılanın başını küçükken ezmek gerekir) Yoksa başa çıkmak zor olabilir. Hata bulmak zordur. Bu nedenle yazdıkça hata testi de yapılmalıdır. • Şunları yapmayın: • Bütün programı bir oturuşta yapmak • ve sonra test etmek • Bunun yerine: • küçük parçalara odaklanıp bunları test ettikten sonra büyük parçaları oluşturun

  38. Hata ayıklama stratejileri • İhtiyaç: • Nesnenin o anki durumunu gözlemek • Anlamı: • public String toString ( ) • Her sınıf için bir tane “toString” metodu oluşturun. • Bunu yaptıktan sonra nesneye bir stringmiş gibi referansta bulunabiliriz. Aşağıdaki ifadeye parametre olarak gönderebiliriz: • System.out.println ( );

  39. Hata ayıklama stratejileri toString kullanımına örnekler: Box sınıfı için bir metod yazalım: public String toString ( ) { String returnStr; returnStr = new String(“Box: length = “ + iLength + “, Width = “ + iWidth + “height = “ + iHeight); return (returnStr); } O zaman şunu yapabliriz: Box subwooferBox = new Box(40, 50, 60); … System.out.println ( subwooferBox ); // nasıl???????? // peki “toString” metodunu çağırmadan mı????

  40. toString metodunun çağırıldığı özel durum • String gerekli olduğu durumda bir nesneye referans ediliyorsa toString metodu otomatik olarak alt tarafta çağırılır. Bonus! • Bu yüzden, tanımladığınız her sınıf için anlamlı bir toString() metodu oluturmanız son derece önemlidir. • Hata ayıklama için mükemmel bir yöntem!

  41. Hata ayıklama stratejileri Her sınıf için bir adet “main” metodu • Javaya göre sizin sadece bir adet main metoduna ihtiyacınız vardır her sınıf için bir tane değil • Fakat Java,nasıl program yazılacağını bilemez! • Her sınıfı test etmek ve hata ayıklamak için o sınıfa ait birmain metodu oluşturun. . . • Bu test mainleri içerisinde değişkenlerin tanımlarını ve metodları çağırarak sınıfın aslında ne yaptığını kontrol edin (örneğin: toString() metodunu kullanmak gibi) • Daha sonra, main metodunu çağırarak sınıfı test edin. • main metodu sınıfınızın bir parçası olarak kalabilir, sadece test amaçlı çağırın.

  42. Nasıl? • Farzedelim ki, A, B, ve C diye 3 adet sınıfımız olsun; herbirinin test amaçlı main metodları olsun • C sınıfı, A ve B sınıflarının da kullanımını içeren tüm programınızı çalıştıracak main metoduna sahip olsun. • Kısmi bir main metodunu nasıl çağırabilirsiniz o zaman? • javac A.java <- A sınıfını derle • java A <- A’nın main metodunu çağırır • javac B.java <- B sınıfını derle • java B <- B’nin main metodunu çağırır • javac C.java < C sınıfını derle • java C <- C’nin main metodunu çağırır

  43. Hata ayıklama stratejileri • Her sınıf için boolean türünde DEBUG adında bir sabit tanımlayın public static final boolean DEBUG = true; • Nerede uygunsa kullanın.. if(DEBUG) System.out.println("method>var = "+var);

  44. Sorular?

More Related