Friday, September 17, 2010

Passing Variables into Methods

Bu yazida method icindeki degiskenlerin bir kac deger verildikten sonra en son hangi degeri sakladiklarini ele alacam basit bir konu ama dikkat gerektiriyor. Ben bu yaziyi ornekler uzerinde anlatmanin daha iyi olacagini dusunerekten ilk uygulamama basliyom.
  • Ilk once primitive tiplerteki degiskienleri incelemekle basliyorum acama primitif tiplere b ir deger verdikten sonra ve beli basli islemlerden ve deger atamalaridan gectiten sonra en son degeri ne olur.
public class PrimitifTypeTest {
     public static void main(String args[]) {
           int value = 1;
           System.out.println("Before : " + value);
           modify(value);

           System.out.println("After : " + value);
     }

     public static void modify(int valueOne) {
             valueOne = valueOne + 2;
             System.out.println("Modify : " + valueOne);
      }
}

//Console Output
Before : 1
Modify : 3
After : 1

Gorulduyu gibi oncelikle  value ilk basta 1 degerini aliyor ve sonra modify methodu cagiriliyor ve methodun parametresi valueOne'ye 1 degeri veriliyor modify methodu 1 deger ile 2 degerini topluyor ve valueOne 3 oluyor ve sonraki satirda value'nin degerine bakilinca hicbir degisiklik olmaz yani value yine 1 olur. Sebebi ise her primitive tip degerini farkli adreste saklar. Birde uygulamada value degerini modify(int valueOne) verince sadece degeri vermis oluyorum degeri kaydettikleri adreste herhangi bir degisme olmuyor

  • Simdide Reference  tipteki degiskenleri inceliyelim burada olay tamamen farkli bir reference degiskenini baska bir reference degiskenine verdiyimizde hem degeri veriyor hemde kendi adresine yonlendiriyor.
public class Student {
              public String name;
             public String surname;
}


public class ReferenceTest {
     public static void main(String[] args) {
           Student studentOne = new Student();
           studentOne.name = "Abdulkadir";
           studentOne.surname = "Selcukoglu";
           System.out.println("Before : " + studentOne.name + " " + studentOne.surname);
           modify(studentOne);
           System.out.println("After : " + studentOne.name + " " + studentOne.surname);
      }

      static void modify(Student studentTwo) {
            studentTwo.name = "Ertugrul";
            studentTwo.surname = "Aslan";
            System.out.println("Modify : " + studentTwo.name + " " + studentTwo.surname);
      }
}


public class ReferenceTest {
     public static void main(String[] args) {
                Student studentOne = new Student();
                studentOne.name = "Abdulkadir";
                studentOne.surname = "Selcukoglu";
                System.out.println("Before : " + studentOne.name + " " + studentOne.surname);
                modify(studentOne);
                System.out.println("After : " + studentOne.name + " " + studentOne.surname);
      }

     static void modify(Student studentTwo) {
           studentTwo.name = "Ertugrul";
           studentTwo.surname = "Aslan";
           System.out.println("Modify : " + studentTwo.name + " " + studentTwo.surname);
     }
}
 

//Console Output
 Before : Abdulkadir Selcukoglu
Modify : Ertugrul Aslan
After : Ertugrul Aslan

Uygulamayi inceliyelim oncelikler bir tane Student diye bir reference bir degisken  olusturdum ve adina  studentOne dedim ve orencinin name ve surname field'lerine Abdulkadir Selcukoglu degerlerini verdim System.out.println ekranda yazdim sonra modify() methodundaki studentTwo'ya studentOne atadim bu atama sirasinda hem degerleri veridim hemde adres'indeki degeri verdim yani ve degisklik yapinca yani Ertugrul Aslan degerini name ve surname ye verince adresi verdigi icin onceki degeri siler ve yeni degeri verir ve boylece hem studentOne hemde studentTwo uzerinde degisiklik yapilmis olur. yani modify methodu ile studentTwoda yapilacak tum degisiklikler studentOne'yide etkiler sebebinide dedigim gibi biz studentOne degeri studentTwo verince studentTwo artik studentOne adresini gorduyunden degisikliklerden birebir etkilenir.



  •  Simdide Array tipdeki degiskenler nasil hareket eder ona bakalim
public class ArrayTypeTest {
       public static void main(String args[]){
             int a[] = {1,2,3};
            System.out.print("Before : ");
            for (int i : a) {
                  System.out.print(" - "+i);
            }
            System.out.println();
            modify(a);
            System.out.print("After : ");
            for (int i : a) {
                 System.out.print(" - "+i);
             }
             System.out.println();
      }

      public static void modify(int b[]){
            b[0]=4;
            b[1]=5;
            b[2]=6;
            System.out.print("Modify : ");
            for (int i : b) {
                System.out.print(" - "+i);
            }
           System.out.println();

      }
}


//Console Output 
Before : - 1 - 2 - 3
Modify : - 4 - 5 - 6
After : - 4 - 5 - 6


Gorulduyu gibi reference degiskenlerindeki gibi Array tipleride bir array baska bir arry degiskene atadigimizda adres yollu atanan oluyor.
  • Simdide bir bir uyari ile konuyu bittirecem Object,String,Long,Short,Byte,Integer ,Double ,Float gibi siniflarde reference olusmalarina ragmen primitive tip gibi haraket eder sebeb aynende ozel bir durumda diyebiliriz bu siniflar her olusturulan degisken iciin bir adres olusturur ve birini digerine atadiginizda ancak deger atanir adreslerde bir degisiklik olmaz.
 

 public class Test {

       public static void main(String[] args) {
             String d = new String("Abdulkadir");
             System.out.println("Before d = " + d);
             modify(d);
             System.out.println("After d = " + d);
      }

      static void modify(String s) {
             s = s + " Selcukoglu";
            System.out.println("Modify = " + s);
       }
}


//Console Output 
Before d = Abdulkadir
Modify = Abdulkadir Selcukoglu
After d = Abdulkadir


Uygulamadanda gorulduyu gibi ilk deger Abdulkadir ve daha sonra modify methodunda deger bir digerine atanmasina ragmen yapilan degislikten atkilanmiyor

Bu konu ile ilgili guzel bir uygulama daha
public class Laser {
       public static void main(String[] args) {
             Box b1 = new Box(5);
             Box[] ba = go(b1, new Box(6));
             ba[0] = b1;
             for (Box b : ba) {
                  System.out.print(b.size + " ");
             }
       }
       
       static Box[] go(Box b1, Box b2) {
              b1.size = 4;
              Box[] ma = {b2, b1};
              return ma;
       }
}

//Console Output
4 4 

No comments:

Post a Comment