S.a. Arkadaşlar,
Bugünkü konumuzda daha önce işlediğimiz overload özelliğini işleyeceğiz, fakat bu sefer farklı özellikleri ve bir kaç farklı kavram üzerinde duracağız. Ne demek istediğimizi yazı ilerledikçe daha iyi anlayacağınızı umuyoruz. Yazımıza bu sefer bir örnek ile başlamak istiyorum daha sonra ne demek istediğimizi anlatacağız.
public class CoolClass {
static void coolMethod(int x) {
System.out.print("int ");
}
static void coolMethod(long x) {
System.out.print("long ");
}
static void coolMethod(double x) {
System.out.print("double ");
}
public static void main(String[] args) {
byte b = 10;
short s = 10;
long l = 10;
float f = 5.0f;
coolMethod(b);
coolMethod(s);
coolMethod(l);
coolMethod(f);
}
}
Çıktı
int int long double
Burada 'b' değişkenini ele alalım. Byte kendisinden büyük , fakat ortamdaki en küçük tanımlayıcıya gidecektir. Yani ne demek istiyoruz. 3 tip de kendisinden büyüktür fakat kendisinden büyük en küçük olan int olduğu için int değerine gidecektir. Şöyle dersek belki daha iyi anlarız, eğer
static void coolMethod(short x) {
System.out.print("short ");
}
kod kısmında bulunmuş olsaydı (kod içerisine yapıştırabilirsiniz) çıktı short olacaktı. Bunun sebebi dediğimiz gibi kendisinden büyük en küçük olana gitme kuralıdır. Eğer (int x) metodu olmasaydı o zaman long , o da olmasa tüm çıktı double olacaktı. Bu söylediklerimizi daha iyi anlayabilmek için kodu değiştirip derleminizi tevsiye ederiz. O zaman daha iyi anlayacağınızdan eminiz.
Şimdi de bu konuyla ilgili 3 kavrama bakacağız. Wideing, Boxing ve Var-args . Bu kavramları daha önceki yazılarımızdan yabancı değilsinizdir. Wideing'i ilk kez ele alıyoruz. Fakat bu kavramların overload ile birlikte kullanımı inceleceğiz. Şimdi kodumuza geçelim onun üstünden devam edelim.
public class Test3 {
static void go(byte x, byte y) {
System.out.println("byte,byte");
}
//ilk metodu yorumlarsak bu metod
static void go(int x, int y) { //wideing
System.out.println("int,int");
}
//ilk 2 metodu yorumlarsak bu metod
static void go(Byte x, Byte y) { //boxing
System.out.println("Byte,Byte");
}
//ilk 3 metodu yorumlarsak bu metod çalışacaktır
static void go(byte... x) { //var args
System.out.println("byte ...");
}
public static void main(String[] args) {
byte b = 10;
go(b, b);
}
}
Şimdi konuyu biraz daha açalım. Burada wideing,boxing,var-args yapılarının hangisinin öncelikli olduğunu anlamaya çalışıyoruz. Bunun için dediğimiz satırları yorumlayarak anlayabiliriz. Yani tüm kodlar aktiften çıktımız byte,byte olacaktır, fakat ilk blocku yorumlarsak wideing bpxing var args arasından wideing çalışacaktır. Bunun diğerlerine önceliği vardır. Daha sonra boxing ve en son var args önceliklidir. Kodları derlediğinizde daha iyi anlayacağınızı düşünüyoruz.
varargs etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
varargs etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
29 Aralık 2014 Pazartesi
10 Aralık 2014 Çarşamba
VARiabla ARGuments
Bugünkü
yazımızda VARiable ARGumentslerden bahsedeceğiz. Fakat bu konuya geçmeden önce
parametre ve argüman konualarından bahsedip daha sonnra varargsa geçmeyi
düşünüyoruz.
Argüman: bir metodu çağırırken içindeki değişkenlerdir
Örn; topla(a,b) gibi a ve b burada birer argümandır
Parametre : metod tanımlarken kullanılan değişkenlerdir
Örn; topla(int a, int b){} burada ise a ve b birer
parametredir
Şimdi
konumuza daha ayrıntılı bakalım. Yukarıda bahsetmiş olduğumuz topla isimli
metod 2 değişken değil de daha fazla değişken alabilir.
Örn; topla(int a, int b, int c , int d ) ve bu değişkenler
daha artarsa ne olur. Her defasında yeni bir değişken mi ekleyeceğiz peki tabi
ki hayır. Bunun için varargs var.
Örn; topla(int … args ) yapmamız yeterlidir. Burada 0 veya
daha fazla değişken kullanabiliriz. Peki bize bunun dışında bir de String
değişkeni lazım olursa ne yapmamız lazım. Onu da şöyle tanımlayabiliriz
topla(String s,int… args) olmalı. Burada dikkat edilmesi
gereken kısım arg kısmını yani sonsuz sayıda değer alacağımız kısmı en son
eklememiz gerektiği ve bir metodda en fazla 1 argüman olacağını unutmamalıyız.
Kuralları kısaca şöyle tanımlayabiliriz bunla ilgili ve bu kurallardan bugünkü
yazımızı tamamlıyoruz.
• Sadece
bir tek var-arg parametresi kullanilabilir.
topla(int...x,String ...s) hatalıdır
• Var-arg
yapisinda olmayan diger parametrelerle birlikte kullanilabilir.
topla(String s, int ...x) doğrudur
• Var-arg
yapisi metotda tanimlanirken en sonda olmalidir.
topla(int ... x, String s) hatalıdır
• Var-arg
yapisini tanimlarken 3 nokta parametre isminden once gelmelidir
topla(int x...) hatalıdır
Kaynakça
http://www.injavawetrust.com/pure-java-08-declare-var-args/
Kaydol:
Kayıtlar (Atom)