java ders notları

advertisement
JAVA DERS NOTLARI
Yrd.Doç.Dr. Nurşen TOPÇUBAŞI
Java Dilinde İfadeler ve İşlem
Operatörleri
Yazdığınız program bir veri üzerinde işlem
görecekse, öncelikle o verilerin tanımlanması
gerekir. Bu tanımlanma bilgisayarın o verileri
nasıl ve hangi şekilde kullanacağının önceden
belirlenmesi olarak da nitelendirilebilir.
Java da Veri Tipleri, Değişkenler, Tip
Dönüşümleri
Veri tipleri bütün programlama dillerinde geçerli
özelliklere sahiptir. Veri tiplerini değişkenleri tanımlarken
mutlaka kullanmamız gerekir.
• İlkel(Primitif) veri tipleri
• Referans tipler
• Null Veri tipi
Ama Java gibi nesne yönelimli programlama
dillerinde veri tiplerinin hepsi bir sınıftır ancak çok sık
kullanıldıkları için Java bazı veri tiplerine ayrıcalık
tanımıştır bu türden veri tiplerine ilkel (primitif) veri
tipleri denir. Java dili bu veri tiplerini nesneler
yaratmadan kullanmamıza izin verir.
İlkel (Primitif) Veri Tipleri
•
•
•
•
Tam Sayılar için: long, int, short, byte
Ondalıklı Sayılar: double, float
Mantıksal Sınamalar: boolean
Karakter: char
ÖRNEK: package sayi1;
public class sayi1ornek
Referans Tipler
İlkel veri tiplerinden bahsettik şimdi de onların
gömüldüğü sınıflardan bahsedeceğiz. Bunlar: Byte,
Short, Integer, Double, Character, Float, Double,
Boolean sınıflarıdır.
Yukarıda bahsi geçen int bir primitif veri tipdir,
Integer ise bir nesnedir.
Integer gibi sınıflar immutable (değişmez)
özelliğe
sahiptirler,
sıradan
nesneler
gibi
davranmazlar.
Bu verilen örnekler (byte-Byte), (short-Short), (floatFloat), (double-Double), (char-Character), (booleanBoolean) için de geçerlidir.
int Türü İfadeler
int türünde tamsayı sabit ya da değişken içeren ifadeler,
sonuçta tamsayı (int) değer üretecektir. Örneğin,
int a,b,c; a=9; b=12; c=13;
şeklindeki atamalar ile,​
a + b / c ifadesi, 9+12/13=9+0=9
olarak hesaplanacaktır.
b – c % a + ‘x’ – 3 + (int) 8.7 ifadesi ise
12 –13%9+120 –3+8
12 – 4 + 120 –3+8=133
• aşamalarından geçerek 133 olarak hesaplanır. ’x’ karakter
sabiti yerine onun ASCII kodu olan 120 değeri alınır. 13%9
ifadesi ise 13’ün 9 ile bölümünden elde edilecek olan kalanı
hesaplanır. (int) 8.7 ifadesi ise 8.7 ondalık sayısını int türüne
yani 8’e dönüştürür. Aşağıdaki program bu hesaplamaları
gerçekleştiriyor: package uygulama; public class uyg2 {
float Türündeki İfadeler
Programlamada özellikle hesaplama aşamasındayken,
sadece tamsayılar üzerinden gidilmez. Rasyonel sayıları
kullanmak istediğinizde, Java dilinde float ve double türündeki
değişkenler ile rasyonel sayıları tutabilirsiniz.
Float ve double türünden değişkenlerin adını kayan
noktalı (floating point) değişkenler olarak da duyabilirsiniz.
Buradaki nokta kısmı, tam sayı kısmı ile ondalıklı sayı kısmını
bölen virgül oluyor. Float ve double türlerinin arasındaki fark,
virgülden sonraki ondalık kısımda tutabildikleri hane sayısıdır.
Bu yüzden bir float değişken sanal bellekte 32 bitlik yer
tutarken, double türündeki bir değişken 64 bit yer tutacaktır.
Kayan noktalı bir tip yerine tamsayı tipini
kullandığınızda;
package float;
public class FloatDeneme1
public class FloatDeneme2
Tip Dönüşümleri (Type-Casting)
int’i String’e dönüştürme işlemi
int sayi= 77 ;
String donusenKelime = String.valueOf(sayi) ;
System.out.println("Dönüşen Kelime: "+donusenKelime);
String’i int’e dönüştürme
String ifade = "17" ;
int donusenSayi = Integer.valueOf(ifade) ;
System.out.println("Dönüşen sayı: "+donusenSayi);
String’i byte,short,long,double ve float’a dönüştürme işlemleri
String’i byte,short,long,double ve float’a dönüştürme işlemleri
package don2;
public class donusturme2 {
Byte, short, long, double ve float’ı String’e dönüştürme işlemleri
package donusturme;
public class donusturme1 {
Tablo T.1-Tekli Operatörler
operatör
Sembo kullan
işlem sonucu
-lü
lışı
tekli negatif
–
alma
son artım
ön artım
son azaltım
ön azaltım
++
++
––
––
–a
a’nın negatifini alır
a++
önce a’nın değerini al, kullan, sonra 1
artır.
++a
önce a’nın değerini 1 artır, sonra
kullan.
a––
önce a’nın değerini al, kullan, sonra 1
son azaltım azalt.
––a
önce a’nın değerini 1 azalt, sonra
kullan.
package uygulama;
public class uyg5 {
public class uyg6 {
public class uyg7 {
public class uyg8 {
İkili Aritmetiksel Operatörler
Operatör Sembolü Kullanılışı
İşlem Sonucu
çarpma
*
a*b
a ile b’nin çarpımı
bölme
/
a/b
a’nın b’ye bölümü
kalan
%
a%b
a’nın b’ye bölümünden kalan
toplama
+
a+b
a’nın b ile toplanması
çıkarma
–
a-b
b’nin a’dan çıkarılması
*, / ve % operatörleri, + ve –'ye göre önceliklidir. *, /, + ve –
operatörlerinin int veya float (double) türde operand kabul
etmelerine karşılık kalan operandları sadece int türde
operand olarak kabul eder. % operandı bölmede kalanı
hesaplar.
package uygulama; public class uyg9{
Aritmetiksel Atama Operatörleri
Operatör
Sembolü Kullanılışı İşlem Sonucu
Atama
=
x=y
y’nin değerini x’e ata
Topla-ata
+=
x+=y
x + y’nin değerini x’e ata
Çıkar-ata
–=
x–=y
x – y’nin değerini x’e ata
Çarp-ata
*=
x*=y
x * y’nin değerini x’e ata
Böl-ata
/=
x/=y
x / y’nin değerini x’e ata
Kalanını ata
%=
x%=y
x % y’nin değerini x’e ata
package uygulama;
public class uyg10 {
public class Uyg10{
public static void main(String[ ] args){
int k;
double l;
l = k =13.72;
System.out.println("l="+l);
System.out.println("k="+k);
}
}
ÖRNEK PROGRAMIN ÇIKTISI
x + = y ifadesi x = x + y ifadesine, x % = y ifadesi de x = x % y
ifadesine denktir. = operatörünün atama amacı ile kullanıldığını biliyoruz.
Sembolün sol tarafındaki operand bir sol taraf operandı (left hand
operand, Lvalue) olmalıdır. Sol taraftaki operand (değişken, dizi elemanı,
yapı elemanı vb.) sağ taraftaki operandın değerini bellekte saklar.
ÖRNEK:
• int k; double l; l = k = 13.72;
Yukardaki komutlar ile (=) sembolünün birleşme özelliği sağdan
sola olduğu için,
• ( l = (k = 13.72));
sırasıyla atamalar yapılacaktır. Java hassasiyetin kaybolmasına izin
vermeyeceği için k=13.72 atamasında,
• “possible loss of precision” veya Eclipse'te "cannot convert from
double to int"
• şeklinde bir hata mesajı verilecektir. Java’da sadece programcının açıkça
cast ifadeleri ile,
• (int) 13.72
• gibi, hassasiyetin kaybolmasına özellikle izin verdiğini belirtmesi halinde
bu tür atamalar yapılır.
ÖRNEK PROGRAM: CAST İFADESİNİN KULLANIMI
package uygulama;
public class uyg10 {
public static void main(String[ ] args){
int k;
double l;
l = k =(int)13.72;
System.out.println("l="+l);
System.out.println("k="+k);
}
}
Java’da Operatör Kavramı ve Kullanımı
• Unary Operator:
Operand Operator
örnek: ( ++degisken ), ( --degisken), ( degisken++),( degisken--)
• Binary Operator:
Atama operatörü; iki değişken alır ve sağdaki işleneni soldaki
işlenene atar.
• (+) , (-), (/), (*), (%) gibi aritmetik operatörler de binary
operatörlerdir.
• Ternary operator:
“?:” 3 tane işlem alan tek operatördür. if ile yapılanları tek
satırda yapar.
int x = 6, y = 4;
int max = (int) ((x <= y) ? y : x); /*koşullu olasılık gibi çalışır
X değeri y değerinden küçük ve eşit ise y değerini yazar,
değilse x değerini yazar. */
Örnekler
•
•
•
•
package aritmetik;
public class art1 {
public class art2 {
public class art3 {
İlişkisel Operatörler:
<, >, >=, <=, ==, !=
• public class art4 {
Mantıksal (Logic) Operatörler:
package aritmetik;
public class art5 {
public class art6 {
System.out.println() metodu
Bu metod java tarafından tanınan ve daha
önce yazılmış bir metoddur. Bu metodu kullanırken
parantezler içerisine yazılan (parametre olarak
yazılan) degisken ve sabitler ekranda görüntülenir.
Eğer parantez içerisine bir değişken yazılmış ise bu
değişkenin içerisindeki değer ekrana yazılacaktır.
Ayrıca + operatörü yardımıyla parantez içerisine
birden fazla tür yanyana yazılabilir. Örneğin:
package degisken;
public class Degiskenler {
Özel Karakterler _liskin Bir Not:
C ve C++ programla dillerinde de olduğu gibi Java'da
klavyeden girilen bir takım özel karakterlerin karşılığı vardır.
Bu özel karakterler bip sesi, enter tuşu, alt satır bası, tab
tuşu gibi karakterlerdir. Bu karakterler kullanılırken
başlarına \ işareti koyulur ve uygun sembol yerleştirilir.
Buna göre:
• \n : alt satır basına
• \t : tab tuşu
• \\ : \ işareti
• \” : “ işareti
• \b : backspace (bir önceki karakteri silme)
• \r : kendisinden önce gelen tüm karakterleri satır basına
kadar silme
• anlamına gelmektedir.
Java: printf() Metodu İle Çıktıyı Biçimleme
Java’da String formatlamayı printf() metodu ile
yapabiliyoruz. printf() kullanımında sözdizimi şöyledir:
• System.out.printf(format, argümanlar);
Format deyimi, çıktının biçemini belirleyen nakıştır
(pattern). printf() metodunda Nakışı Belirleyen Sözdizimi:
• printf(%[argument_index$][flags][width][.precision]conversion
)
() içindeki terimlerin anlamları şöyledir:
• % Dönüşümü başlatan simge
• [] Bu parantezlerin içleri isteğe bağlıdır. Gerekli ise yazılır.
• argument_index$ Değişken_damgası, değişken değeri için yer
tutucu; değişkenin çıktıda nereye konuşlanacağını belirtir.
• Flags Bayraklar: - , ^ , 0 , #
• conversion : d,o,x,f,g,a,c,s,b,h,n harfleri dönüşümün ne
olacağını belirler. Dönüşümlerin tanımları aşağıdaki listede
verilmiştir.
argument_index: "1$" ilk değişkene yer tutar
"2$" ikinci değişkene yer tutar
'<' önceki formatın kullanılacağını belirtir.
flags: '-' left-justified (sola dayalı yaz)
'^' and uppercase (Büyük harfle yaz)
'+' output a sign for numerical values. (pozitif/negatif
işareti koy)
'0' forces numerical values to be zero-padded. (nakışın
hanelerini doldur)
Width
: (genişlik) Çıktının kaç kolona yazılacağını
belirler.
Precision: (duyarlık) Kesir hanelerinin sayısını belirler.
typechar dönüşüm tipini belirleyen karekterdir.
Örnekler:
System.out.printf(“%d”, 123.6) nın çıktısı 124 tür. d dönüştürücüsü
sayıyı decimal tamsayıya dönüştürür.
System.out.printf(“%f”,1234567.123) ün çıktısı 1234567,123000 dır. f
dönüştürücüsü sayıyı kesirli sayıya dönüştürür. Aksi istenmezse, kesir
hanelerinin öntanımlı (dafault) sayısı 6 dır.
int c = 65;
out.printf(«cikti: [%2x] : %3d : %1c\n", c, c, c );
deyiminin çıktısı şudur:
// prints : cikti:_[41]_:__65_:_A
Bu deyimi ve çıktıyı irdeleyelim:
// %2x ilk değişken için 2 harf genişliğinde yer tutar; hex olarak yazar
// %3d sonraki değişken için 3 harf genişliğinde yer tutar; decimal
olarak yazar
// %1c sonraki değişkene 1 harf genişliğinde yer tutar; Unicode olarak
yazar
// Geri kalanların hepsi [] dahil dekoratiftir
Tip dönüştürme karekterleri 'd': decimal
integer
'o': octal integer
'x': hexadecimal integer
'f': decimal notation for float
'g': scientific notation (with an exponent) for
float
'a': hexadecimal with an exponent for float
'c': for a character
's': for a string.
'b': for a boolean value, so its output is
"true" or "false".
'h': output the hashcode of the argument in
hexadecimal form.
'n': "%n" has the same effect as "\n".
(10 tabanlı tamsayı)
(8 tabanlı tamsayı)
(16 tabanlı tamsayı)
(kesirli sayı göster)
(kesirli sayıyı üstel göster)
(16 tabanlı sayıyı üstel göster)
(karekter göster)
(stringe dönüştür)
(mantıksal değere dönüştür)
((hash kodunu hex olarak
göster)
(satırbaşı yap)
Örnekler
package printf;
public class Jprintf01 {
public class Jprintf02 {
public class Jprintf03 {
public class Jprintf04 {
public class Jprintf05 {
public class Jprintf06 {
public class Jprintf07 {
public class Jprintf08 {
SCANNER SINIFI
VE KLAVYEDEN VERİ OKUNMASI
Java Kütüphaneleri
• Java’da kütüphaneler paket olarak adlandırılır
– Paket belirli bir mantıksal çerçeveye göre biaraya getirilmiş
sınıflardan oluşur ve bu sınıflara erişim kolaylığı sağlar.
– Herhangi sınıfı kullanabilmek için o sınıfın ait olduğu paketi
import kullanarak ithal etmek gerekir.
– java.lang paketi içerisindeki sınıflar otomatik olarak
import edilirler
import java.util.Scanner;
// sadece Scanner sınıfını import eder
import java.util.*;
// java.util paketindeki bütün sınıfları import
eder
– (*) kullanmak yerine belirli bir sınıfı import etmek daha doğrudur.
Scanner Sınıfı ile Konsol Girişi
• Scanner kullanıcıdan veya başka kaynaklardan
giriş almak için kullanılır.
• Scanner java.util paketi içinde olduğundan
kullanabilmek için bu paketi import etmek
gerekir

import java.util.Scanner
• Bu komut Java’ya
– Scanner sınıfını kullanıma hazır hale getirmesini
– Scanner sınıfını java.util paketinde bulmasını
anlatır
Scanner nesnesi
• Scanner nesnesi farklı kurucu metodlar kullanılarak
oluşturulabilir:
– Scanner(File kaynakDosya)
Belirtilen kaynak dosyadan değerleri
okuyabilecek bir Scanner nesnesi oluşturur.
– Scanner(InputStream kaynak)
– Scanner(Readable source)
– Scanner(String kaynakString)
Belirtilen Stringden değerleri okuyabilecek bir
Scanner nesnesi oluşturur.
Scanner sınıfı ile kullanıcı girişi
• Scanner kullanarak klavyeden giriş almak için
System.in InputStream kaynağı kullanılır
• System.in değişkeni:
– Standart input stream – klavye
• Scanner Sınıfı ile kullanımı
Scanner klavye = new Scanner (System.in);
Klavyeden giriş
• nextInt metodu klavyeden bir adet int değer
okumak ve bir değişkene atamak için kullanılır :
int ogrenciSayısı = klavye.nextInt();
• nextDouble metodu klavyeden bir adet double
değer okumak ve bir değişkene atamak için kullanılır
double maas = klavye.nextDouble();
• Birden fazla giriş için girilen değerler boşluklarla
ayrılmalı ve uygun metod kullanılarak okunmalıdır:
– Boşluk karakteri olarak boşluk, tab, yeni satır karakterleri
kullanılabilir
Scanner ile String okuma
• next metodu boşluklarla ayrılmış karakterleri okumak
ve String değişkenlerine atamak için kullanılır:
• Aşağıdaki komutlar
String kelime1 = klavye.next();
String kelime2 = klavye.next();
giriş olarak
Kuru fasulye
verilince,
kelime1 değişkenine Kuru,
kelime2 değişkenine fasulye,
değerlerini atar
Scanner ile Satır okuma
• nextLine metodu klavyeden girilen satırın tamamını
okur
String satir = keyboard.nextLine();
komutu satırı girilen satırın tamamını satir
değişkenine atar
• Satırın sonu '\n' karakterleri ile belirtilir
– Bu karakterler Enter tuşuna basılınca okunur
– Ekranda üst satırdan alt satıra geçilerek gösterilir
• nextLine komutu bir satır okuyunca '\n' karakterini
de okur, dolayısıyla bir sonraki giriş sonraki satırdan
başlar
– Ancak, '\n' karakteri atanan String değerinin parçası olarak
algılanmaz (yani t satır değişkenine atanan değer '\n'
karakteri ile sona ermez)
Package mathfonk;
public class Matematik {
Scanner metodları
public Scanner(InputStream in)
public Scanner(String s)
// Scanner(): constructor for reading from
a InputStream
// Scanner(): constructor to read from a
file object
// Scanner(): constructor to scan from a string
public int nextInt()
public short nextShort()
public long nextLong()
public double nextDouble()
public float nextFloat()
public String next()
public String nextLine()
public boolean hasNext()
// nextInt(): next input value as an int
// nextShort(): next input value as a short
// nextLong(): next input value as a long
// nextDouble(): next next input value as a double
// nextFloat(): next next input value as a float
// next(): get next whitespace-free string
// nextLine(): return contents of input line buffer
// hasNext(): is there a value to next
public Scanner(File f)
equals() Kullanımı:
Java’da stringleri karşılaştırmak için kullanılan
metottur.
isim1.equals(isim2);
şeklinde kullanılır.
‘= =’ karsılaştırma ifadeleri kullanırsak
iki nesnenin ayni olup olmadığına bakar. Bizim
burada equals() ile yaptığımız ise iki String
nesnesinin aldığı değerlerin karşılaştırılmasıdır.
package equals;
public class JavaEqualsKullanımı {
Java'da String Metodları
String sınıfı Java'da metinler tanımlamak için kullanılır ve
bize metinler üzerinde çeşitli işlemler gerçekleştirmemiz
için yardımcı fonksiyonlar sunar. Java'da bir metin
aşağıdaki gibi tanımlanabilir:
• package stringornek;
• public class stringornek1 {
Bu şekilde myString adında bir değişkene "Merhaba
dunya" yazısını atamış oluyoruz.
• Bu metinin uzunluğunu (karakter sayısını) merak
edersek length metodunu çağırmamız gerekir:
• package stringornek;
• public class stringornek2 {
Böylece tanımlanan değişkende kaç karakter olduğunu
konsola yazdırmış olduk.
Şimdi ise konsola sadece "dünya" kelimesinin
yazılmasını sağlayalım:
• package stringornek;
• public class stringornek3 {
Eğer elimizdeki "Merhaba dunya" metnini bir dizi olarak düşünürsek
harflerin dizinleri (index) aşağıdaki şekilde olacaktır:
m
e
r
h
a
b
a
d
ü
n
y
a
0
1
2
3
4
5
6
7
8
10
11
12
Sadece "dunya" kelimesini yazdırmamız için 8. karakterden başlayarak
son karaktere kadar olan bölümü almamız gerekir. substring metodu
başlangıç ve bitiş dizinleri arasında kalan karakterleri bir String olarak
döndürür:
"Merhaba" kelimesi ise aşağıdaki şekilde görüntülenir:
• package stringornek;
• public class stringornek4 {
Bir harfin ya da String değerinin kaçıncı dizinden
(index) itibaren başladığını merak ediyorsanız,
indexOf metodunu kullanabilirsiniz. Örneğin
"dunya" kelimesinin kaçıncı dizinde olduğunu
öğrenmek için
• package stringornek;
• public class stringornek5 {
NOT: indexOf metodu eğer aranan metni
bulamazsa -1 döndürür. Bu şekilde metinler
içinde arama yapabilirsiniz. (örneğin
“ahmet.mail.com”.indexOf(“@”) == -1 ise eposta
adresi yanlış girilmiştir gibi)
Bir metni başka bir metinle karşılaştırmak için equals ya da
equalsIgnoreCase metodlarını kullanabilirsiniz.
equalsIgnoreCase metodu, karşılaştırılan metni öncelikle küçük
harflere çevirir ve ardından karşılaştırma yapar.
• package stringornek;
• public class stringornek6 {
Bir metni küçük harflere çevirmek için toLowerCase, büyük harflere
çevirmek içinse toUpperCase metodlarını kullanabilirsiniz:
• package stringornek;
• public class stringornek7 {
Bir metin içerisindeki boşluklardan kurtulmak için trim metodu
kullanılır. trim metodu, metnin sonunda ve başında yer alan
boşlukları yok ederken kelime aralarındaki boşluklara dokunmaz.
• package stringornek;
• public class stringornek8 {
Bir metni parçalara bölmek için (örneğin boşluklara göre
ayırıp
kelimeleri
ayıklama)
split
metodu
kullanılır. split metodu regex bir ifade içerisindeki kurallara
göre String değişkenini böler ve bir String[] dizisi haline getirir.
• package stringornek;
• public class stringornek9 {
Yukarıdaki örnekte "Merhaba dunya" metni boşluklara göre
parçalanmış ve dizinin içerisinde "Merhaba" ve "dunya"
değerini taşıyan iki adet String oluşturulmuştur. Bir metin
değerini İnternet bağlantısı ya da başka bir akış (Stream)
üzerinden yollamak istersek byte[] değerine çevirmemiz
gerekebilir. Bir String içerisindeki her harfin byte değerini
hesaplayıp
String'i
byte
dizisine
çeviren
metod getBytes metodudur.
• package stringornek;
• public class stringornek10 {
String Metotlarıyla İlgili Örnek Java Programları
Örnek 1: equals
• package stringuyg; public class stringuyg1 {
AÇIKLAMA: Yukardaki programda bulunan 3 adet if’ten ilki ve üçüncüsü
doğru, ikincisi ise yanlış olacaktır. Bu nedenle 2 mesaj alınır.
Örnek 2: length
• package stringuyg;
public class stringuyg2 {
AÇIKLAMA: Bu program verilen bir String'i karakterlerine parçalayarak
her karakteri bir satıra yazdırmaktadır. String'in uzunluğunu (kaç
karakterden oluştuğunu) bulmak için length metodu kullanılır.
ÖRNEK 3: compareTo fonksiyonu
• package stringuyg; public class stringuyg3 {
• AÇIKLAMA: Melisa sözcüğü alfabetik ortamda Zehra'dan önce gelir ve
dolayısıyla daha küçük kabul edilir; bu nedenle i’nin sayısal değeri
negatif bir tam sayı olarak atanmıştır.
ÖRNEK 4: compareTo fonksiyonu
• package stringuyg;
• public class stringuyg4 {
AÇIKLAMA: Melisa alfabetik olarak Ayse'den önce gelmediği için
i’nin değeri pozitif bir sayı olarak çıkmıştır.
ÖRNEK 5: indexOf fonksiyonu
• package stringuyg;
• public class stringuyg5 {
AÇIKLAMA: Programda, st1 String'i içindeki anadolu karakter
dizisinin her harfi ve bu harfin karakter dizisi içindeki indisi birer
satıra yazdırılmıştır.
ÖRNEK 6: getChars fonksiyonu
• package stringuyg;
• public class stringuyg6 {
AÇIKLAMA: anadolu String'inin, indisi 3 olan d karakterinden,
indisi 7-1=6 olan karakterine (u) kadar olan kısmı karDiz adlı diziye
kopyalanmıştır. karDiz adlı dizinin içeriği “dolu” olarak atanmıştır.
ÖRNEK 7: startsWith ve endsWith fonksiyonları
• package stringuyg;
• public class stringuyg7 {
AÇIKLAMA: Elemanları "ankara", "antalya",
"burdur", "bursa", "anadolu" olan st1 adlı String
dizisi oluşturulmuş, bu dizinin elemanları arasında
“an” ile başlayanlar, ”a” ile bitenler ve 2 ile 3
indisli karakterleri “ka” olanlar listelenmiştir.
Java'da Tarih İşlemleri
Java’da tarih ile ilgili işlem yapmak için Date sınıfında faydalanırız.
Date sınıfı belirli bir zaman değerini bir değişkene atamamızı ve
üzerinde ekleme, çıkarma ya da dönüştürme gibi işlemler
yapmamızı sağlar. Date sınıfını new Date() yapıcısıyla
oluşturduğumuzda o anın tarihine ve saatine (kodun çalıştığı
bilgisayarın saati) sahip bir zaman değişkenine sahip oluruz.
• package date;
• import java.util.Date;
• public class dateornek1 {
Bir zamanın, UNIX Timestamp değerini öğrenmek için
getTime metodunu kullanabilirsiniz.
• package date;
• import java.util.Date;
• public class dateornek2 {
NOT: UNIX Timestamp, 1 Ocak 1970 00:00 tarihinden bu yana geçen
zamanın milisaniye cinsinden değeridir.
Eğer tarihi farklı bir şekilde ekrana yazmanız gerekirse,
SimpleDateFormat sınıfından yardım alabilirsiniz. Bir Date
değişkenini son kullanıcının anlayabileceği bir formatta yazdırmak
için kullanılan SimpleDateFormat, aynı zamanda kullanıcının elle
girdiği bir tarihi Date değişkenine çevirebilir. Aşağıdaki örnekte
zaman bilgisi, tarih yıl - ay - gün olarak yazdırılıyor.
• package date;
• public class dateornek3 {
Eğer yine aynı formatta bir tarihi (örneğin 1984/01/01) Date
tipinde bir değişkene atamak isterseniz parse metodundan
faydalanabilirsiniz. Bu metod verilen bir String tarih değerini Date
tipine çevirecektir. Eğer çevirme işlemi başarısız olursa
ParseException fırlatılır.
• package date;
• public class dateornek4 {
• DateFormatter ile kullanabileceğiniz diğer tanımlar aşağıdaki
şekildedir:
Harf
Temsil ettiği parça
Örnek
y
Yıl
1996; 96
M
Yıl içinde ay
July; Jul; 07
w
Yıl içinde hafta
27
W
Ay içinde hafta
2
D
Yıl içinde gün
189
d
Ay içinde gün
10
F
Ay içinde haftanın günü
2
E
Haftanın günü
Tuesday; Tue
a
Sabah/akşam
PM
H
Gün içinde saat (0-23)
0
k
Gün içinde saat (1-24)
24
K
Sabah/akşam için saat (0-11)
0
h
Sabah/akşam için saat (1-12)
12
m
Saat içinde dakika
30
s
Dakika içinde saniye
55
S
Milisaniye
978
Tarih içerisinde belli bir günü bir değişkene
atamak için Java bizlere Calendar adında bir sınıf
sunar. Bu sınıf sayesinde tarih akışı içinde
herhangi bir güne ulaşabiliriz.
Aşağıda 1 Ocak 1984 tarihini temsil eden bir
değişken tanımlaması yapılmıştır.
• package date;
• import java.util.Calendar;
• import java.util.Date;
• import java.util.GregorianCalendar;
• public class dateornek5 {
Java'da Kontrol Yapıları
Diğer programlama dillerinde olduğu gibi Java'da da
kontrol yapıları dilin en önemli parçasını oluşturur. Bu
bölüme kadar verilen programlar bir bakıma düz hat
programları olarak görülebilir. Bir bilgisayar programında
komutlar normal olarak yazılış sırasına göre çalıştırılır.
Örneğin, herhangi bir programlama dilinde yazılmış olan,
Komut 1
Komut 2
........
Komut n1
Komut n
şeklindeki bir programda, önce Komut 1 sonra Komut 2
daha sonra Komut 3 ... Komut n-1 ve en son da Komut n
çalıştırılır.
Programlama dillerinin gücü, aynı işi tekrar tekrar
yapabilmelerinden ya da farklı parametre değerleri için
değişik işler yapabilmelerinden gelir. Bir bilgisayar
programında programın kontrolünün aradaki komutlar
atlanarak bir komuttan diğerine sıçramasına dallanma
(branching) diyoruz. Diğer programlama dillerinde olduğu
gibi, Java dilinde de esas olarak iki farklı tür kontrol yapısı
ya da komutu mevcuttur:
Seçme (selection) işlemini gerçekleştiren kontrol
komutları: Bu tip kontrol komutlarında bir ifade kontrol
edilerek ifadenin değerine göre çeşitli seçeneklerden bir
tanesinde dallanma işlemi gerçekleştirilir: if, if else,
switch case gibi yapılar bu tür komutları oluşturur.
Tekrarlama (loop, repetition): Bu tip kontrol
yapılarında bir işlemler grubu bir koşula bağlı olarak belirli
sayıda (10 kez, 50 kez vb.) tekrarlı olarak çalıştırılabilir.
if Deyimi
if deyimi, "ifadeyi denetleyerek, ifadenin değerine göre uygun
yollardan bir tanesiyle dallanma işlemini gerçekleştiren" bir kontrol
deyimidir. Bu sayede şartlı dallanma (conditional branching) adı
verilen işlem gerçekleştirilir. Şartlı dallanma, bir programlama dili
için en temel kontrol yapısıdır.
• Java dilinde şartlı dallanma if ve else anahtar sözcükleriyle
gerçekleştirilir. İf deyiminin basit gösterimi şöyledir:
• if (şart) komut 1;
komut 2;
Burada şartın değeri doğru (true) olarak sağlanıyorsa ancak komut
1 çalıştırılır. Daha sonra program normal bir akışla komut 2’yi
çalıştırmaya geçer. Şartın değeri yanlış (false) ise, bu durumda
program doğrudan komut 2’ye geçer ve onunla devam eder.
"else" deyimi sadece if ile birlikte kullanılan bir şartlı dallanma
deyimidir. İkisinin beraber kullanımı şöyle bir yapıda gerçekleşir:
• if (şart) komut 1;
else komut 2;
komut 3;
if (fiyat==1) {
//fiyat 1 ise
çalıştırılacak komutlar
}
else {
//fiyat 1 değilse
çalıştırılacak komutlar
}
if(şart) {
komut 1
komut 2
...
komut n
} else {
komut x
komut y
....
}
komut z
...
Örnek:
package sartlidallanma1;
public class SartliDallanmaOrnek1 {
Örnek:
import java.io.IOException;
import java.util.Scanner;
public class SartliDallanmaOrnek2 {
Problem 2:
Bir satış elemanının sattığı ürün miktarına göre alacağı
günlük ücret aşağıdaki gibi belirleniyor:
Günlük satış miktarı 50 adetten az ise 15 TL tutarındaki
sabit ücrete, satılan ürün başına 1 TL değerinde prim
eklenerek günlük ücret belirlenir.
Günlük satış miktarı 50 adet ya da daha fazla ise, bu
durumda günlük sabit ücret 15 TL alınarak, satılan ürün
başına da ilk 50 adet ürün için 2 TL, 50 adedi aşan kısım
için de 3 TL prim verilerek günlük ücret belirlenir.
Bir satıcının günlük satış miktarı bilgisayara girildiğinde
satıcının alacağı günlük ücreti hesaplayan bir Java
programı yazınız.
• public class Satis {
Problem 3:
Bilgisayara negatif olmayan bir sayı girildiğinde bu
sayının karekökünü hesaplayan, negatif bir
sayı girildiğinde ise kullanıcıyı uyaran bir Java
programı yazalım.
• import java.util.Scanner;
• public class KareKok {
İç içe if Deyimleri
pratikte daha fazla dallanmaya ihtiyaç duyan uygulamalar yapmanız
gerekir. Birinci karardan sonra ikinci, ikinciden sonra üçüncü kararın
(dallanmanın) alınması gerekebilir. Bu şekilde giden bir program
akışı için iç içe if deyimleri (nested if statements) kullanmalısınız.
Örneğin şöyle kullanabilirsiniz:
if (koşul) {
//koşul 1'in komutları
//if (koşul1a) {
//koşul 1a'nın komutları
//...
}
}
İlk şartlı dallanmanın içinde tekrar bir şartlı dallanma yapmak
gerektiğinde, iç içe if kullanabilirsiniz. Bunun kullanımına ilişkin şu
örneğe göz atınız:
public class IcIceIfDeyimi1 {
NOT: İç içe if kullanırken dikkat etmemiz gereken şey,
koşulları yazarken programın adım adım bunları
denetleyeceğini dikkate almamız gerektiğidir. En dıştaki
veya en üstteki şart, ondan sonra gelenlerle çelişmemelidir.
Yukarıdaki if deyimlerini daha kısa olacak şekilde şöyle de
yazabiliriz:
public class IcIceIfDeyimi1 {
Bu şekilde bir yazım genelde if'ten sonraki komut/deyim
tek satırlık olacaksa kullanışlıdır. Şimdi biraz daha gerçek bir
iç içe if deyimi örneği üzerinde duralım. Bu örnekte
kullanıcıdan 3 tane sayı girmesini istiyoruz ve bu 3 sayıdan
en küçüğünü bulup ekrana basıyoruz.
import java.io.IOException;
import java.util.Scanner;
public class IcIceIfDeyimi2 {
• if-else-if Basamak Yapısı
• Birbirini izleyen çok sayıda koşul kontrolünü
gerçekleştirmeye yarayan bir yapı if-else-if
basamağı adını alır ve yazılış biçimi aşağıdaki
gibidir:
if(ifade1) Deyim1;
else if (ifade2) Deyim2;
else if (ifade3) Deyim3;........
else Deyim_n;
Deyim_n+1;
Örnek Problem:
Bu örnekte basit bir vergi hesabı programı geliştirmek
istiyoruz. Gelir vergisinin aşağıdaki kurallara göre
belirlendiğini varsayalım:
• Gelir ≤ 150,000,000 ise vergi oranı %25
Gelir ≤ 300,000,000 ise vergi oranı %30
Gelir ≤ 600,000,000 ise vergi oranı %35
Gelir ≤ 1,200,000,000 ise vergi oranı %40
Gelir > 1,200,000,000 ise vergi oranı %50
Bu problemi Java dilinde programlayabilmek için
aşağıdaki basit algoritmayı uygulayacağız:
Gelir bilgisi klavyeden girilecek.
Gelir bilgisi, yukardaki vergi hesaplama kurallarına göre
kontrol edilerek vergi hesaplanacak.
Hesaplanan vergi ekrana yazdırılacak.
import java.util.Scanner;
public class Vergi {
Soru İşareti Operatörü
if / else deyimi yerine kullanılabilecek bir seçenek de ? üçlü operatörüdür.
? operatörü ile kontrol yapısının yazılış biçimi aşağıdaki gibidir:
• İfade1 ? İfade2:İfade3;
Çalışma biçimi şu şekildedir: İfade1 hesaplanır. İfade1’in değeri doğru
(true) ise bu durumda ifade2 hesaplanır ve bir sonraki deyime geçilir.
İfade1’in değeri yanlış (false) ise, ifade3 hesaplanır ve bir sonraki deyime
geçilir. ? operatörü ile oluşturulan yukardaki kalıp,
• if(ifade1) ifade2
else ifade3;
yapısına denktir. ? operatörü, ifade1’in doğru ya da yanlış olması
durumunda sadece bir deyimin çalıştırılacağı durumlar için if / else yapısı
yerine kullanılabilir. İfade2 ve ifade3 yerinde fonksiyonlar da bulunabilir.
import java.io.IOException;
import java.util.Scanner;
public class Soru {
switch / case Yapısı
switch deyimi, tek bir ifadenin değerine göre sınırsız sayıda
çalıştırma yolu belirlemeyi sağlayan bir komuttur.
• switch sözcüğünden hemen sonra gelen ifade
parantez içinde yer almalı ve bir tamsayı ifade olmalıdır.
• case anahtar sözcüklerini izleyen ifadeler tamsayı sabit
türünde ifadeler olmalıdır, yani değişken içermemelidir.
switch deyiminin çalışma prensibi basittir. switch ifadesi
hangi case’i izleyen sabitle çakışıyorsa, programın kontrolü o
case’i izleyen kısma geçer. Bu case’den sonraki deyimler de
kontrol edilmeden çalıştırılır.
case sabitlerinden hiçbiri ifade ile uyuşmuyorsa, programın
akışı default‘u izleyen kısma geçer. (Bu kısım mevcutsa)
default‘un en sonda olması şart değildir. Fakat en sona
koymak iyi bir programlama stilidir.
İki case sabiti aynı değeri alamaz.
Switch/case yapısında, programın kontrolünün ifadenin
değerine göre case seçeneklerinden sadece birini çalıştırıp
bundan sonra switch/case yapısını terketmesini
isiyorsak bu durumda her case seçeneğinden sonra break
komutu yerleştirmeliyiz.
C DİLİ: Switch/case yapısında, programın kontrolünün
ifadenin değerine göre case seçeneklerinden sadece birini
çalıştırıp bundan sonra switch/case yapısını terketmesini
istiyorsak bu durumda her case seçeneğinden sonra break
komutu yerleştirmeliyiz.
C# DİLİ: Her case’den sonra break kullanmamız gerekir.
Örnek Program:
import java.util.Scanner;
public class Cases {
switch / case yapısıyla ilgili örnek:
Bir turizm şirketi farklı tur çeşitlerinden oluşan bir liste sunuyor.
Kullanıcı bu listeden ilgilendiği bir turu seçtiğinde, o turla ilişkili
ayrıntılı bilgiye ulaşıyor. Burada aşağıdaki basit algoritmayı
uygulayacağız
1.Tur seçenekleri ekrana yazdırılır.
2.Kullanıcıdan bu tur seçeneklerinden bir tanesini seçmesi
istenir.
3.Kullanıcının seçimine uygun olan tur hakkındaki bilgiler
ekrana yazdırılır.
public class Cases2 {
DÖNGÜLER
Döngüsel işlem veya tekrarlı işlem
(iterasyon, İng. iteration), bilgisayarı aynı işlem
grubunu belirli bir koşul sağlanana kadar tekrar
tekrar yapmak için yönlendirir. Java dilinde
döngü yapısını oluşturmak için while döngüsü,
do-while döngüsü ve for döngüsü kullanılır.
while döngüsü
While döngüsü bir şart sağlanıyor iken sürekli içindeki komutları
çalıştırır. Kelime anlamı olarak "olduğu müddetçe" anlamı çıkar. Yapısı
şöyledir:
• while (koşul) {
• //komut 1
• //komut 2
• //...
• //komutlar}
While döngüsünde koşulun en başta olması ayırt edici bir özelliktir.
Program akışı önce buradaki koşulu mantıksal bir süzgeçten geçirir.
Buna göre eğer koşula yazılan ifade matematiksel olarak true (doğru)
değer döndürüyorsa, süslü parantezlerle çevrili bloktaki komutlar
sırasıyla çalıştırılır. Ancak false (yanlış) değerini döndürüyorsa, bu
komutlar hiçbir zaman çalışmayacaktır. Bu durumda program akışına
döngünün bittiği yerden devam eder.
while döngüsünü kullanarak 10'dan geriye
doğru giden ve bu sırada sayıları ekrana basan
bir Java uygulaması yapılırsa:
public class WhileDongusu1 {
1'den 10'a kadar olan sayıların faktöriyelini
ekrana basan bir Java programı yapılırsa:
public class WhileDongusu2 {
do ... while Döngüsü
while deyiminin önemli bir özelliği, test koşulunun döngünün
başlangıcında olmasıdır. Bunun anlamı, ilk anda koşulun yanlış
olması
halinde,
while
gövdesinin
hiçbir
zaman
çalıştırılmayacağıdır. Ancak gövdeyi hiç olmazsa bir kere
çalıştırmamız gereken durumlar vardır. Bu durumda do...while
deyimini kullanmalıyız.
do..while döngü yapısının yazılışı şu şekildedir:
do {
Deyim1;
Deyim2;
...
Deyim_n;
} while(İfade) ;
do...while ve while döngüleri arasındaki tek fark, test koşulunun
(ifadenin) do while döngüsünde, döngünün sonunda yer almasıdır.
Bunun anlamı, programın döngüyü hiç olmazsa bir kez
çalıştırmasıdır (ilk kez).
for Döngüsü
for deyimi ve for deyimi kullanılarak oluşturulacak döngü
yapısı, işlemlerin tekrar sayısının önceden belli olduğu
durumlarda kullanılır.
for deyiminin yazılışı:
for(ifade1;ifade2;ifade3) Deyim;
Deyim_x;
veya
for(ifade1;ifade2;ifade3)
{ Deyim1;
Deyim2;
...
Deyim_n;
}
Deyim_x;
şeklindedir.
İlk olarak ifade1 hesaplanır; bu genellikle değişkene ilk değeri veren bir
atama deyimidir.
Sonra ifade2 hesaplanır. Bu, deyimin koşulsal kısmıdır.
ifade2 yanlışsa, programın kontrolü for deyiminden çıkar ve program akışı
programdaki bir sonraki deyime geçer (deyim_x). Eğer ifade2 doğru ise,
deyim veya deyimler grubu uygulanır.
Deyim ya da blok yapılı şekilde deyimler grubu çalıştırıldıktan sonra, ifade3
çalıştırılarak hesaplanır. O zaman çevrim yine geriye, ifade2'ye döner.
İfade1 sadece bir kez çalıştırılır; ifade2 ve ifade3 ise, çevrimin her tekrarında
(iteration) çalıştırılır.
for deyiminin while deyimiyle karşılaştırılması
for (ifade1; ifade2; ifade3)
deyim;
yapısı
ifade1;
while (ifade2)
{ deyim;
ifade3;}
yapısı ile tamamen aynıdır.
ÖRNEK: for İLE TAM SAYILAR TOPLAMININ
BULUNMASI
public class PozTop {
ÖRNEK: FAKTÖRİYEL HESABI
public class Faktoriyel {
ÖRNEK: ALTERNE SERİ TOPLAMI
1.2/(3.4)- 5.6/(7.8) + 9.10/(11.12) - 13.14/(15.16)
şeklindeki alterne seri toplamını hesaplayalım.
public class Alterne {
İç İçe Döngüler
Bir döngü yapısının içine başka bir döngü yapısının
yerleştirilmesiyle elde edilen yapıya iç içe döngü (nested loop)
adı verilir.
Java dilinde, if deyimlerini herhangi bir derinliğe kadar iç
içe kullanmak nasıl mümkünse, döngü deyimlerini de iç
içe kullanmak olasıdır. Şu kural iç içe döngüler için daima geçerlidir:
İç İçe for Döngüleri İçin Örnekler
ÖRNEK 1:
Aşağıdaki programda, dış döngü olan a parametreli döngü 5 kez
çalışıyor (a=1, 2, 3, 4, 5). a’nın her değeri içinse içteki döngü 3 kez
çalışıyor (i=1, 2, 3). Böylece aşağıdaki çıktı elde ediliyor:
KOD BLOĞU:
public class IcIce {
İç içe döngülerde en içteki döngü en önce tamamlanır.
ÖRNEK: ÇARPIM TABLOSU
1’den 10’a kadar sayılar için bir çarpım tablosu hazırlamak
istenirse iç içe 2 döngü kullanılır ve her iki döngünün de
parametresi 1’den 10’a kadar değişecektir. Programın kodu şu
şekildedir:
public class CarpimTablosu {
ÖRNEK : FAKTÖRİYELLİ TERİMLERDEN OLUŞAN SERİ
TOPLAMI
Aşağıdaki seri toplamını hesaplayacak bir Java programı
yazalım:
1/ 2! + 1/3! + 1/4! +...+ 1/10!
Bu seri toplamını hesaplamak istediğimizde, iç içe iki döngü
kullanmak gerektiğini hemen anlarız:
public class FaktoriyelliSeri {
SORU: Yukarıdaki seri toplamını, sadece bir for döngüsü
kullanarak hesaplatabilir miyiz?
public class FaktoriyelliSeri2 {
break Deyimi
break deyiminin Java programları içinde iki farklı
kullanım alanı vardır:
switch yapısındaki case seçeneklerinden birinde switch
yapısını terk etmek ve switch’i izleyen deyime geçmek
için kullanılır. (Bu tip kullanımla ilgili örnekler switch
deyimi anlatılırken verilmiştir.)
Bir döngü (loop) yapısı içinden, döngüyü kontrol eden
koşul ifadesini beklemeksizin döngü dışına çıkmak için
kullanılır.
break deyimi bir döngü içinde yer almışsa bu durumda
break deyimi ile karşılaşır karşılaşmaz döngü dışına
çıkılır ve döngüyü izleyen deyime geçilir.
ÖRNEK PROGRAM:
public class BreakClass {
continue Deyimi
continue deyimi, döngü içinde belirli bir koşulun kontrolüyle
bir sonraki döngü adımına gidilmesini gerçekleştirir.
ÖRNEK:
Aşağıdaki programda for döngüsünün parametresi olan i
değişkeni 3 ile tam bölünemeyen bir değer alınca, bu değer ile
işlem yapılmayıp bir sonraki adıma geçilmesi continue deyimi
ile sağlanıyor. Böylece program, kullanıcı tarafından girilen bir
üst limite kadar, 3 ile bölünebilen sayıların toplamını ve bu
tip sayıların adedini buluyor.
ÖRNEK PROGRAM:
package contornek;
public class Cont {
Diziler
Aynı veri türünden birbiriyle ilişkili verilerin bir arada
tutulmasını sağlayan yapılara dizi denir. Dizinin içerisinde yer
alan her bir ayrı veriye eleman denilmektedir. Bu elemanlara
indis numaraları verilir ve bu numaralar üzerinden yerlerine
ulaşılır.
Dizilerin tasarlanış amaçları gayet basittir. Diziler basitçe,
aynı tipe sahip bir dizi elemanı, tek bir noktada gruplayarak bu
verilere daha kolay bir şekilde ulaşılmasını sağlayarak, yazılım
geliştirme sürecini daha basit ve yönetilebilir bir hale sokar.
Java’da diziler nesne olduğu için, dizi oluşturmak için
kullanılan yöntem, aynen nesnelerin oluşturulması gibidir. new
anahtar sözcüğü kullanarak dizi oluşturabiliriz. Tek fark, sadece
derleyiciye bir dizi oluşturacağımızı bildirdiğimiz ‘ [ ] ‘ (dizi
operatörü) operatörü değişken tanımlamasında belirtilir.
Dizileri tek boyutlu ve çok boyutlu diziler şeklinde
sınıflandırabiliriz.
Tek Boyutlu Diziler
Dizi, bilgisayar belleğinde aynı isim altında genellikle
aynı tipten çok sayıda veriyi bir arada saklayan veri
yapısıdır. Aşağıda, x adlı bir dizinin mantıksal görünümü
verilmiştir:
x
4
2
7
22
11
3
5
0
1
2
3
4
5
6
Dizinin bir adı ve dizi içerisindeki elemanın dizinin
kaçıncı elemanı olduğunu belirten bir indisi (subscript,
index) vardır. Örneğin, yukarıdaki x adlı dizi için x[3]
ifadesi bu dizinin 3 numaralı elemanını yani 22 değerini
göstermektedir. Dizinin indisi Java dilinde daima köşeli
parantez ile belirlenir:
Java dilinde bir dizinin ilk elemanının indisi daima 0’dır;
son elemanın indisi ise diziye ayrılan yer sayısının 1
eksiğine eşittir. Yukarıdaki x dizisinin 7 elemanı vardır; ilk
elemanının indisi 0 ve son elemanının indisi de 6’dır.
Java Programı içinde Dizinin Bildirilmesi
Bir Java programı içinde diziyi tanıtmak için, new
sözcüğünü kullanarak belirli bir tipten yeni bir nesne
tanımlama yolu izlenir. Dizinin tipi, adı ve maksimum eleman
sayısı bir bildiri deyimi içinde belirtilir:
Tip DiziAdı[ ] = new Tip [ Eleman Sayısı ];
veya eşdeğeri
Tip [ ] DiziAdı = new Tip [ Eleman Sayısı ];
Örneğin, yukarıdaki x dizisi için,
int [ ] x= new int [6] ;
şeklinde bildirimde bulunulacaktır. x dizisi 6 elemanlıdır
ve elemanları int türündedir.
Dizi yapısına, aynı türden bir veri grubunu tümüyle
bellekte saklı tutmanın gerekli olduğu uygulamalarda ihtiyaç
duyulur. Örneğin, verilerin sıralanması, bir veri grubuna ait
bazı istatistiksel bilgilerin hesaplanması (standart sapma vb.)
gibi uygulamalar bu tür uygulamalardandır.
Örnek:
Dizi kullanmayan sürüm
public class Dizi1{
Dizi kullanan sürüm
public class Dizi2{
Dizilere Değer Ataması
Java’da dizilere 2 türlü değer atanabilir. Birinci yöntem,
dizi referansı oluşturulan satırda dizi elemanlarına açıkça
atama yapmak. Bu yöntemde dikkat edilmesi gereken nokta,
nesne referansı oluşturulan satırda bu atamanın yapılması
şart. Nesne referansı oluşturduktan sonra bu atamayı kodun
başka yerinde yapmak derleme hatasına neden olur.
String[] stringDizisi = {"Java", "C++", "Python", "Haskell"}; //
geçerli
String[] baskaDizi;
baskaDizi = {"Php", "Perl", "Ruby"}; // Error : Derleme Hatası
Dizilere değer atamada kullanılan başka bir yöntem, dizi
referansına bir dizi nesnesi oluşturup atama yapmaktır. Dizi
boyutunu belirledikten sonra, dizi elemanlarını kodun
herhangi bir yerinde atamak mümkündür.
int[] intDizisi;
intDizisi = new int[10] // 10 luk bir int dizisi oluştur
intDizisi[0] = 1;
intDizisi[1] = 2;
//..
intDizisi[9] = 10; //dizinin son elemanı
Dizilere Başlangıç Değeri Atanması
Birçok bilgisayar dilinde olduğu gibi, Java dilinde
de dizilere dizinin tanımlanması esnasında başlangıç
değeri atanması mümkündür. Örneğin,
int [ ] x ={3,-2,1,4,11};
şeklindeki bildiri deyimi ile, x dizisine aşağıdaki gibi
değerler atanmıştır:
x
3
-2
1
4
11
0
1
2
3
4
Örnek: Başlangıç Değeri Atanması
public class Dizi3 {
Dizi tanımında diğer bir yöntem
Dizi boyutunu bir değişken olarak tanımladıktan
sonra diziyi tanımlarken bu değişkeni kullanmamız
da mümkündür. Aşağıdaki komutlarla 5 elemanlı bir
dizi tanımlayabiliyor fakat diziye ilk değer ataması
yapamıyoruz:
int DIZI_BOYUT=5;
int [] sayi;
sayi=new int[DIZI_BOYUT];
Örnek: Dizi Boyutunun Bir Değişkenle Belirtilmesi
public class Dizi4{
Dizi Uzunluğu
Java’da diziler birer nesne olduğu için, sınıfların
sağladığı tüm esnekliği ve gücü diziler ile de
kullanmak mümkün. Örneğin Java, dizi boyutunu
(uzunluğunu) döndüren length adında bir özellik
(property) sunar. dizi.length şeklinde, dizi
adındaki dizinin uzunluğu bulunabilir.
Örnek: Oluşturulan 10 luk bir int dizisine 30 dan
büyük 10 çift sayıyı atansın.
int[] dizi;
dizi = new int[10];
int altSinir = 30;
for(int i = 0; i < dizi.length; altSinir++)
{ if(altSinir % 2 == 0)
{
dizi[i] = altSinir;
i++; }
}
// dizi içeriğini ekrana bastıralım
for(int i=0;i<dizi.length;i++)
{
System.out.printf("%d ", dizi[i]);
}
// Program Çıktısı
30 32 34 36 38 40 42 44 46 48
Bir fonksiyon parametresi olarak diziler
Bir dizi, bir fonksiyon parametresi olarak kullanılabilir. Çağıran
fonksiyon ya da program, dizi türündeki bu parametreye yine dizi
türünde olmak üzere bir argüman geçirebilir. Bir dizi, bir
fonksiyon parametresi olacaksa; dizinin tipi, adı ve içi boş olan
köşeli parantezler fonksiyonun parametre listesinde görünmelidir.
Örneğin,
static int topla_dizi(int[] x, int n)
gibi bir fonksiyon başlığında x tam sayı tipinde bir dizidir. n
parametresi ise dizinin eleman sayısıdır. Bu fonksiyonu çağıran
fonksiyon veya program içinde, a dizisi,
int[ ]a={2,8,3,7,5};
şeklinde tanımlanmışsa, yukardaki topla_dizi adlı fonksiyon,
toplam=topla_dizi(a,5);
şeklinde çağrılabilir.
Örnek: "n" Elemanlı Bir "x" Dizisinin Toplamını Bulan Bir
Fonksiyon ve Çağıran Programla Birlikte Kullanılması
public class Dizi5 {
FOR Döngüsünün Farklı Kullanımı: Dizi elemanlarına
sıralı ulaşmak için;
for (int adizi:dizi){
Toplam=toplam+adizi;}
Dizi elemanlarını sıralamak için;
Arrays.sort(dizi);
Dizi uzunluğunu bulmak için;
dizi.length
Dizi elemanlarına istenilen değeri atamak için;
Arrays.fill(dizi,0);
package forEach;
import java.util.*;
public class forornak {
public static void main(String args[]){
int dizi[]={10,8,8,7,4,3};
int toplam=0;
for (int adizi:dizi){
toplam=toplam+adizi;}
System.out.println("\ntoplam=" + toplam);
Arrays.sort(dizi);
System.out.println("siralanmis dizi");
for (int adizi:dizi)
System.out.print(" " + adizi);
System.out.println("\ndizi uzunlugu:"+dizi.length);
Arrays.fill(dizi,5);
System.out.println("5 yapılmış dizi");
for (int adizi:dizi)
System.out.print(" " + adizi);
}
}
Java da Çok Boyutlu Diziler
Java’da diziler istenilen boyutta tanımlanabilir. İki, Üç
boyutlu ( Two Dimensional, Three Dimensional Arrays) ve
daha fazla boyutta dizi tanımlamak tamamen
programcılara bırakılmıştır. Çok boyutlu diziler basitçe,
dizilerin dizileri (arrays of arrays) olarak düşünülebilir.
Ancak, uygulama kodunun basitliği ve kodu okuyan
kişilerin kodda dönen olayları daha iyi anlayabilmesi için 2
boyuttan daha yüksek boyutta dizilerin kullanılması pek
önerilmez. Nadiren 3 boyutlu diziler kullanılmaktadır.
Örneğin 2 boyutlu diziler belirli bir satır ve sütundan
oluşan bir matris gibi düşünülebilir. Burada ilk dizi satır
sayısını, diğer dizi ise sütun sayısını temsil eder. C/C++ da,
sütun sayısı sabitdir. Her satır için aynı boyutda dizi (sütun)
kullanılarak 2 boyutlu diziler oluşturulur. Ancak Java’da bu
böyle değildir. Java’da her satır için farklı sütun sayısında
(dizi boyutu) dizi oluşturulabilir.
Java'da, 5 satır ve 3 sütundan oluşan bu tabloyu aşağıdaki
şekilde tanımlayabiliriz:
int [][] satis=new int [5][3];
Burada satis adlı iki boyutlu dizinin bir elemanına referans
vermek için program içinde,
şeklinde bir ifade kullanırız. Burada satis dizinin adı, i satır
indisi ve j de sütun indisidir.
Satis dizisinin satır indisleri 0'dan başlar ve 4'e kadar
devam eder. Sütun indisleri ise, 0 ile 2 arasında değerler
alır.
String[][] dizi = {
{"Ali", "Ayşe"},
{"Bey", "Hanım"}
};
System.out.println(dizi[0][0] + " " + dizi[1][0]);
System.out.println(dizi[0][1] + " " + dizi[1][1]);
// Program Çıktısı
Ali Bey
Ayşe Hanım
Aşağıdaki örnek programda 3 satır ve 2 sütunu
olan satis adlı tablonun elemanları klavyeden
giriliyor ve daha sonra tablo ekrana aktarılıyor;
public class CokBoyutluDizi1 {
Aşağıdaki Java programı, satisTablosu adlı
diziye ilk değer ataması yapıyor ve tablo
elemanlarını ekrana yazdırıyor:
public class CokBoyutluDizi2{
Çok Boyutlu Dizi Uzunlukları
length fonksiyonu ile iki boyutlu dizinin her bir boyutundaki
eleman sayısını bulmak mümkün.
Örnekteki dizi adındaki dizinin uzunluğunu aşağıdaki gibi
bulabiliriz. Çıktı dizinin eleman sayısını beklendiği gibi
verecektir.
String[][] dizi = { {"Ali", "Ayşe"},{"Bey", "Hanım“} };
System.out.println(dizi.length);
//Çıktı
2
dizi adındaki dizinin elemanları da bir dizi olduğu için, dizi[0]
şeklinde bir ifade dizi içerisindeki ilk diziyi verecektir. Yine
aynı şekilde bu dizilerin uzunluklarına da aşağıdaki şekilde
ulaşabiliyoruz.
dizi[0].length
dizi[1].length
public class CokBoyutluDizi3 {
ÖRNEK: Satış Tablosunun Satır ve Sütun
Toplamlarının ve Tablodaki Elemanların Genel
Toplamının Bulunması
public class CokBoyutluDizi4 {
ÖRNEK: Önceden belirleyeceğimiz 3'e 4'lük bir
tabloda yer alan elemanların en küçük ve en büyük
değerdeki elemanı bulan bir Java programı yazalım.
Ayrıca bu program her satırdaki ve sütundaki en
küçük ve en büyük elemanları da bulabilsin.
public class CokBoyutluDizi6 {
Dizilere bağlı diğer dizilerin aynı uzunlukta olma
zorunluluğu yoktur.
public class cokboyutludiz13 {
METODLAR
Metodlar: Program içerisinde yazılmış olan küçük
program parçalarına verilen addır. Metodlar, belirli bir
görevi yapan kod bloklarıdır,
Metodların özellikleri;
• Erişim belirleyici (modifier ) metoda nasıl erişileceğini
belirtmektedir.Yazmak zorunlu degildir.
• Metodun adı belirtilmelidir.
• Metodun parametreleri ise parantez içerisinde
belirtilmelidir.
• Metod parametrelerini ayırmak için ” , ” işareti
kullanılmalıdır.
• Eğer metod parametre almaz ise, sadece parantez
açılıp kapatılır.
Metodların oluşturulması
Metotlar aşağıdaki gibi tanımlanmaktadır.
Erişim belirleyici | Dönüs tipi | Metod adi (parametre listesi)
{
//islemler
}
Metod Tanımlama
Metod ismini belirtmemiz gerekmektedir.
Metodların geri dönüş tipinin tanımlanması gerekmektedir.
Eğer metodun geri dönüş tipi yoksa void olarak
tanımlanmalıdır.
Metod Parametreleri
Öncelikle olarak parametrelerin veri tiplerini ve adlarını
belirtmek gerekir. Metodlar parametre almayabilir.
PARAMETRESİZ METODLAR
Parametre değeri almayan metotlardır.
Parametresiz metodlar ile ekrana bir metin yazdırabılır, bir
değer döndürebilir ve bunun gibi işlemler yapılabılır.
Örnek: Parametresiz metodlara örnek olarak bir uygulama
yazılırsa,
public class parametresizmetodlar {
Örnek: Bu uygulamada toplama, çıkarma, çarpma, bölme
işlemleri metodlar kullanarak gerçekleştirilmekte.
public class parametresizmetodlar2 {
Örnek: Bu uygulamada ise parametresiz metodlar ile ilgili
fakat değer döndüren bir uygulama yazılıyor.
public class degerdondurme {
PARAMETRELİ METODLAR
parametre alan metodlarda parantez içerisinde önce
parametrenin tipini ardından ise ismini yazmaktayız. Birden
fazla parametre varsa eğer, “,” virgül ile ayırabiliriz.
Örnek: Bu uygulamamizda ise; toplama, çıkarma, çarpma,
bölme işlemlerini parametreli metodlar yardimi ile
yapacağız.
package metot;
public class parametrelimetodlar {
Örnek: Şimdi ise, Scanner sınıfını kullanarak kullanıcıdan
değer alalım ve aldığımız bu değerin faktöriyelini
hesaplayalım.
import java.util.Scanner;
public class faktoriyelhesap {
Java’da Yapılandırıcılar (Constructors)
Constructor’lar sınıfın ismiyle aynı isimde tanımlanan
metoda benzeyen yapılardır. Ancak metotlar gibi geri
dönüş tipleri yoktur.
package yapilandiricilar;
public class Araba {
public Araba() {
}
}
Tanımlanırlarken başlarına tüm erişim denetleyicilerini
(access modifiers) alabilirler. Bir sınıfta birden fazla
constructor olabilir. Constructor’lar çok detaylı bir
konudur ve çok fazla kuralı vardır. Constructor’ların iki
önemli görevi vardır.
1- Sınıf değişkenlerine (global
değişkenlere) belirli işlemlerden sonra
ilk değerlerini atamak için kullanılırlar.
Sınıf değişkenleri, sınıftaki tüm metotlar
tarafından
erişilebilen
global
olarak
tanımlanmış değişkenlerdir. Bu değişkenlerin
tanımları yapılırken ilk değerleri atanmak
zorunda değildirler. Kullanılacakları zaman
eğer ilk değerleri atanmamışsa varsayılan
değerlerini alırlar. Sınıf değişkenlerinin ilk
değerleri
belirli
işlemler
sonucunda
atanacaksa yapılandırıcılar kullanılır.
package yapilandiricilar;
public class Araba {
private int maxHiz;
public Araba(int maxHiz) {
if (maxHiz > 0) {
this.maxHiz = maxHiz;
} else {
maxHiz = 220;
} } }
Araba sınıfının maxHiz adında bir değişkeni olsun. Sınıfın
instance’ı yaratılırken parametre olarak gönderilen değer
sıfırdan büyükse sınıf değişkenine atayalım değilse 220 olsun
diyebiliyoruz. Bu tarz kontroller yapılandırıcı içerisinde
yapılabilir.
2- Instance yaratmak yani bellekten
objeye yer ayırmak için kullanılırlar.
package yapilandiricilar;
public class Araba {
public Araba() { // yazılmasa da yazılmış varsayıl
acaktı
}
}
Bir sınıfta parametre alan en az bir constructor
yazıldıysa default constructor yazılmış
varsayılmaz.
package yapilandiricilar;
public class Araba {
private int maxHiz;
public Araba(int maxHiz) {
this.maxHiz = maxHiz;
package yapilandiricilar;
} }
public class Araba {
private int maxHiz;
public Araba(int maxHiz) {
this.maxHiz = maxHiz;
} }
Artık Araba sınıfımız başka bir sınıftan new Araba(); komutuyla
yaratılamaz. Mutlaka parametre olarak int tipinde bir değişken
göndermemiz gerekir.
Bir constructor’dan başka bir constructor
çağrılabilir. Fakat bu çağrım mutlaka ilk komutta
yapılmalıdır. Eğer bir constructor’dan başka birine
çağrım yapılmadıysa ilk komutta kendi ata sınıfının
default constructor’ı çağrılmış varsayılır. Tüm
sınıflar, yazılmasa bile Object sınıfından
türediklerinden en son çağrım mutlaka Object
sınıfının default constructor’ına yapılır.
package yapilandiricilar;
public class Araba {
private int maxHiz;
public Araba() {
this(120); }
public Araba(int maxHiz) {
this.maxHiz = maxHiz; }}
Yukarıdaki örnekte default constructor’dan parametre alan
constructor’a çağrım yapılmış. Eğer yapılmasaydı super
class’ının default constructor’ına çağrım yapılmış
varsayılacaktı. Yani super(); komutu yazılmış varsayılacaktı.
package yapilandiricilar;
public class Araba {
public Araba() {
super(); // yazılmasa da yazılmış varsayılacaktı
}
}
Obje hiyerarşisindeki sınıflarda instance yaratma işlemleri
super class’tan başlayarak gerçekleşir. Bir örnek verelim.
public class Araba {
public Araba() {
System.out.println(1);
}}
• public class Ford extends Araba {
public Ford() {
System.out.println(2);
}}
public class Test {
public static void main(String[] args) {
new Ford();
}}
Bir sınıfta hiç parametre almayan constructor’a
default constructor, tüm sınıf değişkenlerini
parametre olarak alan constructor’a ise full
constructor denir.
Yapılandırıcı metodlar sınıflardan bir nesne
üretildiğinde otomatik olarak çalıştırılırlar. Bu
metodların en önemli özelliği içinde bulunduğu
sınıfla aynı isimde olmak zorunda olmasıdır.
Örnek gösterimi şu şekildedir.
public class Student{
//üye değişkenlerimiz
public Student(){
//yapıcı metod kodlarımız
}}
Not: Yukarıda basit bir şekilde yapıcı metodun nasıl
kullanılacağını gösterdik. Ayrıca bir sınıf içerisinde
birden fazla yapıcı metod da kullanılabilir. Bunda bir
sınır yoktur.
Şimdi değişkenlerle yapıcı metodların nasıl olduğunu
görelim.
package metot;
public class Kare {
new Operatörü Ne İşe Yarar?
Görüldüğü üzere nesne oluşturma işlemi iki
aşamalıdır. Önce sınıfın adını ve nesne adını belirtiriz.
Bu aşamada null değerinde bir nesnemiz olur. Çünkü
henüz bir gerçek nesneyi temsil etmemektedir.
Gerçek bir nesne olabilmesi için bellekte bir yere
sahip olmalı.
İkinci aşamada new operatörünü kullanarak bellekte
nesnemize bir yer açmış oluruz ve bu yeri nesnemize
atarız. İşte şimdi hakiki bir nesneye sahip olduk.
package metot;
public class MetotYapisi {
package metot;
public class YapilandiriciMetot {
• Bu örnekte gördüğümüz üzere yapılandırıcı
metotumuzu daha nesneyi oluştururken kullanmış
olduk. new anahtar sözcüğüyle birlikte verdiğimiz
değerler, gerekli işlemler yapılarak yapılandırıcı
metot içerisindeki değişkenlere atandı. Bu
değişkenleri de ekrana yazdık.
• Dikkat ettiyseniz aynı değişkenleri ekrana
yazdırıyoruz fakat farklı sonuçlar alıyoruz. Çünkü
yapılandırıcı metotlar her nesne için ayrı ayrı
sonuçlar saklar. Yukarıdaki maddelerde de
belirttiğimiz üzere her çağırıldıklarında yeni bir
nesne oluştururlar. Bu sebeple değişkenlerin
değerlerinde herhangi bir çakışma söz konusu
olmaz.
THIS
• Java, this anahtar sözcüğünü bir metot içinde geçerli
nesneye bir referansta bulunmak için kullanır. O
metodu çağıran ifadelerin özel olduğunu göstermek
için kullanırız. Örnek anahtar gizleme işlemi
yapar(instance variable hiding). Aynı ada sahip 2
tane yerel değişken tanımlamak mümkün değildir
ancak sınıfın örnek değişkenleriyle aynı ada sahip
olan (metodun parametreleri dâhil) yerel
değişkenlere sahip olabilirsiniz. Yerel değişken örnek
değişkenle aynı ada sahip ise örnek değişken gizlenir.
• package metot;
• public class kutuDemo {
METOD OVERLOADING
Farklı işlevler yapan ama aynı isme sahip metodlar var ise, metod
overloading olmuş oluyor. Örneğin; int veri tipinde iki sayının
farkını alan calculate () isminde metod tanımlayalım. Aynı şekilde
double veri tipinde bölme işlemini yapan calculate() isminde bir
metod daha tanımlayalım. Aynı isimde iki metod bulunduğundan,
burada metod overloading yani aşırı yükleme meydana
gelmektedir.
Overloading kavramında, aynı isimde iki metod olabilmektedir.
Fakat bu metodların parametre tipleri, parametre sıraları ve
sayılarından herhangi birisinin farklı olması gerekmektedir.
Örnek: Bu uygulamamızda overloading ile ilgili bir uygulama
yapacağız. Örneği daha iyi kavrayabilmeniz açısından yukarıda
overloading ile ilgili belirtmiş olduğum özellikleri anlamanız
gerekmektedir.
package metot;
public class metodoverloading {
metodoverloading isminde bir class yapisi tanimliyoruz.
OVERLOADİNG
Function Overloading ve Operator Overloading
özelliklerini destekler.
Function Overloading aynı isimdeki fonksiyonların
değişik tip ve sayıdaki parametreler alarak hangisinin
çağrılmasına derleyici tarafından karar verilmesini
sağlayan mekanizmadır. Gerek fonksiyonlar için olsun
gerekse operatörler için, Overloading nesnel
yönelimli dillerde genelde varolan bir yöntemdir. Java
aynı adlı metodların aynı sınıf içerisinde kullanılmasına
izin verir. Aynı sınıfta(class) kullanılan metodların girdi
değişkenlerinin değişken türlerinin veya değişken
sayılarının farklı olması gerekir. Java aynı isimli ve ayni
degişkentürlü iki metodu birbirinden ayıramaz.
Public double
Ametodu(double Adeğişkeni)
Ve
Public double Ametodu(double Bdeğişkeni)
Veya
Public int Ametodu(double Cdeğişkeni)
Java tarafindan ayırt edilemez. Fakat
Public double Ametodu(double Adeğişkeni)
Ve
Public double Ametodu(int Bdeğişkeni) ayırt eder.
• package metot;
• public class Sinif {
• Burada overlodaing islemi gerçekleşir ve
fonksiyon string olarak cağrıldığından iki
goster fonksiyonundan altaki çağrılır.
Java'da Dosya İşlemleri
Java’da yer alan Dosya İşlemleri Sınıfları‘nı 4 ana gruba
ayırmaktayız. Ve bu 4 ana grupta kendi içlerinde alt
sınıflara ayrılmaktadır.
1.InputStream: Byte tabanlıdır. Byte’ların tek tek
okunmasını sağlamaktadır. Alt sınıfları:
FileInputStream
ByteArrayInputStream
FilterInputStream
2.OutputStream: Byte tabanlıdır. Byte’ların tek tek
dosyalara yazılmasını sağlamaktadır. Alt sınıfları:
FileOutputStream
ByteArrayOutputStream
FilterOutputStream
3.Reader: Karakter tabanlıdır. Dosyalardaki
karakterlerin okunmasını sağlamaktadır.Alt
sınıfları:
BufferedReader
InputStreamReader
StringReader
4.Writer: Karakter tabanlıdır. Karakterlerin
dosyalara yazılmasını sağlamaktadır. Alt sınıfları:
BufferedWriter
OutputStreamWriter
StringWriter
PrintWriter
İlk örneğimizde bir string değişkeni içerisinde saklanan veriyi disk
üzerinde bir .txt (metin) dosyasına yazmayı anlatacağız.
package dosya;
public class filewriterornek {
Başka bir örnek: Bu uygulamamızda arkadaşlar, BufferedWriter
ile dosyaya yazma işlemini gerçekleştireceğiz.
package dosya;
public class ornek1 {
Dosyaya yazma işleminde FileWriter yazma=new
FileWriter(f,false);
kullanıldığında yeni dosya yaratılır.
FileWriter yazma=new FileWriter(f,true);
Kullanıldığında ise var olan dosyaya ekleme yapılır.
Dosyaya yazma işlemi fonksiyonlarda yapılırsa;
package com.dosya.islemler;
public class DosyaIslemleri {
package dosya;
public class MainPage {
UYGULAMA
Eğer bir resmi ya da İnternet üzerinden çektiğimiz
bir dosyayı diske kayıt etmek istiyorsak, metin
dosyası yerine binary dosya kullanmamız gerekir.
Java bu amaçla aşağıdaki sınıfları sunmaktadır:
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class byteYazma {
public class byteOkuma {
Download