bms302-sunum1

advertisement
Java
Java Programlama Dili
• Nesneye yönelik (object-oriented) programlama dili
• Üst seviye, genel amaçlı ve açık kodlu
• Tüm değişkenler sabit bir veri tipine sahip (statically typed)
• Veri tipleri:
• Temel veri tipleri (int, double vs.)
• Sınıflar
• İşletilen bir dil (interpreted).
• Derleme birimleri:
• Kaynak kodlar: .java dosyası
• Derlenen kod (bytecode): .class dosyası
Java Sanal Makinesi (JVM) (1)
Java Sanal Makinesi (JVM) (2)
Java Byte Kodlar
• Java dili komut seti, her biri 1-byte olan 256 adet komuttan
oluşmaktadır.
• Bunlardan 51 tanesi ileriki kullanımlar için ayrılmıştır.
• Komutlar aşağıdaki temel kategorilere ayrılabilir:
•
•
•
•
•
•
•
Load and store (e.g. aload_0, istore)
Arithmetic and logic (e.g. ladd, fcmpl)
Type conversion (e.g. i2b, d2i)
Object creation and manipulation (new, putfield)
Operand stack management (e.g. swap, dup2)
Control transfer (e.g. ifeq, goto)
Method invocation and return (e.g. invokespecial, areturn)
Ön/Son Ek ve İşlemci Tipi
Ön/Son Ek
İşlemci Tipi
i
int
l
long
s
short
b
byte
c
char
f
float
d
double
z
boolean
a
nesne referansı
aload veya iload
Java Byte Kod Örnekleri
Komut
Açıklama
aload_0
0. yerel değişkendeki nesne referansını yığına at
aload_1
1. yerel değişkendeki nesne referansını yığına at
iload_0
0. yerel değişkendeki tam sayıyı yığına at
istore_1
Yığının tepesindeki değeri birinci yerel değişkene at
iadd
Yığının tepesindeki iki tamsayı değeri al, topla ve sonucu yığına at
dmul
Yığının tepesindeki iki double değeri al, topla ve sonucu yığına at
Tüm byte kodlar: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
Java Çalıştırma Kiti (JRE)
• .class dosyaları files Java byte kodlarını (bytecode) içerir
• Donanım bağımsız komut seti
• Java byte kodları Java Sanal Makinesi - Java Virtual Machine (JVM) –
tarafından yorumlanır.
• Byte kodları makine koduna çevirir
• Java Çalıştırma Kiti - Java Runtime Environment (JRE)
• JVM ve temel Java özelliklerini içerir (örn: java komutu)
• Donanım ve işletim sistemi detaylarını soyutlar
• Java programları için ortak API’leri gerçekleştirir
java komutu ile Java programı çalıştırma
• HelloWorld.class isimli bir dosyada derlenmiş Java programınız olsun.
• Bu programı çalıştırmak için yandaki komut çalıştırılmalıdır:
java HelloWorld
• java komutu JRE içerisinde yer almaktadır.
• Web sitelerindeki Applet’ler web tarayıcısında çalışan Java
programcıklarıdır.
• Web tarayıcısı, arka planda, java komutunu kullanarak bu appletleri
çalıştırır. (JRE kurulu olmalıdır)
Java Geliştirme Kiti (JDK)
• Java programlarını geliştirmek için gereken araçları ve diğer bileşenleri
içerir.
• Örnek araçlar:
• javac: java dosyalarını derleyip class dosyası haline getirir.
• javap: class dosyalarını okunabilir byte kod satırlarına çevirir.
• jdb: java programlarında hata ayıklamak için kullanılır.
• JDK kurulumu:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Javac komutu ile Java programlarının
derlenmesi
• Javac komutu Java kaynak kodlarından (*.java), JVM de çalışabilir Java
byte kodlar (*.class) oluşturmayı sağlar.
• HelloWorld.java isimli Java programından HelloWorld.class isimli byte
kod dosyası oluşturmak için aşağıdaki komut çalıştırılmalıdır.
javac HelloWorld.java
Eclipse IDE
• Java’da yazılmış entegre geliştirme ortamı (IDE)
• Eklentiler aracılığıyla pek çok programlama dilini destekliyor
• Java geliştirme araçları:
• Kaynak kod editorü:
• Dil spesifik kod renklendirme
• Kod otomatik tamamlama
• Java kodlarının oluşturulması ve yeniden yapılandırılması (refactoring) için
özellikler
• Proje oluşturma, çalıştırma ve hata ayıklama
• Eclipse kurulumu
• bim206-eclipse.zip dosyasını bilgisayarınıza açın
• Çalıştırılabilir dosya: eclipse.exe (Çalışması için JDK’nın kurulu olması gerekli)
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
Operatörler
• Atama: =
• Aritmetik: + - * / %
• Tek terimli: + - ++ -- !
• Eşitlik: == !=
• İlişkisel: > >= < <=
• Koşullu: && ||
• Tip Karşılaştırma: instanceof
• Bitsel: ~ & | ^
• Bit kaydırma: << >> >>>
Akış Kontrolü
• If-then
• If-then-else
• Switch
• While
• Do-while
• For
• Branching: break, continue, return
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);
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/sirket/ilkpaket/IlkSinif.java:
package com.company.firstpackage;
public class FirstClass {
// Sınıf tanımı
}
• com/sirket/ikincipaket/IkinciSinif.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
Standart Java Paketleri
Java Projesi Oluşturma (1/2)
• File -> New -> Java Project
Java Projesi Oluşturma (2/2)
• Proje adını girin
• «Finish» butonuna tıklayın
Java Sınıfı Oluşturma (1/2)
• «Package Explorer» dan projeyi seçin
• File -> New -> Class
Java Sınıfı Oluşturma(2/2)
• Paket adını (Package) girin
• Sınıf adını (Name) girin
• «Bitir» butonuna tıklayın
main() metotu
• Yeni oluşturulan sınıfın adında dosya (HelloWorld.java) editörde açılır
• main() metotunu yazın
• Dosyayı kaydedin:File -> Save
Uygulamayı Çalıştırmak
• «Package Explorer» dan projeyi seçin
• Run -> Run
• main() metodu çalıştırılacaktır
• Eclipse Console penceresinden programın çıktısı görülebilir
Alt Sınıflar (Subclasses)
• Başka bir sınıftan türetilen sınıflardır
• Türetildikleri sınıfa süper sınıf ya da temel sınıf (superclass or base
class) denir
• Alt sınıf, temel sınıfın özelliklerini genişletir
• Temel sınıfın değişkenlerini ve metotlarını miras alır
• Ek değişkenler veya metotlar tanımlayabilir
• Kodların yeniden kullanımını kolaylaştırır
• Bir alt sınıf, diğer bir sınıf tarafından temel sınıf olarak kullanılabilir.
• Direk veya dolaylı temel sınıf alt sınıf ilişkisi
• Kalıtım hiyerarşisi
Temel Sınıf: MyClass.java
class MyClass {
int myVariable;
int getVariable() {
return myVariable;
}
void setVariable(int value) {
myVariable = value;
}
}
Alt Sınıf: MySubClass.java
class MySubClass extends MyClass {
int subClassVariable;
int getVariableSum() {
return myVariable + subClassVariable;
}
void setVariables(int value) {
subClassVariable = value;
setVariable(value);
}
}
Temel Sınıf ve Alt Sınıf Nesneleri (1/2)
• Alt sınıf nesneleri aynı zamanda temel sınıfın nesneleridir
• Alt sınıf nesnesi, temel sınıf tipinde bir değişkene atanabilir
• Temel sınıf nesnesi bir alt sınıf nesnesi olabilir ancak olmak zorunda değildir.
• Temel sınıf nesnesi, alt sınıf tipindeki değişkene atanmadan önce, alt sınıf tipine çevrilmelidir:
dinamik dönüşüm (dynamic cast)
• Örnek:
SuperClass superObject;
SubClass subObject;
// ...
superObject = subObject; // Her zaman güvenli
subObject = (SubClass) superObject; // Çalışma zamanı kontrolü
Temel Sınıf ve Alt Sınıf Nesneleri (2/2)
• Eğer temel sınıf nesnesi, alt sınıfın bir nesnesi değilse, dinamik
dönüşüm çalışma zamanı istisnası (run-time exception) oluşturur
• instanceof operatörü çalışma zamanında örnek tipini kontrol
etmek için kullanılabilir
• Örnek:
if (superObject instanceof SubClass)
subObject = (SubClass) superObject; // Güvenli
Sınıf Üyesi Görünürlüğü
• Bir sınıfın üyelerine diğer sınıflardan erişimi kontrol etmek için kullanılır
• Varsayılan durum: sadece paket içi görünüm (package-private visibility)
• Sınıf üyelerine sadece aynı paketteki sınıflardan erişilebilir
• Açık Görünürlük (public visibility):
• Sınıf üyelerine herhangi bir sınıf tarafından erişilebilir
• Korumalı Görünürlük (protected visibility):
• Sınıf üyelerine direk veya dolaylı alt sınıflar ve aynı paketteki sınıflar tarafından
erişilebilir
• Gizli Görünürlük (private visibility):
• Sınıf üyelerine diğer sınıflardan erişilemez
Sınıf Üyesi Görünürlüğü Örneği (1/4)
• com/company/firstpackage/FirstClass.java:
package com.company.firstpackage;
public class FirstClass {
int myVariable;
private int privateVariable;
public void publicMethod() {
}
protected void protectedMethod() {
}
}
Sınıf Üyesi Görünürlüğü Örneği (2/4)
• com/company/firstpackage/SecondClass.java:
package com.company.firstpackage;
class SecondClass {
FirstClass firstObject;
void method() {
firstObject.myVariable = 0;
firstObject.privateVariable = 0;
firstObject.publicMethod();
//
firstObject.protectedMethod(); //
}
}
// Hata yok
// Hata!
Hata yok
Hata yok
Sınıf Üyesi Görünürlüğü Örneği (3/4)
• com/company/secondpackage/ThirdClass.java:
package com.company.secondpackage;
import com.company.firstpackage.FirstClass;
class ThirdClass {
FirstClass firstObject;
void method() {
firstObject.myVariable = 0;
// Hata!
firstObject.privateVariable = 0; // Hata!
firstObject.publicMethod();
// Hata yok
firstObject.protectedMethod(); // Hata!
}
}
Sınıf Üyesi Görünürlüğü Örneği (4/4)
• com/company/secondpackage/FourthClass.java:
package com.company.secondpackage;
import com.company.firstpackage.FirstClass;
class FourthClass extends FirstClass {
FirstClass firstObject;
void method() {
firstObject.myVariable = 0;
// Hata!
firstObject.privateVariable = 0; // Hata!
firstObject.publicMethod();
// Hata yok
firstObject.protectedMethod(); // Hata yok
}
}
Sınıf Yapıcıları (1/5)
• Yenir 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
Temel Sınıfların Yapıcıları
• Varsayılan yapıcılar kullanıldığında: alt sınıf yapıcısı, temel sınıf yapıcısı
çağırıldıktan sonra çağırılır
• Varsayılan yapıcı dışında bir yapıcı tanımlanmazsa, parametresi olmayan
temel sınıf yapıcısı otomatik çağırılır
• Varsayılan yapıcı dışındaki yapıcıları çağırmak için: super(...)
• Örnek:
SuperClass(int value) {
}
SubClass() {
super(0);
}
• Temel sınıf yapıcısı çağırımı, alt sınıf yapıcısının ilk satırında yapılmalıdır
Diziler (1/2)
• Belirli bir tipte, sınırlı sayıda değer içeren nesnelerdir
• Temel veri tiplerinde (int, double) veya sınıf tiplerinde (MyClass) değerler içerebilirler
• Örnekler:
• int[] arrayOfInts;
• MyClass[] arrayOfObjects;
• Dizi uzunluğu (dizinin kaç değer içereceği) dizi oluşturma zamanında
belirlenir
• Örnekler:
arrayOfInts = new int[2];
arrayOfObjects = new MyClass[3];
• Dizi uzunluğuna length üye değişkeni ile ulaşılabilir:
• Örnek: arrayOfInts.length
Diziler (2/2)
• Dizi elemanlarının ilk değerlerinin atanması:
• {ilkDeger, ikinciDeger, ...}
• Örnekler:
int[] arrayOfInts = {10, 20};
MyClass[] arrayOfObjects = {firstObj, secondObj};
• Dizi üyelerine erişim:
• arrayName[index]
• Geçerli indeks değerleri: 0 ... arrayName.length – 1
• Örnekler:
arrayOfInts[0] = 0;
arrayOfObjects[1].method();
Diziler Üzerinde Dolaşma
• Gelişmiş for (enhanced for) döngüsü: indeks değişkenine gerek
duymaz
• Kullanım:
for (<type> <variable> : <array_name>) {}
• <type> temel veri tipleri ya da sınıf tipleri olabilir
• Örnek:
MyClass[] array;
for (MyClass item : array) {
// item dizinin o anki değerini tutar ve her adımda güncellenir
}
String Nesneleri
• Java’da string değişkenleri java.lang.String sınıfından türetilmiş nesnelerdir
• Java dilinde hazır gelen string desteği:
• Çift tırnak içerisindeki karakterlerden String nesnesi oluşturulur
• Örnek:
String myString = "merhaba dünya";
• + operatörü ile string birleştirme
• Örnek:
String myString = "merhaba " + "dünya";
• + operatörü kullanılarak string değişkenler ile birleştirilen değişkenler ve
sabitler otomatik olarak string nesnelerine dönüştürülürler
• Örnek:
String strZeytin = "dün " + 2 + " kilo zeytin aldım";
Statik Üyeler (1/2)
• Normal şartlarda, sınıf üyelerine (değişkenler ve metotlar), nesneler
aracılığıyla erişilebilir
• Örnekler:
myObject.myField = 0;
myObject.setField(0);
• Ve sınıf üyeleri nesne değişkenleridir (instance variables):
• obj1.field ve obj2.field iki farklı değişkendir
• Sınıfa ait üyelere statik üyeler (static fields) denir :
• Sınıf örneklerinden bağımsız üyelerdir
• Sınıf değişkenleridirler: Sınıfın tüm nesneleri tarafından paylaşılırlar
• Nesne adı yerine, sınıf adı kullanılarak erişilirler
Statik Üyeler (2/2)
• Örnek:
class MyClass {
static int staticVariable;
static void staticMethod() { ... }
}
MyClass.staticVariable = 0;
MyClass.staticMetohd();
• Görünürlük anahtar kelimeleri (public, protected, private): Statik
olmayan üyeler için geçerli kurallar statik üyeler için de geçerlidir.
Main Metotu
• Bir Java programı çalıştırıldığında otomatik çalıştırılan metot:
• public static void main(String[] args)
• Parametre: Program çalıştırılırken gönderilen parametreleri içeren
String dizisidir. (Eğer parametre gönderilmemişse boş dizi gönderilir.)
• Örnek:
public class HelloWorld {
public static void main(String[] args) {
If (args.length > 0) System.out.println(args[0]);
}
}
Metot Yeniden Tanımlama
(Method Override) (1/2)
•
•
•
•
Alt sınıflar, temel sınıfın metotlarını miras alırlar
Ancak bir alt sınıf isterse bir temel sınıf metotunu yeniden tanımlayabilir
Alt sınıftaki metota, yeniden tanımlanmış metot (overridden method) denir
Örnek:
class SuperClass {
void method() {
}
}
void overriddenMethod() {
}
Metot Yeniden Tanımlama
(Method Override) (2/2)
• Örnek (devamı):
class SubClass extends SuperClass {
void overriddenMethod() {
}
}
subClassObj.method(); // Temel sınıf metotu
subClassObj.overriddenMethod(); // Alt sınıf metotu
• Yeniden tanımlanmış metotun temel sınıftaki versiyonu «super»
anahtar kelimesi kullanılarak alt sınıftan çağırılabilir
• Örnek: super.overriddenMethod();
Final Üyeler ve Final Sınıflar
• İlk değer atandıktan sonra final üyelerin değeri değiştirilemez.
• Bu nedenle, değerleri ilk değer atanırken verilmelidir
• Üye tanımlanırken - hem statik hem de statik olmayan üyeler için bu yöntem kullanılablir veya
• Her bir yapıcının içerisinde ilk değer atanabilir - sadece statik olmayan üyeler için kullanılabilir
• Final metotlar alt sınıflarda yeniden tanımlanamazlar
• Final sınıflardan alt sınıf oluşturulamaz
• Örnek:
class MyClass {
final int finalField = 0;
void method() {
finalField = 1; // Hata!
}
}
Soyut Sınıflar (Abstract Classes)
• Direk olarak nesnesi oluşturulamayan sınıflardır
• Sadece alt sınıflarından nesne oluşturulabilir
• Örnek:
abstract class MyClass {
}
class SubClass extends MyClass {
}
MyClass myObject = new MyClass(); // Hata!
MyClass myObject = new SubClass(); // Hata yok
Soyut Metotlar (Abstract Methods)
• Geröekleştirimş olmayan metotlardır
• Örnek:
abstract void abstractMethod();
• Soyut metotu bulunan sınıflar, soyut sınıf olarak tanımlanmalıdır
• Soyut bir sınıfın alt sınıfı:
• Ya miras ile alınan soyut metotları gerçekleştirir
• Ya da soyut bir sınıf olabilir
Soyut Bir Sınıftan Alt Sınıf Oluşturmak
• Örnek:
class AbstractClass {
abstract void abstractMethod();
}
class SubClass extends AbstractClass {
void abstractMethod {
// Miras ile alınan soyut metotun gerçekleştirimi
}
}
Arayüzler (Interfaces)
• Java’da sadece türetilen sınıfların sadece tek bir temel sınıfı olabilir
• Çoklu kalıtım (multiple inheritence) arayüzler aracılığıyla sağlanır
• Soyut sınıflar gibi, hangi fonksiyonları içerdiği belli ama gerçekleştirimi olmayan
yapılardır
• Tüm değişkenler public, static ve final tanımlıdır.
• Tanımlanan tüm metotlar public tanımlıdır.
• Yapıcı içeremezler.
• Örnek:
interface MyInterface {
}
int field = 0;
void interfaceMethod();
Arayüz Gerçekleştirimi (1/2)
• Bir sınıf, arayüzdeki tanımlı metotları gerçekleştirerek, bir arayüzü
gerçekleştirebilir
• Örnek:
class MyClass implements MyInterface {
void interfaceMethod() {
// arayüz metotunun gerçekleştirimi
}
}
• Eğer arayüzü gerçekleştiren sınıf soyut bir sınıfsa, arayüz metotlarını
gerçekleştirmeyebilir.
• Bu durumda, arayüz metotları, soyut sınıfın alt sınıfları tarafından
gerçekleştirilmelidir
Arayüz Gerçekleştirimi (2/2)
• Bir sınıf birden fazla arayüzü gerçekleştirebilir (çoklu kalıtım!)
• Örnek:
class MyClass implements FirstInterface, SecondInterface {
void firstInterfaceMethod() {
// FirstInterface arayüzündeki metotun gerçekleştirimi
}
void secondInterfaceMethod() {
// SecondInterface arayüzündeki metotun gerçekleştirimi
}
}
Anonim Sınıflar (Anonymous Classes)
• Bir sınıfı aynı zamanda tanımlamayı ve bu sınıftan yeni nesne
oluşturmayı sağlar
• Ya var olan bir sınıftan yeni sınıf türetilmeli ya da var olan bir arayüz
gerçekleştirilmelidir
• Kullanım:
• new operatörü
• Yeni sınıf türetilecek sınıfın ya da gerçekleştirilecek arayüzün adı
• Yapıcı parametrelerini içeren parantezler
• Arayüz imlementasyonu ise, içi boş parantezler
• Anonim sınıfın içeriği
• Temel sınıf ya da arayüz metotlarının (yeniden) gerçekleştirimi
Anonim Sınıf Örneği
MyInterface anonymous = new MyInterface() {
public void interfaceMethod() {
// arayüz metotunun gerçekleştirimi
}
};
anonymous.interfaceMethod();
İstisnalar (Exceptions) (1/5)
• İstisnalar, hatalı durumların yakalanmasını ve kontrol edilmesini
sağlarlar
• java.lang.Exception sınıfından türetilirler
• Hatayla karşılaşan kod istisna ortaya çıkarır (throw an exception)
• Hatanın kontrol edilmesini sağlayan kod istisnayı yakalar (catch the
exception)
• İstisna ortaya çıkaran kod örneği:
boolean error;
if (error)
throw new Exception("Error condition");
İstisnalar (Exceptions) (2/5)
• Ortaya çıkan bir istisna normal program akışını yarıda keser
• İstisna yakalanana kadar metot çağırım yığınında (method call stack) yukarı
doğru ilerler
• Bir istisnanın yakalanması örneği:
try {
// İstisna üretebilecek birşeyler yap
} catch (Exception e) {
// Hata durumunu kontrol et
String errorMsg = e.getMessage();
// ...
}
İstisnalar (Exceptions) (3/5)
• Metotlar bir istisna ortaya çıkarabileceklerini throws ifadesi ile belirtirler
• Bu metotları çağıran metotlar, ya bu istisnayı yakalamalıdır ya da throws
ifadesini kullanmalıdır
• Örnek:
void method() throws Exception {
// ...
}
try {
method();
} catch (Exception e) {
// ...
}
İstisnalar (Exceptions) (4/5)
• Exception alt sınıfları tanımlanabilir
• throws ifadesi birden fazla istisna tipini belirtebilir
• Birden fazla catch ifadesi kullanılarak farklı istisna tiplerinin farklı şekillerde kontrol
edilmesi sağlanabilir
• İstisna sadece ilk uyumlu catch ifadesi tarafından kontrol edilir
• Örnek:
try {
// ...
} catch (ExceptionSubClass e) {
// ...
} catch (Exception e) {
// ...
}
İstisnalar (Exceptions) (5/5)
• İstisna oluşması durumunda dahi çalışması istenilen kod parçacıkları
finally bloğu içerisine yazılır
• Örnek:
try {
// ...
} catch (Exception e) {
// ...
} finally {
// try-catch bloğundan sonra çalıştırılır
}
Denetlenmeyen İstisnalar
(Unchecked Exceptions) (1/2)
• Normal istisnalar denetlenen istisnalardır (checked exceptions)
• Metotlar try-catch bloğuna sahip olmalı yada throws idadesini kullanmalıdır
• Derlenme zamanında bu kural kontrol edilir
• Denetlenen istisnalar gereksiz kod yazımına neden olabilir
• Bir istisna hiç bir zaman gerçekleşmeyecek olsa bile, kontrol edilmelidir
(yakalanmalıdır)
• Denetlenmeyen istisnaların kontrol edilmesi zorunlu değildir
• Ancak eğer gerekli ise kontrol edilebilir
• java.lang.RuntimeException ve bu sınıfın alt sınıfları denetlenmeyen
istisnalardır
Denetlenmeyen İstisnalar
(Unchecked Exceptions) (2/2)
• RuntimeException sınıfının java.lang paketinde bulunan ve sık
karşılaşılan alt sınıfları:
• ClassCastException: eğer temel sınıftan alt sınıfa dinamik çevrim
gerşekleştirilemezse
• IllegalArgumentException: eğer bir metota, kabul edilemeyecek bir
parametre gönderilirse
• IndexOutOfBoundsException: eğer varolmayan bir dizi elemanına erişilmeye
çalışılmışsa
• NullPointerException: eğer nesne referansı hafızada yer almayan bir nesneyi
gösteriyorsa ve nesnenin üyesine erişilmeye çalışılırsa (nesne değişkeni:
null)
java.lang.Object
• Tüm sınıfların temel sınıfıdır
• Tüm sınıflar Object sınıfının üyelerini miras alır (extends anahtar
kelimesi ile belirtilse de belirtilmese de)
• toString() metotu
• Nesnenin String olarak açıklamasını döndürür
• Bir nesne + operatörü kullanılarak bir string ile birleştirildiğinde otomatik
olarak çağırılır
• Alt sınıflar tarafından yeniden tanımlanabilir
• Örnek:
// aşağıdaki iki kullanım aynı sonucu üretir
objString = "Nesne: " + myObject;
objString = "Nesne: " + myObject.toString();
Girdi/Çıktı Akışları (Input/Output Streams)
• Büyük miktardaki verilerin yığınlar halinde aktarılmasını sağlar
• Kullanım örnekleri:
• Doksyadan okumak, dosyaya yazmak
• Ağ veri transferi
• java.io.IOException
• java.lang.Exception sınıfının alt sınıfıdır
• Bir I/O işlemi başarısız olduğunda ya da yarıda kaldığında ortaya çıkar
• java.io.InputStream
• java.io.OutputStream
java.io.InputStream (1/2)
• Aşağıdaki temel metotlara sahip soyut sınıf:
• abstract int read() throws IOException
• Girdi akışından bir byte okur. Okuduğu byte’ı döndürür ya da akışın sonu geldiyse -1
döndürür
• int read(byte[] b, int off, int len)
throws IOException
• En fazla len kadar byte okur ve okunan byte’ları off pozisyonundan başlayarak b
dizisine yerleştirir
• Eğer akışın sonuna gelindiyse -1 döndürür. Aksi halde okunan byte sayısını döndürür
• int read(byte[] b) throws IOException
• read(b, 0, b.length)ile aynı şeyi yapar
• void close() throws IOException
• Girdi akışını kapatır ve bu amaçla kullanılan bütün kaynakları sisteme iade eder
java.io.InputStream (2/2)
• Kullanım Örneği:
InputStream is;
byte[] buffer = new byte[1024];
int byteCount;
// ...
try {
while ((byteCount = is.read(buffer)) >= 0) {
// okunan byte’ları amaca uygun şekilde işle
}
is.close();
} catch (IOException e) {
// hata durumlarını kontrol et
}
java.io.OutputStream
• Aşağıdaki temel metotlara sahip soyut sınıf:
• abstract void write(int b) throws IOException
• Bir byte’lık bilgiyi çıktı akışına yaz
• void write(byte[] b, int off, int len)
throws IOException
• len kadar byte’ı b dizisinin off pozisyonundan başlayarak oku ve çıktı akışına yaz
• void write(byte[] b) throws IOException
• write(b, 0, b.length) ile aynı şeyi yapar
• void close() throws IOException
• Çıktı akışını kapatır ve bu amaçla kullanılan bütün kaynakları sisteme iade eder
java.io.FilterInputStream (1/2)
• java.io.InputStream sınıfından türetilmiş sınıf
• Girdi akışından okunan bilginin değiştirilmesini (filtrelenmesini) sağlar
• Yapıcısına iletilen bir InputStream üzerinde çalışır
• İletilen InputStream protected in değişkeninde tutulur
• Amaca uygun filtreleme işleminin gerçekleştirilmesi için bu sınıftan bir
alt sınıf oluşturulmalıdır
• Alt sınıflar şu metotları yeniden tanımlamalıdır:
• int read()
• int read(byte[] b, int off, int len)
java.io.FilterInputStream (2/2)
• Örnek:
public class SimpleFilterInputStream extends FilterInputStream {
public SimpleFilterInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
int b = in.read();
if (b == 0) b = 1;
return b;
}
public int read(byte[] b, int off, int len) throws IOException {
int byteCount = in.read(b, off, len);
for (int i = 0; i < byteCount; i++)
if (b[off + i] == 0) b[off + i] = 1;
return byteCount;
}
}
java.io.FilterOutputStream (1/2)
• java.io.OutputStream sınıfından türetilmiş sınıf
• Çıktı akışına yazılan bilginin değiştirilmesini (filtrelenmesini) sağlar
• Yapıcısına iletilen bir OutputStream üzerinde çalışır
• İletilen OutputStream protected out değişkeninde tutulur
• Amaca uygun filtreleme işleminin gerçekleştirilmesi için bu sınıftan bir
alt sınıf oluşturulmalıdır
• Alt sınıflar şu metotları yeniden tanımlamalıdır:
• void write(int b)
• void write(byte[] b, int off, int len)
java.io.FilterOutputStream (2/2)
• Örnek:
public class SimpleFilterOutputStream extends FilterOutputStream {
public SimpleFilterOutputStream(OutputStream out) {
super(out);
}
public void write(int b) throws IOException {
if (b == 1) b = 0;
out.write(b);
}
public void write(byte[] b, int off, int len) throws IOException {
for (int i = 0; i < len; i++)
if (b[off + i] == 1) b[off + i] = 0;
out.write(b, off, len);
}
}
java.io.PrintStream
• FilterOutputStream sınıfından türetilmiş alt sınıf
• Çıktı akışına temel veri tiplerini (int, double vb.) ve nesnelerin string
açıklamalarını yazmak için kullanılır
• Hiçbir zaman IOException ortaya çıkarmaz
• checkError() metotu kullanılarak hata oluşup oluşmadığı kontrol edilebilir
• printf() stili, istenilen formatta yazmayı sağlayan, metotlar sunar
• Otomatik olarak bir alt satıra geçiren println() metotları sunar
java.lang.System
• «Final» sınıf
• Bu sınıftan yeni bir nesne oluşturulamaz (public yapıcısı yoktur)
• Sadece «static» olan sınıf üyeleri kullanılır
• InputStream in: standart girdi
• PrintStream out: standart çıktı
• PrintStream err: standart hata
• void gc(): çöp toplayıcısını (garbage collector) çalıştırır
• void exit(int status): JVM’i sonlandırır
• Durum kodu: 0 ise normal sonlandırma, başka bir değerse anormal
sonlandırma
Açıklama Notları (Annotations)
• Java kaynak kodları için üst veriler (metadata)
• Tanımlamalara uygulanır
• Sınıfların, değişkenlerin, metotların ve yerel değişkenlerin tanımlanmalarında
üst veri bildirmek için kullanılır
• @ karakteri ile başlar
• Ön tanımlı açıklama tipleri:
• @Deprecated
• @Override
• @SuppressWarnings
• Warning types: deprecation, unused, null
• Örnek: @SuppressWarnings("unused")
Download