-- Java SE

Java Pass by Value

Pass-by-value ya da Pass-by-reference parametlerin metodlara ne şekilde geçirileceğini ifade eder. Pass-by-reference parametrenin heapteki gerçek adresini geçmek anlamına gelirken, Pass-by-value parametrenin bir kopyasını geçmek anlamına gelir. Bu hem primitive hem de reference tipler için geçerlidir.

Pass-by-value kısmına geçmeden önce java’da stack frame ve call stack nasıl çalışıyor incelemekte fayda var.

call stack = adresi ve local değişkenlerin tutulduğu memory.
stack frame = call stack üzerindeki metod tarafından kullanılan depo.

Aşağıdaki tabloda KM’yi Mil’e çeviren bir programın main metoda girdikten sonra call stack’taki ilk 8 değişimi gösterilmiştir. Aslında call stack’ta main metodtan önce de birşeyler var, ancak ilgilenmemiz gerekmiyor şimdilik.

Her kutu, koyu renkle belirtilen metod için call stacktaki depolanmış bilgiyi temsil ediyor. Bu bilgi bloğuna stack frame denir. Her stack frame ilgili metodun ismiyle, parametreleriyle ve local değişkenleriyle temsil ediliyor. Local değişkenin ne olduğunu bilmediğimizde ya da umursamadığımız zaman “???” ile ifade ediliyor. Her metodun bir stacki vardır ve metodlara geçilen parametreler bu stacklere pushlanır.

1 2 3 4 5 6 7 8
main
args
kms
miles
main
args
kms
miles
getDouble
prompt
str
main
args
kms
miles
getDouble
prompt
str
showInputDialog
???
main
args
kms
miles
getDouble
prompt
str
mnai
args
kms
miles
getDouble
prompt
str
parseDouble
???
main
args
kms
miles
getDouble
prompt
str
main
args
kms
miles
main
args
kms
miles
convertKmToMi
kilometers
miles

Aşağıdaki kodlama üzerinden pass-by-value nasıl işliyor görelim:

Output

In main method adress [1] --> PassByReference@7f31245a
In main method value [1] --> First Value
In change method adress [1] --> PassByReference@7f31245a
In change method value [1] --> First Value
In change method value [2] --> New Value
In change method adress [2] --> PassByReference@6d6f6e28
In main method adress [2] --> PassByReference@7f31245a
In main method value [2] --> New Value

5. satırda oluşturulan object ile beraber bellekteki  7f31245a adresinde PassByRefence instance’ı olan object tutulmakta ve  value field’i “First Value” olarak set edilmiş.

8. satrda çağırılan change metoduna object’in bir kopyası geçilecek, metod içerisinde bu kopya olarak geçilen referans, metod dışarısında ise dış referans kullanılacak. 15. satıdaki print işleminden görüleceği üzere, her iki referans da aynı adresteki (7f31245a) nesneye işaret ediyor. Durum şu şekilde :

 
                                             ___________________________
method içerisindeki referans -------------  |PassbyRefenrece   instance |
                                            |        @7f31245a          |
main içindeki referans  ------------------  |__________________________ |

20. satırda atama işlemi yapıldı artık kopya referansımız bu yeni oluşturulan nesne yi(6d6f6e28) gösteriyor. Onda da durum şu şekilde :

                                            ___________________________
                                            |PassbyRefenrece   instance |
main içerisindeki referans -------------    |        @7f31245a          |
                                            |__________________________ |


                                            ___________________________
                                            |PassbyRefenrece   instance |
 method içerisindeki referans ------------- |        @6d6f6e28          |
                                            |__________________________ |


En sonda görüldüğü gibi orjinal nesnemizin adresi değişmedi (7f31245a) ancak 17. satırdaki işlemden dolayı yeni değer “New Value” olarak atandı.

 

 

 

Yorum bırak

Yorum