Paylaşım , Takip İçin
Metotların Bindirilmesi (Overloading)
- Java’da parametreleri farklı olduğu sürece aynı sınıfta aynı ismi paylaşan metotlar tanımlanabilir. Buna Methods Overloading denir.
- Metot Bindirme Java’nın Çok Biçimlilik (Polymorphism) özelliğinden kaynaklanmaktadır.
- Java’da iki tip çok biçimlilikten bahsedebiliriz:
- Aşırı Yükleme (Overloading)
- Devre Dışı Bırakma (Overriding)
- Devre Dışı Bırakma konusu kalıtım ile beraber ele alınacaktır.
- Java’da bindirilmiş bir metot çağrıldığında, hangi metodun seçileceğini parametre sayısı ve tipi belirler.
Örnek
public void test() {
System.out.println("Hiç parametre yok");
}
public void test(int a) {
System.out.println("a= "+a);
}
public void test(int a,int b) {
System.out.println("a= "+ a + " b= "+ b);
}
public double test(double a) {
System.out.println("double a= "+a);
return a*a;
}
Nesneleri Parametre Olarak Kullanmak
- Şimdiye kadar metotlarda parametre olarak basit veri tipleri kullanıldı.
- Ancak metotlara nesne aktarımı yaygın bir kullanımdır.
- Bunu bir örnek ile açıklayalım:
Örnek
class Test{
public int a, b;
public Test( int i, int j) {
a=i;
b=j;
}
boolean equals(Test obj) {
if(a==obj.a && b==obj.b)
return true;
else
return false;
}
}
public class objectPass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test ob1=new Test(100, 200);
Test obj2=new Test(100, 200);
Test obj3= new Test(1, 1);
System.out.println("ob1 == ob2: "+ ob1.equals(obj2));
System.out.println("ob1 == ob3: "+ ob1.equals(obj3));
}
}
—————————————–
ob1 == ob2: true
ob1 == ob3: false
- Örneği incelediğinizde Test sınıfı içerisinde equals() metodu çağrılmaktadır.
- equals() metodu parametre olarak içinde bulunduğu sınıftan bir nesne alır ve çağrıldığı nesne ile parametre olarak alınan nesnelerin üye değişkenlerinin eşit olup olmadığını kontrol eder.
- Eğer iki nesne değişkenleri eşit ise true değilse false döner.
Yapılandırıcı Metot İçerisinde Nesne Aktarımı
- Nesne parametrelerinin yaygın kullanımı yapılandırıcı metotları da içerir.
- Örneğin sıkı sık ilk haliyle var olan bir nesneyi aynısını inşa etmek istersek, kendi sınıfının bir nesnesini parametre olarak alan yapılandırıcı bir metoda ihtiyaç duyarız.
- Bu durumu bir nevi o nesneden bir klon yaratmak gibi düşünebilirsiniz.
Örnek
class Box{
double width;
double height;
double depth;
//Bir nesnenin kopyasını yaratmak(Klon)
public Box(Box obj) {
width=obj.width;
height=obj.height;
depth=obj.depth;
}
//İlk değer vermeden kullanılan yapılandırıcı
public Box() {
width=0.0;
height=0.0;
depth=0.0;
}
//değer ataması yapan yapılandırıcı
public Box(double w,double h,double d){
width=w;
height=h;
depth=d;
}
public double volume() {
return width*height*depth;
}
}
public class paramObjBox {
public static void main(String[] args) {
// TODO Auto-generated method stub
Box myBox=new Box();
Box myBox2=new Box(10, 15, 20);
// myBox2 nesnesinden bir klon yaratalım
Box myClone=new Box(myBox2);
double vol=myBox.volume();
System.out.println("myBox Hacmi="+vol);
double vol2=myBox2.volume();
double volClone=myClone.volume();
System.out.println("myBox2 vol="+vol2+" myClone vol="+volClone);
}
}
Parametre Aktarımına Yakından bir Bakış
- Genelde bir Java programının bir alt program yada metoda parametre aktarmasının iki yolu vardır.
- Değer ile çağırma (Call-by–value) Primitive tipler için kullanılır.
- Referans ile Çağrıma (Call-by–reference) Referans tiplerde kullanılır.
- Primitive tiplerde bir değişkenin değerini o metoda gönderdiğimizde, değerin bir kopyası gönderilir ve orijinal değer bozulmaz.
- Referans tiplerde ise, direk olarak parametre aktırılmaz onun yerine referans argüman aktarılır. Parametrenin değerine referans değişken üzerinden erişilir.
Örnek
class refTest{
int a, b;
refTest(int i, int j){
a=i;
b=j;
}
void transVar(int a, int b) {
this.a=a*2;
this.b=b*2;
}
void transRef(refTest obj) {
obj.a *=2;
obj.b *=2;
}
}
public class transferParam {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10, b=20;
refTest ob=new refTest(10, 20);
System.out.println("metottan Önce a="+a+" b="+b);
System.out.println("metottan Önce obj.a="+ob.a+" obj.b="+ob.b);
ob.transVar(a, b);
ob.transRef(ob);
System.out.println("metottan Sonra a="+a+" b="+b);
System.out.println("metottan Önce obj.a="+ob.a+" obj.b="+ob.b);
}
}
——————————————
metottan Önce a=10 b=20
metottan Önce obj.a=10 obj.b=20
metottan Sonra a=10 b=20
metottan Önce obj.a=40 obj.b=80
Nesne Döndürme
- Bir metot yarattığımız sınıflarda dahil olmak üzere bir nesne döndürebilir.
class refTest{
int a, b;
refTest(int i, int j){
a=i;
b=j;
}
public refTest inc() {
refTest temp=new refTest(a+1,b+1);
return temp;
}
}
public class transferParam {
public static void main(String[] args) {
refTest ob1=new refTest(2, 3);
refTest ob2=ob1.inc();
System.out.println("a= "+ob1.a+ " b= "+ob1.b);
System.out.println("a= "+ob2.a+ " b= "+ob2.b);
}
}
—————————-
a= 2 b= 3
a= 3 b= 4
Özyinelemeli (Recurisive) Metotlar
- Özyinelemeli (Recurisive) metotlar kendi kendilerini çağıran metotlar olarak ifade edilir.
- Bir dönüş kriteri belirlenene kadar bu metot kendi kendini çağırmaya devam eder.
- Java özyinelemeyi (recurision) destekler.
- Bunu faktöriyel örneği ile açıklayalım.
Örnek
import java.util.Scanner;
public class recurisive {
public static int fact(int i) {
if(i==1) {
return 1;
}
int result =i * fact(i-1);
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
System.out.print("Bir sayı giriniz:");
int sayi=s.nextInt();
int i=recurisive.fact(sayi);
System.out.println("faktoryel="+i);
}
}
Paylaşım , Takip İçin