2. Konular
● Reserve Edilmiş Kelimeler
● Package nedir? Ne işe yarar?
● Sınıflar(Class), Nesneler(Object) ve
Özellikler(Property)
● Constructor ve Methodlar
● Bellek Kullanımı (Heap ve Stack Alanlar)
● Access Modifiers (Erişim Değiştiricileri)
● Static ve Final Özelliği
● Encapsulation(Getter and Setter)
● Inheritance(Kalıtım)
● Polymorphism(Çok biçimcilik)
● Interface
● Abstraction(Soyutlama)
● Object Casting
3. Rezerve Edilmiş Kelimeler
Bu kelimeler Java kütüphanesindedir ve bir operasyonu gerçekleştirebilmek için
kullanılan kelimelerdir. Bu kelimeleri tanımlayıcı olarak kullanamayız.
4. Package nedir? Ne işe yarar?
Package: Anlamsal olarak aynı işi tanımlayan class gruplarını, interface gruplarını
veya alt package ları bir araya alıp kapsayan mekanizmadır. Örnek package ismi:
● Tanımlarken package com.sirketadi.projeadi;
● Kullanırken import java.util.*;
Neden package kullanmalıyız? Ne işe yarar?
● İsim karmaşasını önlemek için.
● Proje içerisinde aradığımız bir dosyayı(class, interface, enum vb.) rahatça bulup
erişebilmek için.
● Kontrollü erişimi sağlayabilmek için. Bu durum bir projede birden fazla package
varsa kullanılır.
5. Sınıflar ve Nesneler
Sınıf(Class): Nesne oluşturmak, veri tipi ve method tanımlamalarında
kullanılabilecek şablon veya kalıplardır.
● Sınıf isimleri singular(tekil) olmalıdır.
Nesne(Object): Mevcut veri içerisinde çalışan veri ve prosedürlerdir. Her nesne bir
duruma ve bir davranışa sahiptir.
● Bu durumlar properties(özellikler(değişkenler)) olarak mevcuttur.
● Davranışlar ise o nesneye ait methodlardır.
Not: Nesneler oluşturulurken new sözcüğü ile oluşturulur.
6. Constructor, Methodlar ve Property
● Constructor, bir class içerisinde default(varsayılan) olarak bulunan inşaatçı
methodlardır.
● Methodlar, bir class tan oluşan nesnenin davranışını belirten özellikleridir.
○ Geri dönüş tipleri olabilir(return statement(ifade)) veya olmayabilir(void statement(ifade)).
○ Methodlar tanımlamaları bir fiil(eylem) ile başlamalıdır ve sonuçta bir eylem belirtmelidir.
● Property (Özellik), primitive type (ilkel tip) veya herhangi bir Nesne(Object)
olabilirler. Bunun amacı sahip olduğumuz class’tan oluşacak nesne için özellik
tanımlamaktır.
○ Örnek property: private int color; private WheelModel wheel;
7. Bellek Kullanımı
Heap Memory: Java Runtime tarafından oluşturulan nesnelere ve JRE(Java Runtime
Environment) tarafından oluşturulan classlar hafızanın bu bölümünde tutulur.
Stack Memory: Method içerisinde tanımlanan değişkenler hafızanın bu bölümünde
tutulur. Ayrıca Heap Memory içerisinde bulunan nesnelerin referansları da bu
bölümde tutulur. Heap ile karşılaştırıldığında oldukça az bir boyutu vardır.
Buradaki önemli nokta ise Garbage Collector(Çöp Toplayıcı) adını verdiğimiz işlem
herhangi bir referansa ait olmayan nesneleri temizlemek için Heap Memory
üzerinde çalışır. Kısaca bize Runtime boyunca hafızada yer açar.
8. Heap Memory vs Stack Memory
● Heap Memory’deki değişkenler tüm uygulama tarafından ulaşılabilirken, Stack Memory’dekilere
sadece aynı Thread içerisinden ulaşılabilir.
● Stack Memory’ deki bellek yönetimi basit ve LIFO(Last In First Out) yani son giren ilk çıkar mantığı ile
çalışırken, Heap Memory’deki bellek yönetimi daha büyük ve karmaşık olduğu için içerisinde Garbage
Collector adını verdiğimiz bir işlem çalışır.
● Stack Memory kısa ömürlüdür, Heap Memory ise uygulamanın başından sonuna kadar tutulur.
● Stack Memory hem boyut olarak hem de bellek yönetimi olarak basit olduğundan Heap Memory’ e
göre daha hızlı hareket eder.(Değişkene erişim hızı olarak düşünebiliriz)
● Stack Memory dolarsa alınacak olan hata:
● Heap Memory dolarsa alınacak olan hata:
10. Access Modifiers
Bir classın, constructorın, değişkenin (variable), methodun veya bir datanın(verinin)
ulaşılabilecek kapsamını kısıtlamaya yardımcı olur.
Java’da kullanılan 4 tip access modifers mevcuttur.
1. Default - Herhangi bir kelime yok.
2. Private
3. Protected
4. Public
11. Access Modifiers Devam
default private protected public
Aynı Class Evet Evet Evet Evet
Aynı Package
SubClass
Evet Hayır Evet Evet
Aynı Package
SubClass Değil
Evet Hayır Evet Evet
Farklı Package
SubClass
Hayır Hayır Evet Evet
Farklı Package
SubClass Değil
Hayır Hayır Hayır Evet
Erişim durumları gösterilmiştir
12. Static Özelliği
Static:
● Class’tan nesnesi üretilmeden ulaşılabilen method ve değişkenler yapmaya
yarar.
● O class oluşan her bir nesne için sürekli aynı özelliği gösterir. Öğrenci class’ının
içinde “mevcut” isminde bir static property olsun ve constructor’da +1 artsın. Bu
bize her öğrenci oluşturduğumuzda toplamda öğrenci class’ımızdan kaç
öğrenci oluşturduğumuzu verecektir.
● Static değişkenler Runtime boyunca memory’de tutulur.
● Static class’lar Java’da ana class olarak tanımlanamazlar. Fakat ana class
içinde class tanımlanırsa o class static tanımlanabilir.
13. Final Özelliği
final kelimesinin Java’da 4 alanda kullanımı mevcuttur.
1. Class içindeki final değişkenleri:
a. Bu değişkenlere sadece bir kez atama yapılabilir ve Runtime’da değiştirilemez. Bu atama işlemi
o sınıf içinde yapılır. Örnek olarak Pİ sayısının değerini bilindiği için doğrudan atama yapılabilir.
2. Method’a gönderilen final parametresi:
a. Bunun amacı ise fonksiyona veya methoda gönderdiğimiz değişkenin değiştirilmemesini
istiyorsak kullanırız.
3. Final Methodlar:
a. Üst sınıftaki methodun ondan türeyen subclass’lar içerisinde override edilmesini engeller.
4. Final Class’lar:
a. Final tanımlı class’lardan yeni bir class türetilebilmesini engeller.
14. Encapsulation(Getter and Setter)
Encapsulation işlemi bir class’ımız içindeki değişkenlere diğer class’lar tarafından
doğrudan müdahale edilmesini engellemek için kullanılır.
Eğer bir property’e encapsulation uygulayacaksak onu private yapıp o değişkeni
kotrol eden public bir get ve bir set methodu tanımlamamız yeterli olacaktır.
Encapsulation ile yapılabilecekler ise:
● Data Hiding,
● Read Only, Write Only property
15. Inheritance(Kalıtım)
● extends kelimesi kullanılarak gerçekleştirilir.
● Bir class birden fazla class’tan türetilemez. Ancak B classı A’dan türesin ve C
class’ı da B class’ından türeyebilir. Bir nevi Dede(A)->Baba(B)->Oğul(C) gibi.
● Bir class’tan birden fazla class türetilebilir.
● Reusability’i kod içerisinde sağlar. Aynı değişkenler tanımlanmaz. Üst
sınıflardan aktarılır.
● OOP’nin mihenk taşlarından diyebiliriz.
16. Polymorphism(Çok Biçimcilik)
Polymorphism bir class’tan farklı biçimlerde nesneler üretebilmektir.
Java’da polymorphism 2 şekilde olabilir.
1. Overloading(Aşırı yükleme)
a. Compiletime Polymorphism olarak adlandırılır.
i. Sebebi daha program çalışmadan hangi methodun çağrılması gerektiği bilinir.
2. Overriding(Ağır basma veya ezme)
a. Runtime Polymorphism olarak adalandırılır.
i. Sebebi daha program çalışmadan hangi methodu çalıştıracağını bilmez. Bunun sebebi
interface kullanımından veya abstract methodlardan kaynaklanmaktadır.
17. Overloading Polymorphism
Bu yöntem bir class’a ait constructor sayısını artırarak gerçekleştirilir.
Buradaki önemli nokta bu constructor’lar farklı sayıda parametreye sahip olmalı
veya farklı tiplerde olmalıdır.
Siz aynı zamanda o class’a ait diğer method’lara da overload yapabilirsiniz.
18. Overriding Polymorphism
Bu yöntem inheritance özelliği kullanılarak yapılmaktadır.
Örnek verirsek: Shape(Şekil) Class’ınız olsun ve bundan türeyen bir Circle(Daire)
Class’ınız ve Square(Kare) Class’ınız olsun. Son olarak bu üç class’ınızın içerisinde
de draw() isminde bir methodunuz olsun. Amacımız bu methoda polymorphism
kullanarak ulaşmak.
19. Interface
Interface’lerde aynı classlar gibi değişkenlere ve methodlara sahip olabilirler.
Aradaki temel farklar:
● class sözcüğü yerine interface sözcüğü yazılarak kullanılır.
● Interface’ler isimlendirilirken genelde “I” harfi ilk harf olur.
● interface’ler içerisindeki methodların body denilen kısımları yazılmaz. Bu durum default
abstract(soyut) olmalarından gelir. Ayrıca public’tirler.
● değişkenler initialize edilmelidir. Bu durum interface içerisinde kullanılan değişkenlerin
default final olarak tanımlanmasından gelir.
● Tanımlanan değişkenler default olarak public, static ve final türündedir.
● Java 8’ den beri interface’lerde static ve default anahtar sözcükleri ile kullanılan
methodların body’si olmalıdır.
● Interface’lerde final anahtar sözcüğü kullanılmaz.
20. Interface Devam
Java’da Interface ile ilgili diğer bilmemiz gerekenler ise şunlardır:
● implements anahtar sözcüğü ile bir class’a eklenirler.
● Interface’ler new anahtar sözcüğü ile kullanılırsa anonymous bir class’ a
implemente olurlar.
● Interface’ler class’lara implement olup o class’ın sözleşmesi niteliği taşırlar.
● Bir class bir interface’i implement eder ise o interface’e dair tüm method’ları
implement etmek zorundadır.
● Interface’ler kendi aralarında inheritance’ daki kurallara uyarak kalıtım
gerçekleştirebilirler.
● Bir class birden fazla interface’i implemente edebilir.
● Polymorphism interface’ler kullanılarak ta yapılabilmektedir.
21. Abstraction(Soyutlama)
abstract anahtar kelimesi ile oluşturulur.
İsminden anlaşılacağı üzere amaç class içerisindeki methodları class dışı çağrılırken
soyutlayabilmektir. Bu olayı şu şekilde özetleyebiliriz.
Bir arabanız var gaz ve fren pedalı var. Siz sadece o ikisini bilirsiniz. Fakat araba siz
o ikisinden birine basınca ne yapacağını bilir. Hızı artırır veya azaltır.
● Abstract ile yapılabilecek tüm senaryoları interface kullanarak ta yapabilirsiniz.
● Abstract kullanmak kodun complexity(karmaşıklık)’sini artıracaktır.
● Eğer bir class abstract class ise içerisinde abstract method tanımı yapılabilir ancak body’ si olamaz.
● Abstract class’lar implements değil extends edilirler.
● Ana class’ta abstract bir method var ise kalıtım alan sınıf bu methodu override etmek zorundadır.
● Abstract class’lar kullanılarak ta polymorphism yapılabilir
22. Object Casting
Java’da casting işlemi cast yapılmak istene objenin class isminin parantezler
içerisine yazılıp atanması ile gerçekleşir.
Java’da aralarında inheritance ilişkisi bulunan classlardan oluşan nesneler
birbirlerine upcasting veya downcasting yapabilirler.
Bu duruma örnek vermek gerekirse Hayvan isimli bir sınıfımız var ve bundan kalıtım
alan Kedi isimli bir sınıfımız olsun. Oluşturulan Hayvan nesnesine doğrudan Kedi
nesnesi herhangi bir cast işlemi yapılmadan ataması yapılabilir. Bu duruma
upcasting denir.
23. Object Casting Devam
Yine bir önceki örnekten gidelim. Bu seferde Hayvan sınıfına ait bir nesneye yeni bir
Kedi oluşturup atayalım. Ardından Kedi sınıfımızın içindeki miyav() isimli methodu
çağırmaya çalışalım. miyav() methodunu çağırabilmemiz için Hayvan nesnemizi Cat
nesnemize downcasting yapıp çağırabiliriz.