Sıfırdan Java programlama dersleri serisine  “Java Programlama Dersleri, Nesneler ve Sınıflar” konusu ile devam ediyoruz. Java Object – Oriented yani Nesne yönelimli bir programlama dilidir. Ve bunun temeli nesne ve sınıf kavramlarına dayanır.

Nesneler (Objects) ve Sınıflar (Classes), Java’nın en önemli konusudur. Daha önceki derslerimizde sınıflardan bahsettik ancak ayrıntılı bir şekilde işleme fırsatı bulamadık.

Javada her şey sınıf içerisindedir. Sınıf aslında bir veri tipidir. Sınıflar benzer özellikteki verileri bir araya getiren yapılardır. Sınıfların asıl amacı verilerin sistematik olarak kullanılmasıdır. Bizlere hiyerarşik olarak çalışma imkanı verir.

Java’da sınıf nedir, nesne nedir? kavramlarını teorik olarak anlatmadan önce uygulamada nasıl kullanılıyor ondan bahsedeceğim.

 

Uygulama 1 (Tek Sınıf, Tek Nesne)

 

Java programlama dilinde nesne ve sınıf kavramlarının uygulamasını görelim :

Bu projemizde NetBeans IDE kullandık. NesnelerSiniflar adında bir project oluşturduk ve içerisindeki main bulunan Ev adında bir sınıf oluşturduk.

Sınıfın ismi bir veri tipidir. int, char, double nasıl veri tipleri ise sınıf da bir veri tipidir.

Ev sınıfına ait en,boy ve yukseklik adında double tipte değişkenler tanımladık. Bu değişkenler Ev sınıfının property/değişkenleridir.

main metodu içerisinde ise Ev tipinde evNesnesi adında bir değişken tanımladık. Aslında Ev sınıfın bir örneğini oluşturduk(instance). Bu örneğin bellekte yer kaplaması ise new anahtar kelimesinin kullanılması ile olur.

Bir Java programı/projesi içerisinde birden fazla package olabilir. Bir package içerisinde birden fazla da java sınıfı olabilir. Her sınıfın içerisinde bir main metodu bulunmak zorunda değildir.

Bunlardan ilk çalışacak olan sınıfta bir tane main metodu bulunmak zorundadır. Bütün sınıflarda bulunmak zorunda değildir ancak bir tane bulunmak zorundadır.

java programlama dersleri nesneler siniflar uygulama 2

Sınıfa ait bir nesne ile o sınıfın içerisindeki şeyleri kullanabilirsiniz. (property, metod) Mesela Ev adında bir sınıf oluşturduk ve içerisinde en, boy ve yukseklik şeklinde 3 adet değişken /property tanımladık. Sonrasında evNesnesi adında bir nesne oluşturduk.

evNesnesi’ni kullanarak Ev sınıfı içerisindeki propertylere varsa metodlara ulaşabiliriz. Bunun içinde nokta operatörünü(.) kullanırız. evNesnesi yazdıktan sonra nokta koyduğunuzda karşınıza o sınıfla alakalı property ve metodlar gelecektir.

java programlama dersleri nesneler siniflar nokta operatoru

Aşağıdaki kodlara bakarsanız evNesnesinin en özelliğine 6, boy özelliğine 3 ve yukseklik özelliğine de 4 değerlerini atadık. Sonrasında System.out.println() metodu ile bu değerleri ekrana yazdırdık.

java programlama dersleri nesneler siniflar uygulama 1

Programımızın sonucu aşağıdaki gibidir:

Uygulama 2 (İki Sınıf, Tek Nesne)

 

Java programlama dilinde Nesneler ve Sınıflar kavramının anlaşılması çok önemlidir. Object Oriented Programlama olarak geçen Nesne Yönelimli programlamanın temelini oluşturur.

Uygulamamızı biraz değiştirerek devam ediyoruz.

Bundan önceki uygulamamızda bir class ve o class içerisindeki main metodunda class ın propertylerini kullanmıştık. Şimdi ise bir project içerisinde aynı package içerisinde yer alan farklı iki classı kullanalım. Uygulamamız Eclipse IDE ortamında yapılmıştır :

java nesne yonelimli programlama nesneler ve siniflar uygulama 1

Kodlarımız ise aşağıdaki aşağıdaki gibidir :

Ev.java

java nesne yönelimli programlama nesneler ve siniflar ev sinifi

Hesap.java

java nesne yönelimli programlama nesneler ve siniflar hesap sınıfı

Şimdi bu iki class ı en baştan anlatmaya başlayalım.  Bir sınıf eklemek için package üzerine gelip New Class demeniz yeterlidir. Ancak incelememiz gerekirse bir sınıf tanımı

şeklindedir.

<erişim belirleyici> nin public anahtar kelimesi olduğunu tahmin etmişsinizdir. Dersin sonuna doğru bu ifadeleri ayrıca ele alacağım. class anahtar kelimesi ve sinifAdi ile beraber bir sınıf tanımlaması yapılmış oluyor. Elimizde iki tane class var : Ev.java ve Hesap.java

Ev.java içerisinde sadece Ev sınıfına ait 3 adet property bulunmaktadır. Hesap.java sınıfı içerisinde ise main metodumuz ve içerisinde kodlar yer almaktadır.

Hesap sınıfı içerisinde Ev sınıfındaki değişkenlere erişebilmek için ilk olarak Ev sınıfının örnek bir nesnesini oluşturduk : evim. evim nesnesi üzerinden Ev sınıfı içerisindeki propertylere erişip onlara değer ataması yapabildiğimiz gibi içeriklerini de ekrana yazdırabildik. Son olarak

kodu ile hacim adında double bir değişken tanımladık. Bu değişkene Ev nesnesinin 3 değişkenini çarparak atamasını yaptık ve ekrana yazdırdık. Sonuç aşağıdaki gibidir:

Uygulama 3 ( İki Sınıf, İki Nesne)

 

Şimdi yukarıdaki örneğimizi biraz daha değiştirelim.

java nesne yonelimli programlama nesneler ve siniflar uygulama 1

Kodumuz aşağıdaki gibidir :

Ev.java

java nesne yönelimli programlama nesneler ve siniflar ev sinifi

Hesap.java

java nesne yonelimli programlama ornegi hesap sinifi

Aynı proje ve package içerisinde Ev ve Hesap sınıfları yer alıyor. Ev sınıfı, içerisinde sadece 3 property bulunduran bir class iken Hesap sınıfı içerisinde main metodu bulunduruyor.

Hesap sınıfında Ev değişkenlerine erişimi sağlamak için Ev tipinde iki adet nesne örneği oluşturduk. Bir sınıfın nesne örneği o sınıfın şablonunun kopyası demektir. Bu özelliklere sahip 2 farklı ev tanımlayabiliriz. Biz de bunu yaptık: kucukEv ve buyukEv

kucukEv adında Ev tipinde bir nesne örneği oluşturup erişilen propertylere değerlerini atayıp ekrana yazdırdık. Aynı şekilde farklı bir nesne olarak buyukEv nesnesini oluşturduk. Ev değişkenin propertylerine erişerek farklı değerler vererek tekrar ekrana yazdırdık.

Javada her nesne bir sınıfın kopyasıdır. Yani sınıfı kendisine şablon olarak alır ve bellekte farklı bir yerde tutulur.

kucukEv ve buyukEv nesneleri hafızada farklı yerlerde saklanıyor. Bir sınıfın en iyi tanımını aslında bu örnekte görmüş oluyoruz. Bir sınıfı örnek alarak iki farklı nesne yaratmış olduk. Ev sınıfı bize şablon oldu ve bu şablonu kullanarak buyukEv ve kucukEv şeklinde iki nesne oluşturduk.

Eclipse IDE de bir nesnenin(değişkenin) adını değiştirirken nesneyi seçip > sağ tık > Refactor > Rename demeniz yeterlidir.

Nesneler birbirilerine atanabilir mi? Görelim :

Kodu incelediğimizde evNesnesi new anahtar kelimesi ile kullanıldığında bellekte bir yer tutmaktadır. Ancak evNesnesi2 nesnesinin sadece bir ön tanımı yapılmıştır. Ancak bellekte bir yer kaplamamaktadır.

evNesnesi’nin evNesnesi2 ye atanması ile evNesnesi2 ve evNesnesi bellekte aynı yeri işaret eder hale gelmişlerdir. Özetle iki nesne var ama bir new anahtar sözcüğü var. Yani bellekte tek yeri işaret ediyorlar.

Buraya kadar işin pratik kısmından bahsettik. Şimdi de vermiş olduğumuz bu pratik bilgileri destekleyecek teorik bilgileri sizlere sunalım.

 

Sınıf Nedir? (Class Kavramı)

 

Genellikle class olarak ifade ettiğimiz sınıf kavramı aslında soyut bir veri tipinden ibarettir. Object olarak belirttiğimiz nesne kavramı ise bu soyut veri tipinin somutlaştırılmış, cisimleştirilmiş halidir.

Programlamadaki öğeleri gerçek hayatla bağdaştırabiliriz. Mesela Java’daki sınıf (class) kavramını doğadaki cins isimlere benzetebiliriz.

Örnekler üzerinden gidelim. Ağaç kavramı cins bir isimdir. Ağaç nesnelerinin ortak özelliklerini belirten soyut bir kavramdır. Ancak bahçemizdeki erik ağacı ya da bir çam ağacı belirli varlıklardır. Erik ağacı veya çam ağacı, ağaç sınıfının birer nesneleridir, üyesidir.

Cins isimler kendi içerisinde şu ağacı bu ağacı gibi alt sınıflara ayrılabilirler. Bu şekilde ayrılan alt sınıfların üst sınıf olan ağaç sınıfından farklı olarak kendilerine has özellikleri olabilir.

Memeli hayvanları düşünün. Memeli sınıfı üst bir sınıftır. Bünyesinde bulundurduğu İnsanlar, balinalar, filler vs. birçok canlı bu sınıfın alt sınıflarıdır. Alt sınıfta bulunanlar, üst sınıfın özelliklerini taşırlar ancak kendilerine has özellikleri de vardır.

Java da sınıf, bir cinste olduğu gibi ortak özellikleri belirlenmiş bir topluluğun adıdır. Bu sınıfın niteliklerini, özelliklerini değişkenlerle (fieldsi attributes) ifade ederken davranışlarını ise metotlarla (procedure) ifade ederiz.

Başka bir deyişle bir java sınıfı, kendi özelliklerini (property) belirleyen değişkenler ve davranışlarını belirleyen metotlardan(fonksiyon) oluşur.

Bir sınıf içerisindeki metotlar o sınıfın değişkenlerine erişebildiği gibi farklı sınıflar arasında da buna benzer bir iletişim/erişim olabilir.

Java programları class dediğimiz sınıflardan oluşur. Bütün sınıflar aynı yapıya sahiptir. Aralarındaki farkı yaratan şey, sahip oldukları değişken ve metotlardır. Sınıfların bazıları hiç değişken veya metot içermezken bazıları az bazıları çok değişken veya metot içerebilir.

İngilizce kaynakların bazılarında değişken terimi için attribute, metot kavramı yerine fonksiyon veya procedure ifadeleri kullanılmaktadır.

Sınıf Yapısı (Class Structure)

 

Java’da sınıf yapısı (class structure), sınıf bildirimi aşağıdaki gibidir :

Erişim belirleyicisi (Access modifier)

Sınıf yani class yapısına kimlerin erişebileceğini ifade eden kavramdır. Bu kavramı dersin sonlarına doğru ayrıntılı olarak ele alacağız.

class anahtar kelimesi

class ifadesi sınıf tanımında mutlak kullanılması gereken anahtar kelimedir. Derleyici bu ifadeyi gördüğünde yapının bir class olduğunu anlar.

ad

Her sınıfın (class) bir ismi vardır. ad ile ifade ettiğimiz yere sınıfın ismi getirilir. Class isimlerinin büyük harfle başlatılması gelenek haline gelmiştir.

Değişken adları, metot adları, paket adları ve interface adlarının küçük harfle başlatılması da gelenek hale gelmiştir. Sabitlenmiş değişkenler (final) ise  büyük harflerle yazılır. Örnek: PI=3.14159.

Gelenekleşen bu kuralların amacı kaynak kodun diğer programcılar tarafından anlaşılmasını kolaylaştırmaktır. Yani bu kurallar derleyici için zorunluluk ifade eden kavramlar değildir.

{….}

Class yapısı bu süslü parantezler içinde kurulur. Bu parantezler içerisinde property ve metotlar yer alır.

Bir proje içerisinde birden fazla paket ve bu paketlerin içerisinde çokca sınıf bulunabilir. Java da sınıflar kendi isim ve kendi dosyalarıyla tutulurlar. Ancak genelde bir package içerisinde aynı görevi gören sınıflar bir arada olurlar.

 

JAVA API leri

 

Java dili içerisinde bir programcının ihtiyaç duyacağı genel sınıflar ön-tanımlı olarak bulunur. Java’da bulunan ve Java API (Application Programmer’s Interface) olarak da ifade edilen bu sınıfların dökümanlarına burdan erişebilirsiniz.

Programcılar bu sınıfları direk kullanabildikleri gibi bu sınıfların alt sınıflarını üreterek kendi sınıflarını da tanımlayabilirler. Bu haliyle Java dili, programcıya büyük bir kolaylık ve özgürlük sunar.

Örneğin bu derse gelene kadar sıklıkla kullandığımız System.out.println() metodunu düşünelim.

Bu metod Java API kütüphanesinde yer alan java.lang paketi içerisindeki System sınıfını ve java.io paketi içerisindeki PrintStream alt sınıflarını kullanır. System.out.println() metodu ile genel olarak string ekrana bastığımızdan String classını da çağırır.

System sınıfında olduğu gibi final anahtar kelimesi bir sınıfın başına getirilirse o sınıfın sabit değiştirilemez olduğunu gösterir.

Java’da bütün sınıfların en tepesinde Object adında bir sınıf bulunur.

Sınıf Nesnesi Yaratma, Sınıf Öğelerine Erişim

 

Java dilinde sınıf bildiriminden bahsetmiştik. Örneğin

ifadesi bir sınıf bildirir. class kelimesi anahtar bir sözcüktür. Ev ise sınıfın ismidir. {…} bloğu ise sınıfın gövdesi ya da sınıf bloğu diyebiliriz.

Java dilinde bir sınıf, şablondur tasarımdır. Bu haliyle bellekte bir yer kaplamaz tamamen soyuttur. Ancak new anahtar sözcüğü kullanarak o sınıf türünde bir nesne oluşturduğumuz an bellekte bir yer kaplamaya başlar. Oluşturulan nesne, sınıfın somutlaşmış hali olur.

ifadesi derleyiciye Ev sınıfına ait bir nesnenin bellekteki adresini gösterecek bir referans bildirir. Referansın adı evim’dir.

evim referansının bu haliyle tek görevi Ev sınıfına ait bir nesnenin bellekteki adresini işaret eder. Bu haliyle ortada henüz somut bir Ev yoktur. Bu sebeple evim referansı hiçbir şey anlamına gelen null u işaret ediyor diyebiliriz.

ifadesi ile Ev sınıfına ait nesneyi yaratmış oluruz. Bir sınıfa ait nesne(object) yaratmak demek , bellekte sınıfa ait (static olmayan) bütün öğelere bellekte birer yer ayırmak demektir. Ayrılan bu yerlere başka değerler yazılamaz. O nesne bellekte durduğu sürece bu durum geçerlidir.

Bunu bellekte yer kiralama gibi düşünebilirsiniz. Java bellekte oluşturulan her sınıf değişkenine kendiliğinden bir öndeğer (default value) atar. Ön değer veri tipine göre değişir. Bu değerleri, tip dönüşümleri dersimizde belirtmiştik. Sınıf nesnesini

şeklinde tek bir kodla da oluşturabiliriz.

evim nesnesini oluşturduktan sonra Ev sınıfının property ve metotlarına erişim için nokta (.) operatörünü kullanırız. Bunun örneklerini yukarıda görmüştük zaten.

Hatırlatmak amaçlı bir sınıfın property ve metodlarına erişmek için o sınıfın bir nesnesini oluşturduğumuzu bilelim yeterli.

Nesne yönelimli programlamada mümkün olduğu kadar farklı işleri farklı sınıflar içerisinde yapmayı tercih ederiz. Böylelikle hem programımız kolay yönetilir hem de bir sınıf yeri geldiğinde farklı programlarda çalışabilir. Buna modüler programlama denir.

 

Erişim Belirleyicileri (Access Modifiers)

 

Bir java kodu, bir değişkeni çağırabiliyorsa o kod söz konusu değişkene erişebiliyor demektir. Aynı şekilde bir java kodu bir metodu çağırabiliyorsa o kod söz konusu metoda erişebiliyor demektir.

Bir sınıfın içindeki kodlar farklı bir sınıfın içerisindeki değişkenlere ve metodlara erişebiliyorsa o sınıf söz konusu sınıfa erişebiliyordur. Bu durum paketler için de aynı şekildedir.

Java’da bir değişken bir metot, bir sınıf veya bir paket tanımlanırken o öğeye kimlerin erişebileceğini belirtebiliriz. Bunun için erişim belirteci (access modifier) anahtar kelimeler kullanırız. Java’da erişim belirteçleri sistemin güvenliğini sağlar ve 4 tanedir :

  • public
  • private
  • protected
  • ön-tanımlı
Erişim Belirteci İzinler
public Bütün sınıflar erişebilir.
private Alt sınıf dahil başka hiçbir sınıf erişemez.
protected Alt sınıflar ve aynı pakettekiler erişebilir.
<default> (ön-tanımlı) Aynı pakettekiler erişebilir.

public

 

public erişim belirteci; bir değişkeni, bir metodu ya da bir sınıfı niteleyebilir. Nitelediği öğeyi herkese açık hale getirir. Başka pakette olsa dahi program içindeki her kod onlara erişebilir.

public bir sınıfın değişkenlerine ve metotlarına, kendi alt sınıfları ve dışarıdaki diğer sınıflar kısıtlama olmaksızın erişebilir. Bu durum public değişkenler ve metotlar için de aynıdır. Uygulama programlarında main() metodunun public tanımlanmasının sebebi budur.

public sınıf bildirimi

public değişken bildirimi

public metot bildirimi

private

 

Bazen programımızda bazı değişken, metot veya sınıflara başka sınıflardaki kodların erişmesini engellemek isteyebiliriz. Bu gibi durumlarda private erişim belirleyicisini kullanırız. private öğelere yalnız aynı sınıftaki kodlar erişebilir, başka sınıflar erişemez. Hatta kendi alt sınıfları bile erişemez.

super class interface metodu

private sınıf bildirimi

private değişken bildirimi

private metot bildirimi

protected

 

Bazı durumlarda bir sınıf içerisindeki değişken ve metotlara alt sınıfların erişmesini ancak paket ya da program içindeki başka sınıfların erişmesini engellemek isteyebiliriz. Bu gibi durumlar için protected erişim belirleyicisini kullanırız.

Yani alt sınıfta bulunan değişken ya da metotlar üst sınıfın protected öğelerine public gibi erişir. Alt sınıflara erişim yetkisi verdiği için kalıtım (inheritance) olayında önemli rol oynar.

protected sınıf bildirimi

protected değişken bildirimi

protected metot bildirimi

ön-tanımlı <default> belirteç

 

Bir değişken, metod veya sınıfın önüne hiçbir erişim belirteci konulmadığı durumdur. Erişim belirteci konmamışsa ön-tanımlı, default belirteç etkili olur. (friendly access)

paket bildirimi

Paketler yalnızca öntanımlı erişime sahiptirler, başka erişim belirteci almazlar. Bu erişimle; Paket içerisindeki her sınıf, pakette olan her değişken ve metoda erişebilir. Ama başka paketlerdeki sınıflar erişemez.

erişim belirteçsiz default sınıf bildirimi

Sınıf bildirimi yapılırken sınıfın önüne hiçbir erişim belirteci konulmazsa, o sınıf içerisindeki değişken ve metotlara aynı paketteki bütün sınıflar erişebilir.

erişim belirteçsiz default metot bildirimi

Metot bildirimde metotun başında hiçbir erişim belirteci konulmazsa; bu metoda classın kendisi alt sınıfları ve aynı paketteki diğer sınıflar erişebilir.

erişim beliteçsiz default değişken bildirimi

Erişim belirteci kullanılmamış değişken bildiriminde değişkene; sınıfın kendisi, alt sınıfları ve aynı paketteki diğer sınıflar erişebilir.

Böylelikle “Java Programlama Dersleri, Nesneler ve Sınıflar” konusunu bitirmiş olduk. Aklınıza takılanları ya da sormak istediklerinizi aşağıdaki yorum panelini kullanarak bizlerle paylaşabilirsiniz.

Pin It on Pinterest

Daha fazla Java
Java Programlama Dersleri, Debugging ve Breakpoint
Java Programlama Dersleri, Debugging ve Breakpoint

Sıfırdan Java programlama dersleri serisinde bu dersimizde ”Java Programlama Dersleri, Debugging ve Breakpoint ” konusuna değineceğiz. Uygulamaları Eclipse IDE ve NetBeans...

Kapat