Görsel Programlama Temel Veri Tipleri, Değişkenler, Operatörler, Akış Kontrolü, Sınıflar, Metotlar, Paketler ve JavaDoc Sözcüksel Kurallar • Java programları aşağıdaki bileşenlerin bir kolleksiyonudur: • • • • • • Boşluk (whitespace) Anahtar Kelimeler (keywords) Tanımlayıcılar (identifiers) Hazır bilgiler (literals) Yorumlar (comments) Ayırıcılar (seperators) • Java serbest formlu bir dildir ve herhangi bir hizalama kuralı yoktur. • Bir veya birden fazla boşluk arasında fark yoktur: boşluk, tab, alt satır... Anahtar Kelimeler abstract continue for new switch assert default goto package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while Tanımayıcılar • Tanımlayıcılar çeşitli bileşenlere isim vermek için kullanılır: • Değişkenler • Metotlar • Sınıflar • Büyük/küçük harfler, sayılar, alt çizgi karakteri veya dolar işareti içerebilir • Büyük/küçük harf ayrımı vardır. Örnek: count, Count ve couNt • İsimler bir rakamla başlayamazlar • Anahtar kelimeler ile true, false ve null değerleri isim olarak kullanılamaz Hazır bilgiler ve Yorumlar • Hazır bilgiler: Java’da kullanılan sabit değerlerdir • • • • 100 -> tam sayı 98.6 -> ondalıklı sayı ‘X’ -> karakter “This is a test” -> karakter katarı • Tek satırlı, çok satırlı ve dökümantasyon yorumları • Tek satırlı: // karakterkeri ile başlar • Çok satırlı: /* karakterleri ile başlar ve */ karakterleri ile biter Ayırıcılar Belirli ifadelerin kullanılması ve kod cümlelerinin ayrılabilmesi için kullanılan karakterlerdir. • • • • • • Noktalı virgül -> ; Köşeli parantez -> [ ] Süslü Parantez -> { } Virgül -> , Nokta -> . İki tane iki nokta üst üste -> :: Ayırıcılar – Noktalı Virgül Noktalı virgül (;), kod cümlelerini ayırmak için kullanılır. En sık kullanılan ayırıcıdır. i=i+1; j = j + 3; k = 13; Ayırıcılar – Köşeli Parantez Köşeli parantez ([ ]), dizi tanımlamak ve dizi elemanlarına erişmek için kullanılır int[] dizim = new int[4]; dizim[0] = 34; dizim[1] = dizim[2] + dizim[3]; Ayırıcılar – Süslü Parantez Süslü parantez ({ }), dizilerin ilk değerlerini atamak için ve kod blokları (sınıflar ve metotlar gibi) tanımlamak için kullanılır int[] dizim = {2, 4, 7, 9, 12}; class Araba { ….. } Ayırıcılar – Virgül Virgül (,) for döngüsü içerisinde ve değişken tanımlarında aynı tipte değişkenleri sıralarken kullanılır int[] dizim = {2, 4, 7, 9, 12}; double[] dizim2 = {2.3, 4.1, 7.0, 9.23}; for (int i=0, j=3; i<20; i++, j=j+2) Ayırıcılar – Nokta Nokta (.), paket adlarını alt paketlerden ve sınıflardan ayırmak için ve metot veya değişkeni referans değişkenden ayırmak için kullanılır. import java.util.Timer; Araba a; a.gazaBas(); a.vites = 5; Ayırıcılar – İki Tane İki Nokta Üst üste İki tane iki nokta üst üste (::), metot ya da yapıcı referansı oluşturmak için kullanılır (Java 8) Class Hey{ private double square(double num){ return Math.pow(num , 2); } } Hey hey = new Hey(); Function<Double, Double> square = hey::square; double ans = square.apply(23d); Temel veri tipleri • byte: 8 bit, değer aralığı: -128 ... 127 • short: 16 bit, değer aralığı: -32768 ... 32767 • int: 32 bit, değer aralığı: -231 ... 231 − 1 • long: 64 bit, değer aralığı: -263 ... 263 − 1 • float: 32-bit tek duyarlıklı (single-precision) ondalıklı sayı • double: 64-bit çift duyarlıklı (double-precision) ondalıklı sayı • boolean: iki değer alabilen veri tipi: true ve false • char: 16-bit evrensel kod (Unicode) karakter Örnek: Karakter Değişkeni Örneği Double veri tipinde “pi” ve “yaricap” değişkenlerini tanımlayıp, dairenin alanını hesaplayan ve ekrana yazdıran Java programını yazınız. public static void main(String[] args) { char ch1, ch2; ch1 = 88; // X karakteri icin ASCII kod ch2 = 'Y'; System.out.println(ch1); System.out.println(ch2); } Operatörler • Atama: = • Aritmetik: + - * / % • Tek terimli: + - ++ -- ! • Eşitlik: == != • İlişkisel: > >= < <= • Koşullu: && || • Tip Karşılaştırma: instanceof • Bitsel: ~ & | ^ • Bit kaydırma: << >> >>> Örnek: Daire Alanı Hesabı Double veri tipinde “pi” ve “yaricap” değişkenlerini tanımlayıp, dairenin alanını hesaplayan ve ekrana yazdıran Java programını yazınız. Örnek: Daire Alanı Hesabı - Çözüm public static void main(String[] args) { double pi, r, a; r = 10.8; // dairenin yaricapi pi = 3.1416; // yaklasik pi degeri a = pi * r * r; System.out.println(a); } Aritmetik ve Atama Operatörlerinin Birleştirilmesi Aritmetik operatörleri atama opertörleri ile birlikte kullanmak için kullanılan özel operatörlerdir a = a + 4; a += 4; a = a % 2; a %= 2; Örnek: Aritmetik ve Atama Operatörlerinin Birleştirilmesi public static void main(String[] args) { int a = 1; int b = 2; int c = 3; a += 5; b *= 4; c += a * b; c %= 6; System.out.println(a); System.out.println(b); System.out.println(c); } Arttırma ve Azaltma Operatörleri • Tam sayı değerleri birer arttırmak ya da azaltmak için kullanılan operatörlerdir x = x + 1; x++; x = x - 1; x--; • Arttırılacak/azaltılacak değerin önüne ya da arkasına yazılabilirler Örnek: Arttırma ve Azaltma Operatörleri public static void main(String[] args) { int a = 1; int b = 2; int c, d; c = ++b; d = a++; c++; System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); } Kısa-Devre Mantıksal Operatörler • AND ve OR operatörlerinin ikincil versiyonlarıdır. • Duruma göre sağdaki ifadenin doğru veya yanlış olup olmadığını test etmeden sonuca ulaşmayı sağlarlar • Örnek: OR ifadesinde birinci ifade doğru ise, ikinci ifadeye bakmadan sonuç doğru atanabilir • Bu operatörleri kullanmanın bazen avantaj sağladığı durumlar olabilir if (bolen != 0 & sayi / bolen > 10) … Soru İşareti Operatörü • Bazı if-then-else cümlelerinin yerini alabilen üç yollu operatördür • Başlangıçta karmaşık gelebilir ancak öğrenildiğinde etkin bir şekilde kullanılabilir ve aşağıdaki formdadır: sonuc = ifade1 ? İfade2 : ifade3 • “ifade1” ikili (boolean) sonuç döndüren herhangi bir ifade olabilir. • Eğer “ifade1” in sonucu doğruysa, “ifade2” işletilir. Yanlışsa “ifade3” işletilir. İşletilen sonuç ise “sonuc” değişkenine atanır. Örnek: Soru İşareti Operatörü public static void main(String[] args) { int i, j; i = 10; j = i < 0 ? -i : i; // mutlak degeri al i = -10; j = i < 0 ? -i : i; // mutlak degeri al System.out.println(j); } Operatör Önceliği En yüksek ++ (postfix) -- (postfix) ++ (prefix) -- (prefix) ~ * / % + - >> >>> << > >= < == != & ^ | && || ?: -> = En düşük op= ! + (unary) <= instanceof - (unary) Tip dönüşümü Operatör Önceliği - Açıklamalar • Üst satırlardaki operatörler, alt satırdakilere göre önceliklidir • Aynı satırdaki operatörler aynı önceliktedir • İkili (binary) işlemlerde ifadeler soldan sağa doğru hesaplanır • Eşitlik ifadeleri sağdan sola doğru işletilir • [] ve () operatör olmamalarına rağmen, operatör gibi davranırlar ve en yüksek önceliğe sahiptirler • İfadelerin öncelik sırasını değiştirmek için parantezler kullanılabilir Akış Kontrolü • If • If-else • If-else-if • Switch • Dallanma: break, continue, return Örnek: If-Else-If public static void main(String[] args) { int ay = 4; if (ay == 12 || ay == 1 || ay == 2) System.out.println("Mevsim: Kis"); else if (ay == 3 || ay == 4 || ay == 5) System.out.println("Mevsim: Ilkbahar"); else if (ay == 6 || ay == 7 || ay == 8) System.out.println("Mevsim: Yaz"); else if (ay == 9 || ay == 10 || ay == 11) System.out.println("Mevsim: Sonbahar"); else System.out.println("Gecersiz Ay"); } Örnek: Switch int ay = 4; switch (ay) { case 12: case 1: case 2: System.out.println("Mevsim: Kis"); break; case 3: case 4: case 5: System.out.println("Mevsim: Ilkbahar"); break; case 6: case 7: case 8: System.out.println("Mevsim: Yaz"); break; case 9: case 10: case 11: System.out.println("Mevsim: Sonbahar"); break; default: System.out.println("Gecersiz Ay"); } Değişkenlerin Etki Alanı public static void main(String[] args) { int x = 10; // main icerisinde her yerden gorunur if (x == 10) { // yeni blok baslangici int y = 10; // sadece bu blokta gorunur // Hem x hem y burada biliniyor x = y * 2; } // y = 100; // Hata! y bu blokta bilinmiyor // x bu blokta halen biliniyor System.out.println(x); } Tip Dönüşümleri • Belli bir tipteki veri, diğer bir tipteki değişkene atanmaya çalışıldığında, eğer aşağıdaki şartlar sağlanıyorsa dönüşüm otomatik gerçekleşir: • İki tip birbiriyle uyumlu olmalıdır (örneğin int ve byte) • Hedef tip, hafızada kaynak tipten daha çok yer kaplıyorsa • Yukarıdaki ikinci şartın sağlanmaması durumunda dönüşümü açıkça isteyebilirsiniz: int a; byte b; b = (byte) a; Sınıflar • Programcı tarafından tanımlanan veri tipleridir • Nesne: sınıfın bir örneğidir • Sınıf tanımı, sınıfın adında bir Java dosyası içerisinde yapılır: <SınıfAdı>.java • Sınıf adları geleneksel olarak büyük harfle başlar • Sınıf üyeleri: değişkenler (fields) and metotlar (methods) • Değişkenler: nesne içerisindeki değişkenlerdir • Temel veri tipi veya sınıf tipi • Metotlar: Java komutlarını içeren prosedürlerdir (functions?) Örnek: MyClass.java class MyClass { int myVariable; int getVariable() { return myVariable; } void setVariable(int value) { myVariable = value; } } Sınıf Üyelerine Erişim • Sınıfın içerisinden: • Değişkenin yada metotun adı kullanılarak erişilir. • Örnekler: myVariable = 0; setVariable(0); • Opsiyonel olarak, this anahtar kelimesi kullanılabilir, e.g. this.myVariable • Yerel değişkenler alanı gölgelediği durumda gereklidir • Dışarıdaki bir sınıftan: • Nesne değişkeni + . + alanın yada metotun adı Örnekler: myObject.myVariable = 0; myObject.setVariable(0); Örnek: Sınıf Kullanımı Aşağıda tanımlı “Kutu” sınıfından (1) bir nesne oluşturup, (2) kutunun genişliği, yüksekliği ve derinliğini ilgili sınıf değişkenlerine atayıp, (3) kutunun hacmini hesaplayan ve ekrana yazan Java programını yazınız. class Kutu { double genislik; double yukseklik; double derinlik; } Örnek: Sınıf Kullanımı (Çözüm) public static void main(String args[]) { Kutu kutu1 = new Kutu(); double hacim; // kutu1 nesnesinin ozelliklerini değiştir kutu1.genislik = 10; kutu1.yukseklik = 20; kutu1.derinlik = 15; // kutu1 kutusunun hacmini hesapla ve ekrana yazdir hacim = kutu1.genislik * kutu1.yukseklik * kutu1.derinlik; System.out.println(hacim); } Örnek: Sınıf Metotu Tanımlama Aynı örneği, “Kutu” sınıfına “hacimHesapla” adlı metotu ekleyip main metotundan bu metotu çağırarak gerçekleştiriniz. “hacimHesapla” metotu herhangi bir parametre almamalı ve hesaplanan hacmi döndürmelidir. Örnek: Sınıf Metotu Tanımlama (Çözüm) class Kutu { double genislik; double yukseklik; double derinlik; double hacimHesapla() { return genislik * yukseklik * derinlik; } } Örnek: Sınıf Metotu Tanımlama (Çözüm) (devam) public static void main(String args[]) { Kutu kutu1 = new Kutu(); double hacim; // kutu1 nesnesinin ozelliklerini değiştir kutu1.genislik = 10; kutu1.yukseklik = 20; kutu1.derinlik = 15; // kutu1 kutusunun hacmini hesapla ve ekrana yazdir hacim = kutu1.hacimHesapla(); System.out.println(hacim); } Paketler (1/2) • Sınıflar paketler içerisinde gruplanır • Mantıksal gruplama • Sınıflara ya da sınıf üyelerine erişimin düzenlenmesi • Paket adları hiyerarşik yapıda tanımlanır • Üst seviyeden alt seviyeye doğru • Örnekler: • org.organization.product • com.company.division.product • Kaynak kodların ve derlenen dosyaların dizin hiyerarşisi paket adlandırmasına uygun olmalıdır. • Örnek: org/organization/product/MyClass.java Paketler (2/2) • Bir paket sınıflara ya da alt paketlere sahip olabilir • Örnek: “com.company.division”, “com.company” paketinin alt paketidir • Tam anlamıyla tanımlanmış sınıf adları (sınıfın tam adı) paket adını içerir: • Örnek: “org.organization” paketindeki Product sınıfı: “org.organization.Product” • Farklı paketlerde aynı isimli sınıflara izin verilir • Java anahtar kelimesi: package • Sınıf tanımının bulunduğu dosyanın en üstünde kullanılır • Örnek: package org.organization; Sınıf Görünürlüğü (1/2) • Normalde sınıflar sadece tanımlı olduğu paket içerisinden görülür • Public sınıflar herhangi bir paketten görülebilir • Örnek: public class MyClass { // Sınıf tanımı } • Public bir sınıfa başka bir paketten erişebilmek için: • Ya sınıfın tam adı (paket adı ile birlikte sınıf adı) kullanılmalı • Ya da sınıf içeri aktarılmalıdır (import): • Tek bir sınıfın içeri aktarılması: import <paket_adı>.<sınıf_adı>; • Bir paketteki tüm public sınıfların içeri aktarılması: import <paket_adı>.*; Sınıf Görünürlüğü (2/2) • Örnek: • com/company/firstpackage/FirstClass.java: package com.company.firstpackage; public class FirstClass { // Sınıf tanımı } • com/company/secondpackage/SecondClass.java: package com.company.secondpackage; import com.company.firstpackage.FirstClass; class SecondClass { FirstClass firstObject; // ... } • java.lang paketi içerisindeki sistem sınıfları içeri aktarılmadan görünür haldedir ve direk kullanılabilir Sınıf Yapıcıları (1/5) • Yeni bir nesne, new operatörü kullanılarak oluşturulur: MyClass myObject = new MyClass(); • Sınıf yapıcısı: Nesne oluşturulurken otomatik çağırılan özel sınıf metotudur • Yapıcı tanımlama: MyClass(...) { // ... } • Otomatik tanımlanan varsayılan yapıcı, parametresi olmayan boş bir fonksiyondur • Eğer sınıfta bir yapıcı tanımlanrsa, bu sınıf için varsayılan yapıcı tanımlanmaz Sınıf Yapıcıları (2/5) • İstenildiği kadar yapıcı tanımlanabilir (farklı parametre listesine sahip olmaları şartıyla) • Örnek: MyClass() { // Parametresi olmayan yapıcı } MyClass(int arg0, double arg1) { // Bir «int» ve bir «double» parametre alan yapıcı } • Boş olmayan parametre listesine sahip bir yapıcıyı çağırma örneği: MyClass myObject = new MyClass(arg0, arg1); Sınıf Yapıcıları (3/5) • Bir yapıcı, diğer bir yapıcıyı çağırabilir • Yapıcı çağırma şekli: this(...) • Örnek: MyClass() { this(0, 0.1); } MyClass(int arg0, double arg1) { // Bir «int» ve bir «double» parametre alan yapıcı } Sınıf Yapıcıları (4/5) • Sınıf yapıcıları genellikle sınıf değişkenlerine ilk değer atamak için kullanılır • Yapıcılar dışında, değişken tanımlama sırasında da ilk değer ataması yapılabilir • Değişkenlere ilk değer atanmaması durumunda varsayılan değerleri kullanılır: • Sayısal değişken tipleri için 0 • Boolean tip için false • Sınıf tipleri için null Sınıf Yapıcıları (5/5) Sınıf değişkeni ilk değer atama örneği: class MyClass { int zeroField; // varsayılan değer: 0 int myField = 1; MyClass() { } MyClass(int value) { myField = value; } } // ... MyClass firstObject = new MyClass(); // firstObject.myField = 1 MyClass secondObject = new MyClass(2); // secondObject.myField = 2 Örnek: Sınıf YapıcısıTanımlama Daha önce çözdüğünüz “Kutu” örneğinde, (1) “Kutu” sınıfına genişlik, yükseklik ve derinlik parametrelerini alan bir yapıcı ekleyiniz ve (2) main metodunu bu yapıcıyı çağırarak Kutu nesnesini oluşturacak şekilde değiştiriniz. Örnek: Sınıf Yapıcısı Tanımlama (Çözüm) class Kutu { double genislik; double yukseklik; double derinlik; Kutu(double g, double y, double d) { genislik = g; yukseklik = y; derinlik = d; } double hacimHesapla() { return genislik * yukseklik * derinlik; } } Örnek: Sınıf YapıcısıTanımlama (Çözüm) (devam) public static void main(String args[]) { // kutu1 yapıcısını genislik, yukseklik ve derinlik parametreleri ile cagir Kutu kutu1 = new Kutu(10, 20, 15); double hacim; // kutu1 kutusunun hacmini hesapla ve ekrana yazdir hacim = kutu1.hacimHesapla(); System.out.println(hacim); } Standart Java Paketleri JavaDoc • Java kaynak kodlarından otomatik olarak HTML formatında API dökümantasyonu oluşturmaya yarayan araçtır. • Oluşturulan HTML kodu, ilişkili metot ve sınıfları web bağlantıları aracılığıyla birbirine bağlar. • Normalde Java kodlarındaki yorum satırları, /* ve */ karakterleri arasına yazılırken, JavaDoc dökümantasyonu üretmek için kullanılan yorumlar, ekstra bir yıldız (*) kullanılarak başlatılır: /* yerine /** JavaDoc – Sınıf Örneği /** * Sınıfın açıklaması * @author Firstname Lastname <address @ example.com> * @version 1.6 * @since 2010-03-31 */ public class Test { // class body } (current version number of program) (the version of the package this class was first added to) JavaDoc – Metot Örneği /** * Validates a chess move. * * @param theFromFile file from which a piece is being moved * @param theFromRank rank from which a piece is being moved * @return true if the move is valid, otherwise false */ boolean isValidMove(int theFromFile, int theFromRank, int theToFile, int theToRank) { ... } NetBeans – JavaDoc Oluşturma Projeniz için JavaDoc’u, proje penceresinde projenize sağ tıklayıp “Generate Javadoc” menü elememanını seçerek gerçekleştirebilirsiniz. Örnek: JavaDoc Oluşturma Daha önce çözdüğünüz “Kutu” örneğinin metotlarına JavaDoc yorumları ekleyip, NetBeans projesinin JavaDoc’unu üstteki slaytta gösterildiği gibi oluşturup, oluşan JavaDoc dökümantasyonunu inceleyiniz. Java7 ve Java8 için JavaDoc JFreeChart: (Kendi projeleriniz için de javadoc üretebilirsiniz) http://www.jfree.org/jfreechart/api/javadoc/ Java7: http://docs.oracle.com/javase/7/docs/api/ Java8: http://docs.oracle.com/javase/8/docs/api/