Java如何在調用方法時,同時改變實參的值?即形參改變實參。

Posted gavinjoeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何在調用方法時,同時改變實參的值?即形參改變實參。相关的知识,希望对你有一定的参考价值。

關鍵點:
實參:如果是基本類型,則實參不會變(傳的是值);如果是引用類型,則實參會改變(傳的是地址)。

具體實例和分析如下:

  1. 傳入參數為基本類型的變量

public class Java{
public static void main(String[] args){
int b =5;
changeInt(b);
System.out.println(b);
}

       public static int changeInt(int a){
             a =10;
             return a;
          }
      }
      // changeInt(b)之后输出的是5。

為什麼把b傳到changeInt()方法中之後,b的值沒有被修改為10?因為,基本類型和String均為值傳遞,想要實現你的需求只能改用物件,當然也可以使用集合類比如Map,或者陣列(這個比較方便)。也就是說,傳入參數為字串變數時同樣如此。
說明:在java類執行時,基本類型變數是存儲在棧中的,壓棧順序:
(1)主方法壓棧->(2)變數b壓棧->(3)靜態方法changeInt壓棧->(4)壓棧參數並修改為10->(5)退出changeInt方法,並彈出changeInt方法及其作用域內的資料->(6) 退出main方法。
列印結果5是列印經過方法修改為10後,退出方法後列印的變數的值,由於基底資料型別存儲在棧中,因此退出方法後,變數的值仍然是變數最初所在棧位置的值5.

    //2) 傳入的形參是對象
    public class Java{
    public static void main(String[] args)
      {
   int b =5;
   b = changeInt(b);
   System.out.println(b);
     }

     public static int changeInt(int a){
   a = 10;
   return a;
     }
    }
    //changeInt(b)之后输出的是10。

    3) 傳入的形參是陣列
    public class Java{

    public static void main(String[] args){

               int[]a = {23,57};
               print(a);
               test(a);
               print(a);
       }

     public static void test(int[] num){ //顛倒陣列
    inttemp = 0;
    for(inti = 0;i < num.length/2; i++){
        temp= num[i];
        num[i]= num[num.length - 1 - i];
        num[num.length- 1 - i] = temp;
         }
      }

      public static void print(int[] num){ //列印陣列

    for(inti = 0; i < num.length; i++){
        System.out.print(num[i]+"");
    }
    System.out.println();
     }
    }
  //  輸出:

     23 57

     57 23

為什麼在這裡方法退出後,變數的值變不回去了呢?
說明:在java中,陣列是參考類型變數,可以看成是一個物件,在創建一個陣列時,和創建一個新的物件時同樣的道理(畢竟創建時使用new關鍵字了),這個物件存放在堆記憶體中,棧記憶體中只是存放了它的位置索引(即在堆記憶體中的位置,相當於棧中放了它的門牌號),這樣在test方法中引用了陣列變數,同樣是通過棧中存放的位置索引找到這個變數在堆記憶體中的位置,然後進行修改操作,test方法可不是將它重新壓到棧中再修改的,是直接在堆中改,直接在堆中改,直接在堆中改(重要的事情說三遍),然後很淡定的退出了test方法,它是退出沒事了,堆中的陣列變數已經被不可逆轉的修改了,因此test方法前和方法後列印出來的陣列內容是不一樣的。

以上是关于Java如何在調用方法時,同時改變實參的值?即形參改變實參。的主要内容,如果未能解决你的问题,请参考以下文章

以前的笔记迁移__形參,实參,递归

php函数,static,globalkeyword及三种变量作用域

阿里云建博客笔记

《编程导论(Java)&#183;3.3.2 按值传递语义》

c 数组做为形參时 该參数退化为指针

list方法總結