Java Programlama

advertisement
Java Programlama
Kalıtım, Temel/Alt Sınıf, Temel/Alt Sınıf Tip
Dönüşümleri, Temel Sınıf Yapıcıları, super Anahtar
Kelimesi, Sınıf Üyesi Görünürlüğü, Statik Üyeler ve
Final Üyeler
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);
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);
}
Örnek: Temel Sınıf ve Alt Sınıf – A Temel Sınıfı
class A {
int i, j;
void showij() {
System.out.println("i and j: " + i + " " + j);
}
}
Örnek: Temel Sınıf ve Alt Sınıf – B Alt Sınıfı
class B extends A {
int k;
void showk() {
System.out.println("k: " + k);
}
void sum() {
System.out.println("i+j+k: " + (i + j + k));
}
}
Örnek: Temel Sınıf ve Alt Sınıf – main metotu (1)
A superOb = new A();
B subOb = new B();
// Temel sınıflar da kendi başına kullanılabilir
superOb.i = 10;
superOb.j = 20;
System.out.println("superOb icerigi: ");
superOb.showij();
System.out.println();
Örnek: Temel Sınıf ve Alt Sınıf – main metotu (2)
// Alt sınıf üst sınıfın tüm public üyelerine erişebilir
subOb.i = 7;
subOb.j = 8;
subOb.k = 9;
System.out.println("subOb icerigi: ");
subOb.showij();
subOb.showk();
System.out.println();
System.out.println("subOb icindeki i, j ve k nin toplami:");
subOb.sum();
Örnek: Renkli/Ağırlıklı Kutu
Daha önce yazmış olduğunuz, genişlik, yükseklik ve derinlik özelliklerini içeren
"Kutu" sınıfını temel sınıf olarak kullanacak,
1. tamsayı tipinde renk özelliğini de içeren "ColorBox" sınıfını oluşturup
kullanınız
2. double tipinde ağırlık özelliğini de içeren "BoxWeight" sınıfını oluşturup
kullanınız
Örnek: Renkli/Ağırlıklı Kutu – Kutu Sınıfı
class Box {
double width;
double height;
double depth;
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
// hacim hesapla
double volume() {
return width * height * depth;
}
}
Örnek: Renkli/Ağırlıklı Kutu – RenkliKutu Sınıfı
class ColorBox extends Box {
int color; // kutunun rengi
ColorBox(double w, double h, double d, int c)
{
width = w;
height = h;
depth = d;
color = c;
}
}
Örnek: Renkli/Ağırlıklı Kutu – AgirlikliKutu Sınıfı
class BoxWeight extends Box {
double weight; // kutunun agirligi
BoxWeight(double w, double h, double d, double m)
{
width = w;
height = h;
depth = d;
weight = m;
}
}
Örnek: Renkli/Ağırlıklı Kutu – Main Metotu
BoxWeight mybox1 = new BoxWeight(10, 20, 15, 34.3);
ColorBox mybox2 = new ColorBox(2, 3, 4, Color.BLACK);
double vol;
vol = mybox1.volume();
System.out.println("Volume of mybox1 is " + vol);
System.out.println("Weight of mybox1 is " + mybox1.weight);
System.out.println();
vol = mybox2.volume();
System.out.println("Volume of mybox2 is " + vol);
System.out.println("Weight of mybox2 is " + mybox2.color);
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
Örnek: Alt Sınıf Değişkeninin Temel Sınıf
Değişkenin Atanması (1)
BoxWeight weightbox = new BoxWeight(3, 5, 7, 8.37);
Box plainbox = new Box();
System.out.println("Volume of weightbox is " + weightbox.volume());
System.out.println("Weight of weightbox is " + weightbox.weight);
System.out.println();
// assign BoxWeight reference to Box reference
plainbox = weightbox;
Örnek: Alt Sınıf Değişkeninin Temel Sınıf
Değişkenin Atanması (2)
vol = plainbox.volume(); // OK, volume() defined in Box
System.out.println("Volume of plainbox is " + vol);
/*
* The following statement is invalid because
* plainbox does not define a weight member.
*/
// System.out.println("Weight of plainbox is " + plainbox.weight);
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
Örnek: Temel Sınıf Yapıcısını Çağırma
class BoxWeight extends Box {
double weight; // weight of box
// initialize width, height, and depth using super()
BoxWeight(double w, double h, double d, double m) {
super(w, h, d); // call superclass constructor
weight = m;
}
}
Örnek: Temel Sınıf Yapıcıları – super(...)
kullanmaksızın (1/3)
class A {
A() {
System.out.println("Inside A's constructor.");
}
}
class B extends A {
B() {
System.out.println("Inside B's constructor.");
}
}
Örnek: Temel Sınıf Yapıcıları – super(...)
kullanmaksızın (2/3)
class C extends B {
C() {
System.out.println("Inside C's constructor.");
}
}
class CallingCons {
public static void main(String args[]) {
C c = new C();
}
}
Örnek: Temel Sınıf Yapıcıları – super(...)
kullanmaksızın (3/3)
Program Çıktısı:
Inside A’s constructor
Inside B’s constructor
Inside C’s constructor
•
•
•
•
super() kullanılmamasına rağmen, temel sınıfların
varsayılan yapıcıları çağrıldı
Madem yapıcı çağırılacak, neden super kullanalım?
Farklı imzaya sahip yapıcıları çağırabilmek için
Örnek: super(1, 2)
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;
firstObject.privateVariable = 0;
firstObject.publicMethod();
//
firstObject.protectedMethod(); //
}
}
// Hata!
// Hata!
Hata yok
Hata yok
Statik Üyeler (1/3)
• 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
Statik Üyeler (2/3)
• 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 (3/3)
• Ö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]);
}
}
Final Sınıflar
Final sınıflardan alt sınıf oluşturulamaz
final class MyClass {
int field = 0;
void method() {
field = 1;
}
}
Final Üyeler (1/2)
• Final tanımlanan sınıf üyeleridir: metot veya
değişken
• Final metotlar alt sınıflarda yeniden tanımlanamazlar
• Final değişkenler ise ilk değer atandıktan sonra
değeri değiştirilemeyen sınıf üyeleridir
• Bu nedenle, değerleri ilk değer atanırken verilmelidir
(1) Değişken tanımlanırken - hem statik hem de statik olmayan
üyeler için bu yöntem kullanılablir veya ...
Final Üyeler (2/2)
(2) Her bir yapıcının içerisinde ilk değer atanabilir
- sadece statik olmayan üyeler için kullanılabilir
class MyClass {
final int finalField = 0;
void method() {
finalField = 1; // Hata!
}
}
Download