Sunuyu indir
Sunum yükleniyor. Lütfen bekleyiniz
YayınlayanOlcan Taylan Değiştirilmiş 10 yıl önce
1
Üye ve Sınıf Bildirimleri
2
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. 1.Ya sınıf değişkenidir ya da, 2. ü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. 1.Ya sınıf metodudur ya da, 2.Üye metodu (instance method) “Sınıf değişkeni” ve “sınıf metodu” ifadeleri özel birşeyler ifade eder. Üye vs. Sınıf Bildirimleri
3
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. Üye vs. Sınıf Bildirimleri
4
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. Ü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 Bu yüzden, her insan değeri 1 olan kendi “nufus” değişkenine sahip olacaktır. Bu hiçbir şey ifade etmez!
5
class Insan { String ad; static int nufus = 0; public Insan (String ad) { this.ad = ad; nufus++; } //yapılandırıcı sonu } // sınıf sonu Üye vs. Sınıf Bildirimleri Her nesne, kendine ait String türünden “ad” alanına sahip olacaktır. Dolayısıyla her insan kendi ismine sahip olacaktır. 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!
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ı! Quiz Alarmı!
7
Üye vs. Sınıf Bildirimleri Sabitlere geri dönüş: class SabitOrnegi{ final int iMaksBoyut = 10; } class SabitOrnegi { static final int iMaksBoyut = 10; } Her nesne için ayrı fakat aynı değere sahip bir sabit tanımlanıyor. Hiç bir işe yaramayan bir israftır. Bütün üyelerin kullanacağı ortak, tek bir sabit tanımlanıyor. Şimdi, hemen hemen bütün bütün sabitlerin neden static ve final tanımlandığını göreceğiz.
8
Kendinizi sınayın! public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]){ sayHello(); } Aşağıdaki kodun neden çalışmayacağını tartışın:
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
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 public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // WRONG! } }//class Test Başka bir bakış public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // HATA! } }//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.. t1 t2 t3
11
public class Test { int x; static int y = 2; }//class Test SINIF ÜYELER Test t1 = new Test(); t1.x = 5; // erişici kullanılmalı Test t2 = new Test(); t2.x = 3; // erişici kullanılmalı public class Test { int x; // now 5 static int y; // 2 }//class Test public class Test { int x; // now 3 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; t1 t2
12
Ö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. 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(); // HATA! } }//class Test t2 t1
13
public class Test { public void sayHello() { System.out.println (“Hello”); } public static void main (String arg[]) { sayHello(); // HATA! } }//class Test Ö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 Sadece bir adet Sonsuz sayıda olabilir
14
Sınıflar ve Nesneler class test { public void sayHello(){ // etc. etc. } }//class test class test { public void sayHello(){ // etc. etc. } }//class test class test { public void sayHello(){ // etc. etc. } }//class test “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. SINIF ÜYE NESNELER HEPSİ TARAFINDAN PAYLAŞILIR class test { public void sayHello(){ // etc. etc } public static void main (String[] argv) { }
15
Çözüm 1 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 nesne oluş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: 1.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
Stringler ve Nesneler Assignment w/References to Strings/Objects: Kod: Bellek: String str1; Box box1; str1 box1 str2 = “Glib Folksies”; str2 Glib Folksies ?default? str1 = “Hello World”; box1 = new Box(iLn, iWd, iHt); Hello World str1 box1 iLn, iWd, iHt str1 = “Hello World”; box1 = iLn, iWd, iHt; Hello World str1 box1 HATA: “new” ifadesi kullanılmalı ve yapılandırıcı çağırılmalı str2 ?default? str2 = new String();
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)http://www.javasoft.com/docs 1.String sınıfına gidin 2.Yapılandırıcıları tıklayın 3.Default bir tanesini tıklayın ve dokümantasyonu okuyun 4.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
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. String ‘lere verilen 3 aşikar destek: 1. String ‘leri ilk yapılandırırken ‘new’ deyimini kullanmanız gerekmez. String Stuff 2. ‘+’ operatörü overload edilerek yani String ler için yeniden tanımlanarak birleş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.”);
29
String Stuff -- Örnekler Hello 01234 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” String strExample = “Hello”;
30
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: 1.Yeni bir String oluşturuluyor 2.String referansınızı bu yeni oluşana yönlendirmiş oluyorsunuz 3.Eski String çöp oluyor; eskisine ait bir referansınız artık yok. Örneğin: Hello World str1 String str1 = “Hello World” str1 = str1.substring(4) Hello World o World str1 Opsiyonel: Bu sınırlandırmadan kurtulmak için StringBuffer sınıfına bakın. Stringler ve Nesneler
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 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=8, W=5, H=7 L=1, W=2, H=3 memory
33
Hello 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: Aslında bellekte olan hadise şudur: strHello1 strHello2 Hello strHello1 strHello2 Nesnelere referanslarda eşitlik: Stringler özeldir
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 da toString olmama... 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
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ı???? Hata ayıklama stratejileri
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 bir main 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?
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.