Bölüm 10 Statik ve Anlık Öğeler

Benzer belgeler
Java Nitelemleri. Bölüm 1

NESNEYE YÖNELİK PROGRAMLAMA

public static int Toplam int x, int y

// hataları işaret eden referans

YZM 2105 Nesneye Yönelik Programlama

Sunum İçeriği. Programlamaya Giriş

BMM3101 PROGRAMLAMA DİLLERİ

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

İsimler ve Kapsam. Hafta 4 Ders 2 BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

Metotlar. d e f metot_adı [ ( [ arg [= d e f a u l t ] ]... [, arg [, &expr ] ] ) ] deyim ( l e r ) end

BTEP243 Ders 3. class Yazım Kuralı:

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Pointer Kavramı. Veri Yapıları

Pointers (İşaretçiler)

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Mantıksal İşlemler. 7.1 true, false, nil

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

ALGORİTMA VE PROGRAMLAMA II

Java Programlamada Paket Yapısı Ve Import

Proses. Prosesler 2. İşletim Sistemleri

PROSESLER. Proses. Proses

Göstericiler (Pointers)

BİL-141 Bilgisayar Programlama I (Java)

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Module ve Mixin Module nedir? 17.2 Neden Module?

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

Bölüm 07 Array. Array Nedir? Array Yaratma [] Operatörü Array'in Bileşenleri Seçkili (random) Erişim Array Türleri

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Program Çözümleme. Aşağıdaki örneklerde printf() ve scanf() fonksiyonlarının işlevleri gösterilmektedir. Liste 1.1. Çözümleme:

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 9. UYGULAMA

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

Örnek 1: Programı yazın ve çalıştırın.

Yrd. Doç. Dr. Caner ÖZCAN

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 4. Yrd.Doç.Dr.Hacer Karacan

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

Bir C programı C fonksiyonlarından oluşur. Bunlar arasında main() adı verilen ana fonksiyon daima olmalıdır. C fonksiyonları programı oluşturan

Örnek1: #include <iostream> #include <string> using namespace std;

NESNE MODELLERİ : SINIFLAR

HSancak Nesne Tabanlı Programlama I Ders Notları

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Doç. Dr. Aybars UĞUR

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Prof. Dr. Aybars UĞUR

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Yrd. Doç. Dr. Caner ÖZCAN

Bu parçalar arasındaki ilişkiyi kullanıp büyük çaplı programlar geliştirme tekniğine de nesne yönelimli programlama denir.

Belirli bir iş bir çok kez tekrarlanacaksa, programda bu iş bir kez yazılır ve döngü deyimleriyle istenildiği kadar tekrar tekrar çalıştırılabilir.

Programlama Dillerinde Kullanılan Veri Tipleri

Operatörlerin Aşırı Yüklenmesi

C++ Dersi: Nesne Tabanlı Programlama

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

Programlama Dilleri III 1

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

EMT2226 Nesne Yönelimli Programlamaya Giriş

C++ Dersi: Nesne Tabanlı Programlama

7. HAFTA. Erişim Belirleyiciler

Nesneye Yönelik Programlama (OOP) 7.Hafta

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

C++ Dersi: Nesne Tabanlı Programlama

Doğu Akdeniz Üniversitesi Bilgisayar Mühendisliği Bölümü. BLGM 318 Ara Sınavı Đlkbahar Dönemi 13 Nisan Ad, Soyad Öğrenci No.

Statik veri üyeleri sınıf dosyası içerisinde, ancak sınıf bildirimi dışında başlatılmalıdır. Statik üye fonksiyonları

YZM 2105 Nesneye Yönelik Programlama

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 2

BLM 112- Programlama Dilleri II. Hafta 4 İşaretçiler (Pointers)

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

NESNEYE YÖNELİK PROGRAMLAMA

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

BİL-142 Bilgisayar Programlama II

Aritmetik Operatörleri Hemen her programlama dilinde olduğu gibi java dilinde de aritmetik işlemler yaparken aşağıdaki operatörleri kullanırız:

Java da İşleçler, Ders #3 (4 Kasım 2009)

C++ Dersi: Nesne Tabanlı Programlama

4.Hafta. this Anahtar Sözcüğü

Karşılaştırma İşlemleri ve Koşullu İfadeler

3.1 Pointer in Yararları

Nesne Yönelimli Programlama

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

Mantıksal (Logic) Operatörler

Metotlar. Bölüm Metot Nedir? Metot Nedir? Parametreler ve Yerel Değişkenler. main() Metodu. Hazır Metotlar. System.Math Sınıfının Metotları

YZM 2105 Nesneye Yönelik Programlama

C++ ile Nesneye Dayalı Programlama

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

JAVA PROGRAMLAMAYA GİRİŞ

YZM 2105 Nesneye Yönelik Programlama

BİLİNİRLİK ALANI ve ÖMÜR, KONTROL DEYİMLERİ

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 3

Bölüm 9. Altprogramlar ISBN

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

Transkript:

Bölüm 10 Statik ve Anlık Öğeler Statik ve Anlık Öğeler Statik öğeler, bir sınıfta static sıfatıyla nitelendirilen değişkenler ve metotlardır. Bunlara sınıf değişkenleri de denilir. static nitelemesi almayan değişkenler ve metotlar ise anlık (dinamik, statik olmayan) öğelerdir. Örneğin, static int x; static double ÜcretHesapla(){... ; deyimleri, sırasıyla, int tipinden static x değişkeni ile double değer alan static ÜcretHesapla() metodunun bildirimidir. Bir sınıfın static öğelerine, o sınıfa ait bir nesne yaratılmadan erişilebilir. Sınıfın herhangi bir nesnesiyle bağlantısı olsun istenmeyen öğelere static nitelemesini vermek ona her yerden erişilebilen bir globallik niteliği verir. Daha önce, Java dilinde global değişken ve global metot olmadığını söylemiş, public nitelemesiyle öğelere bir tür global işlevsellik kazandırılabildiğini belirtmiştik. Öğelere globallik kazandırmanın ikinci etkin bir yolu static nitelemesidir. Statik öğeler, sınıfın bir nesnesi içinde olmadığından, onlara programın her yerinden erişilebilir. Örneğin, main()metodu daima static nitelemesini alır. O nedenle, ait olduğu sınıfın bir nesnesi yaratılmadan doğrudan çalışabilir. Sınıfa ait bir ya da daha çok nesne yaratıldığında, bu nesneler içinde yapılan işler static öğeleri etkilemez. Bunun nedeni, statik bir öğeye, o sınıfa ait bir nesne yaratılmadan ana bellekte bir ve yalnız bir tane bellek adresi ayrılmasıdır. Nesnelerin yaratılıp yokedilmesi, ya da nesneler içindeki değişimler onları etkilemez. Dolayısıyla, örneğin, static bir değişkenin belli bir anda yalnız bir tane değeri olabilir. Daha önemlisi, ana bellekte nesneye bağlı olmadan birer adresleri olduğu için, static öğelere nesne yaratılmadan erişilebilir. Statik olmayan öğelere anlık (dinamik) öğeler diyeceğiz. Öndeğer (default) olarak, bildirim sırasında static nitelemesini almayan her öğe anlık tır. Bunlara dinamik denmesinin nedeni, program boyunca ana bellekte kalmazlar, ait oldukları nesne ile birlikte yaratılır ve onunla birlikte ana bellekten silinirler. Örneğin, long y; Bölüm 06: Operatörler 1

float Topla(a,b){ return a+b; deyimleri, sırasıyla, long tipinden anlık x değişkeni ile float değer alan anlık Topla()metodunun bildirimidir. Bir sınıfın anlık öğelerine, o sınıfın yaratılan her bir nesnesi için, ana bellekte birer adres ayrılır. Başka bir deyişle, bir sınıfın üç ayrı nesnesi yaratılmışsa, sınıftaki anlık bir öğeye her nesnede bir tane olmak üzere üç ayrı bellek adresi ayrılır. Dolayısıyla, anlık değişkenin yaratılan her nesnede ayrı bir değeri vardır. Ama, onların var olabilmeleri için, önce sınıfa ait nesnenin yaratılması gerekir. Neden Nesne Yönelimli Programlama? Bu soruya yanıt vermeden önce aşağıdaki bir dizi programı inceleyeceğiz. Đncelemeyi bitirince, sorunun yanıtı kendiliğinden ortaya çıkacaktır. Örnek programların hepsi aynı işi yapmaktadırlar: Konsoldan brüt geliri okur, hesapladığı gelir vergisini konsola yazar. Đlk program, sözkonusu işi yapan en basit, en kısa ve en kolay programdır. Ama, yapısal programlama açısından asla tercih edilemeyecek kadar kötü bir programdır. Vergi01.java package statik; public class Vergi01 { double brüt; Scanner in = new Scanner(System.in); brüt = in.nextdouble(); in.close(); System.out.println("Gelir Vergisi :"); System.out.println(brüt * 40 / 100); Çıktı Brüt Geliri giriniz : 12345,678 Gelir Vergisi : 4938.2712 Şimdi programımıza konsoldan veri okuyan, hesap yapan ve konsola veri yazan VeriOku(), Hesapla() ve VeriYaz() adlı üç ayrı metot ekleyelim. Ama öyle yapalım ki, main()metodu VeriYaz() metodunu çağırsın. VeriYaz() metodu Hesapla() metodunu çağırsın. Hesapla() metodu VeriOku() metodunu çağırsın. Böylece arka arkaya dört metot çalışacaktır. Bir metodun başka bir metodu çağırması, matematikteki bileşik fonksiyon (fonksiyon fonksiyonu) kavramından başka bir şey değildir. Đçteki fonksiyon, dıştaki fonksiyonun parametresidir (değişken). Vergi02.java package statik; public class Vergi02 { double brüt; 2 t.karaçay : Java ile Nesne Programlama

double VeriOku() { Scanner scan = new Scanner(System.in); brüt = scan.nextdouble(); scan.close(); return brüt; double Hesapla() { void VeriYaz() { VeriYaz(); Bu program derlenince aşağıdaki hata iletisini gönderir. Cannot make a static reference to the non-static method VeriYaz() Bu ileti bize, static olmayan VeriYaz() metoduna static bir referans yapılamadığını; yani ona erişilemediğini söylemektedir. Bu mesajı alınca, programda hata ayıklama (debug) işine başlayalım. Đlk aklımıza gelen kolay yol, VeriYaz() metodunu static yapmaktır. 20.satırı şöyle değiştirelim: static void VeriYaz() { Bunu yaptığımızda, derleyici VeriYaz() metoduna erişebilir. Ancak onun çağırdığı Hesapla() metoduna erişemez ve şu hata iletisini yollar: Cannot make a static reference to the non-static method Hesapla() Gene yukarıdaki çözümü uygulayıp, Hesapla() metodunu static yapalım. Bunun için 16.satırı şöyle değiştirelim: static double Hesapla() { Bunu yaptığımızda, derleyici Hesapla() metoduna erişebilir. Ancak onun çağırdığı VeriOku() metoduna erişemez ve şu hata iletisini yollar: Cannot make a static reference to the non-static method VeriOku() Artık, bu hatayı nasıl ayıklayacağımızı biliyoruz. Gene yukarıdaki çözümü uygulayıp, VeriOku() metodunu static yapalım. Bunun için 8.satırı şöyle değiştirelim. static double VeriOku() { Bu aşamada programdaki bütün hataları ayıkladığımızı düşünüp, tekrar derlemeyi denersek şu hata iletisini alacağız: Cannot make a static reference to the non-static field brüt Bu hatayı da ayıklamak için 6. Satırda bildirimi yapılan brüt değişkenini static yapalım: static double brüt; Bu son düzeltmeden sonra programımızda sözdizimi hatası kalmamıştır. Derleyip koşturabiliriz. Vergi03.java package statik; Bölüm 06: Operatörler 3

public class Vergi03 { static double brüt; static double VeriOku() { Scanner scan = new Scanner(System.in); brüt = scan.nextdouble(); scan.close(); return brüt; static double Hesapla() { static void VeriYaz() { VeriYaz(); Çıktı Brüt Geliri giriniz : 12345,678 4938.2712 Yaptığımız hata ayıklama (debug) işlemleriyle, Vergi03.java programını çalışır duruma getirdik. Ancak, bu programda Nesne Yönelimli Programlamanın yeteneklerini hiç kullanmadık. Programdaki bütün değişkenleri ve bütün metotları static yaptık. Bu yöntem büyük projeler için uygun değildir. Bütün değişkenleri ve bütün metotları static yapmak yerine, sınıfa ait bir nesne yaratmak daha uygun olacaktır. Çünkü, yaratılan nesneye ait değişken ve metotların işi bitince, nesne ana bellekten silinir; yeni nesnelere yer açılır. Bu olgu çok sayıda nesne yaratan büyük programlar için önem taşır. Şimdi, değişkenleri ve metotları statik yapmadan programı yeniden yazalım. Sonra, sınıfa ait bir nesne yaratalım. Şimdi de ikinci yöntemi deneyelim. Program03 sınıfından p adlı bir nesne yaratalım. Bunu yapmak için Sınıf_adı nesne_adı = new Sınıf_adı(); nesne yaratıcı (instantiate) deyimini kullanıyoruz. Örneğimizde, nesne_adı p olacaktır. Vergi04.java package statik; public class Vergi04 { double brüt; double VeriOku() { Scanner scan = new Scanner(System.in); 4 t.karaçay : Java ile Nesne Programlama

brüt = scan.nextdouble(); scan.close(); return brüt; double Hesapla() { void VeriYaz() { Vergi04 vergi = new Vergi04(); vergi.veriyaz(); Çıktı ipucu Brüt Geliri giriniz : 12345,678 4938.2712 Anımsayınız, Java uygulama programlarında main() metodunu içeren sınıf adı ile program adı daima aynı olmalıdır. Vergi04.java programı tek sınıftan oluşuyor. Ama büyük programlar çok sayıda sınıftan oluşabilir. Birden çok sınıf olduğunda, onlardan yalnızca birisi main() metodunu içerebilir. main() metodu programın giriş kapısı gibidir; başka yerden programa girilemez. 26.satırdaki Vergi04 vergi = new Vergi04(); deyimi, Vergi04 sınıfına ait vergi adlı bir nesne yaratıyor. Bu deyimdeki new bir anahtar sözcüktür ve daima sınıftan nesne yaratmak için kullanılır. Nesneye vergi yerine istenilen başka bir ad verilebilir. Nesneye verilen ad aynı zamanda nesneyi işaret eden referansın da adıdır. Tabii, verilen adın, yaratılan nesneyi ima eden bir sözcük olması, kaynak programın okunabilirliğini artırır; derleyici için verilen adın önemi yoktur. Vergi04 sınıfındaki VeriOku(), Hesapla(), VeriYaz() metotları ile brüt adlı değişkenin önüne static nitelemesi konulmadığı için, öntanımlı olarak (default) anlık olurlar; yani static değildirler. Dolayısıyla, ancak sınıfa ait bir nesne yaratılınca o nesne içinde ana bellekte kendilerine birer yer ayrılır. Üstlendikleri işlevlerini o nesne içinde yaparlar. Örnekteki nesnenin ana bellekteki adresini işaret eden referansın (işaretçi, pointer) adı vergi dir. vergi adı aynı zamanda yaratılan nesnenin de adıdır. vergi nesnesine ait VeriYaz() metoduna erişmek için vergi.veriyaz(); deyimini kullanıyoruz. Nesne adı ile metot arasındaki nokta (.) simgesi, nesnenin öğelerine erişimi sağlayan operatördür. Nesneye ait değişkenler için de aynı operatör kullanılır. Böyle olduğunu görmek için, sınıfa ait p ve q adlarıyla iki farklı nesne yaratalım ve o nesnelerdeki metotlarımızı farklı verilerle çalıştıralım. p ve q nesnelerinden gelen çıktıların farklı olduğunu görebiliriz. Vergi05.java Bölüm 06: Operatörler 5

public class Vergi05 { double brut; double VeriOku() { Scanner s = new Scanner(System.in); brut = s.nextdouble(); return (brut); double Hesapla() { void VeriYaz() { Demo p = new Demo(); System.out.println("p nesnesi için :"); p.veriyaz(); System.out.println(); Demo q = new Demo(); System.out.println("q nesnesi için :"); q.veriyaz(); Çıktı p nesnesi için : Brüt Geliri giriniz : 12345,678 4938.2712 q nesnesi için : Brüt Geliri giriniz : 98765,4321 39506.17284 Şimdi başka bir durumu deneyelim. Sınıfta bildirimi yapılan metotların hepsini satic yapalım ve sınıftan bir nesne yaratmayı deneyelim. Vergi06.java public class Vergi06 { static double VeriOku() { Scanner s = new Scanner(System.in); return (s.nextdouble()); 6 t.karaçay : Java ile Nesne Programlama

static double Hesapla() { static void VeriYaz() { Vergi06 vrg = new Vergi06(); vrg.veriyaz(); Bu programı derlemek istersek şu uyarı iletisini verecektir: The static method VeriYaz() from the type Vergi06 should be accessed in a static way Ancak program derlenir ve koşar. Bu demektir ki, static metotlara bir nesnenin referansı ile erişilebilir. Çünkü, statik öğelere her nesneden erişilebilir. Ancak bu yöntem, erişilen öğenin anlık olduğu yanılgısına yol açabileceği için, önerilmez. Statik öğelere erişirken, bir nesneye ait referans (pointer) yerine sınıfın adının kullanılması yeğlenmelidir. Örneğin, yukarıdaki programda 23.satır yerine Vergi06.VeriYaz(); deyimini yazarsak, programın derlendiğini ve koştuğunu görebiliriz. Statik metotlar için önerilen deyim budur. Eğer çağrı aynı sınıf içinden yapılıyorsa, sınıf adını yazmaya gerek olmayabilir. Örneğin, yukarıdaki deyim yerine VeriYaz(); deyimini yazsak da program derlenir ve koşar. Ancak, program birden çok sınıf içeriyorsa, farklı bir sınıftaki bir static metodu çağırmak için, öncekinde olduğu gibi sınıf adını belirtmeliyiz. Değilse, derleyici, metodu hangi sınıftan çağıracağını bilemez. Her durumda, static metotları çağırırken, sınıf adlarını öntakı yapmayı alışkanlık edinmek, büyük programlarda oluşabilecek yanılgıları önler ve gerektiğinde programın güncellenmesi kolaylaşır. Statik metotlar için söylediğimiz bu özelikler statik değişkenler için de geçerlidir. Alıştırmalar Şimdi aşağıdaki durumları ayrı ayrı deneyelim: Metotların üçü de anlık ise, 22. ve 23. satırlardaki deyimlerle programın derlenip koşabildiğini gördük. Metotların üçü de static ise, 23.satırdaki deyim aşağıdakilerden birisi olabilir: vrg.veriyaz(); VeriYaz(); Vergi06.VeriYaz(); Bu durumda statik metot nesne içinden çağrılıyor. Bu durumda, aynı sınıftaki statik VeriYaz() metoduna adıyla erişiliyor. VeriYaz() metodu statik Hesapla() metoduna adıyla erişiyor. Sonunda Hesapla() metodu da statik VeriOku() metoduna adıyla erişiyor. Bu durumda, statik VeriYaz() metoduna, sınıf adı öntakı yapılarak erişiliyor. Karışıklığı önlemek için, büyük programlarda statik öğelere erişmek için önerilen sözdizimi budur. VeriYaz() metodu anlık, VeriOku() ve Hesapla() metotları statik ise 22. ve 23. satırlardaki deyimlerle program derlenir ve koşar. Bunun nedeni şudur: Anlık VeriYaz() metoduna vrg referansı ile Bölüm 06: Operatörler 7

erişiliyor. Sonra nesne içinden statik Hesapla() metodu çağrılıyor. En sonunda, statik Hesapla() metodu statik VeriOku() metodunu çağırıyor. Bunlar Java da geçerli eylemlerdir. VeriYaz() ile Hesapla() metotları anlık VeriOku() metodu statik ise 22. ve 23. satırlardaki deyimlerle program derlenir ve koşar. Bunun açıklaması kolaydır. Anlık VeriYaz() metoduna vrg referansı ile erişiliyor. Sonra aynı nesne içindeki anlık Hesapla() metodu çağrılıyor. En sonunda, nesne içinden statik VeriOku() metodunu çağrılıyor. VeriYaz() statik, Hesapla() anlık ise program derlenemez. Çünkü statik metotlar nesne içindeki öğelere erişemezler. O nedenle statik VeriYaz() metodu nesne içindeki anlık Hesapla() metodunu çağıramaz. Aşağıdaki program, farklı sınıftaki statik öğelere adlarıyla erişilemeyeceğini gösteriyor. Demo.java class Vergi { static double VeriOku() { Scanner s = new Scanner(System.in); return (s.nextdouble()); static double Hesapla() { static void VeriYaz() { public class Demo{ VeriYaz(); Bu program için derleyici şu hata iletisini atar: The method VeriYaz() is undefined for the type Demo Bu ileti, Demo sınıfında VeriYaz() metodunun varolmadığını söylüyor. Hatayı ayıklamak (debug) için, derleyiciye VeriYaz() metodunu hangi sınıfta bulacağını söylemeliyiz. Bunu yapmak için, sınıf adını metodun öntakısı yapmak yetecektir; yani 24.satırdaki deyimi şöyle yazmalıyız: Vergi.VeriYaz(); Bunu yapınca programın derlendiğini ve koştuğunu göreceğiz. Şimdi 15.satırdaki VeriYaz() metodunu anlık yapalım. Demo.java class Vergi { 8 t.karaçay : Java ile Nesne Programlama

static double VeriOku() { Scanner s = new Scanner(System.in); return (s.nextdouble()); static double Hesapla() { void VeriYaz() { public class Demo { // Vergi p = new Vergi(); Vergi.VeriYaz(); Bu program derlenemez ve şu hata iletisini atar: Cannot make a static reference to the non-static method VeriYaz() from the type Vergi Bu ileti, farklı bir sınıftaki anlık metoda erişilemediğini söylüyor. Hatayı ayıklamak için, ya VeriYaz() metodunu statik yapacağız ya da VeriYaz() metodunu içeren sınıfa ait bir nesne yaratacak ve VeriYaz() metoduna referans ile erişeceğiz. Birinci yöntemi, yani metodu statik yapmayı önceden denedik ve çalıştığını gördük. Şimdi VeriYaz() metodunu içeren Vergi sınıfına ait bir nesne yaratalım. Bunun için 23. ve 24. satırlardaki deyimleri şöyle değiştirelim: Vergi vergi = new Vergi(); vergi.veriyaz(); Bu deyimlerle programın derlendiğini ve koştuğunu görebiliriz. Şimdi de static metotları çağırırken metot adlarının önüne this anahtar sözcüğünün konamayacağını görelim. Bunun için 23.satırdaki deyim yerine this.veriyaz(); deyimini yazalım. Derleyicinin şu hata uyarısını attığını göreceğiz: Cannot use this in a static context Özet Buraya kadar yaptıklarımızı özetlersek şu kurallar ortaya çıkar: 1. Anlık metot, anlık değişkenlere ve anlık metotlara referanslarıyla erişebilir. 2. Anlık metot, aynı sınıftaki statik değişkenlere ve statik metotlara adlarıyla erişebilir. 3. Anlık metot, farklı sınıftaki statik değişkenlere ve statik metotlara, sınıf adlarını öntakı yaparak erişebilir. 4. Aynı sınıf içindeki statik değişkenlere ve statik metotlara adlarıyla erişilebilir. 5. Farklı sınıf içindeki statik değişkenlere ve statik metotlara, ait oldukları sınıf adları öntakı yapılarak erişebilir. Bu durumda sınıf adı işaretçinin görevini üstlenir. 6. Nesne içinden, aynı sınıfa ait statik değişkenlere ve statik metotlara adlarıyla erişilebilir. Bölüm 06: Operatörler 9

7. Nesne içinden, farklı sınıfa ait statik değişkenlere ve statik metotlara, ait oldukları sınıf adları öntakı yapılarak erişebilir. Bu durumda sınıf adı işaretçinin görevini üstlenir. 8. Statik metot, aynı sınıftaki statik değişkenlere ve statik metotlara adlarıyla erişebilir. 9. Statik metot, farklı sınıftaki statik değişkenlere ve statik metotlara, sınıf adlarını öntakı yaparak erişebilir. 10. Statik metot, anlık değişkenlere ve anlık metotlara adlarıyla erişemez; ancak referans (pointer) kullanarak erişebilir. 11. Statik metot, this anahtar sözcüğünü kullanamaz; çünkü this için işaret edilecek bir nesne yoktur. 10 t.karaçay : Java ile Nesne Programlama