程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 討論Java中函數是值傳遞還是援用傳遞問題

討論Java中函數是值傳遞還是援用傳遞問題

編輯:關於JAVA

討論Java中函數是值傳遞還是援用傳遞問題。本站提示廣大學習愛好者:(討論Java中函數是值傳遞還是援用傳遞問題)文章只能為提供參考,不一定能成為您想要的結果。以下是討論Java中函數是值傳遞還是援用傳遞問題正文


置信有些同窗跟我一樣,已經對這個問題很疑惑。在網上也看了一些他人說的觀念,評論不一。有說有值傳遞和援用傳遞兩種,也有說只要值傳遞的,這裡只說下團體見地

先給大家引見下概念

值傳遞:(方式參數類型是根本數據類型):辦法調用時,實踐參數把它的值傳遞給對應的方式參數,方式參數只是用實踐參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以辦法執行中方式參數值的改動不影響實踐參數的值。

援用傳遞:(方式參數類型是援用數據類型參數):也稱為傳地址。辦法調用時,實踐參數是對象(或數組),這時實踐參數與方式參數指向同一個地址,在辦法執行中,對方式參數的操作實踐上就是對實踐參數的操作,這個後果在辦法完畢後被保存了上去,所以辦法執行中方式參數的改動將會影響實踐參數。

先看一個例子

public class Test1 {
  public static void main(String[] args) {
  int a = 10;
  changeNum(a);
  System.out.println("main a=" + a);
 }
  static void changeNum(int a) {
  a = 100;
  System.out.println("changeNum a=" + a);
 }
}

後果:

changeNum a=100
main a=10

闡明關於根本的數值類型其實傳遞的是一份數值的拷貝,傳入函數之後跟原來的值就沒有關系了,在函數中改動這個數的值也不會影響到原來的值。

再看一個例子

public class P {
 String name = "P";
 public P(String name) {
  this.name = name;
 }
 @Override
 public String toString() {
  return name;
 }
}
 public class Test {
 static P p1 = new P("p1");
 public static void main(String[] args) {
  P p = new P("P");
     System.out.println("before change p:" + p.toString);
  changeObj(p);
  System.out.println("after change p:" + p.toString());
 }
  static void changeObj(P p) {
  p = new P("pp");
  System.out.println("change p:" + p.toString());
  //p = p1;
  //System.out.println(p.toString());
 }
}

這個例子中的運轉後果會是什麼呢?

在這個例子中傳入的是一個對象類型的數據。

我們先來猜測一下:假如傳入的是一個對象的援用,在函數中改動了這個援用所指向的對象,那麼內部的援用"p"應該是指向了新創立的P("pp")的對象才對

所以猜測的後果是:

before change p:P
change p:pp
after change p:pp

那讓我們來實踐運轉一下看看後果,實踐的後果是:

before change p:P
change p:pp
after change p:P

想猜測的不一樣!!!

這就讓我們很疑惑了,為什麼函數沒有改動援用所指向對象呢?

其實是這樣的,首先要了解“=”賦值操作的意義,

關於根本類型來說“=”賦值操作是直接改動內存地址上的值,

而對援用類型來說“=”賦值其實是改動援用變量所指向的內存地址。

賦值操作後

援用的賦值並沒有對原來的對象形成影響,"hello"對象依然是存在的,只是str又指向了新的"world"對象

了解了賦值操作後,如今來說下函數的參數傳遞

 函數的參數實踐上就是函數外部的一個部分變量,從內部傳值給這個參數實踐上就是一個賦值的進程。

來看看第一個例子,傳一個定義一個int類型稱號為a的方式參數,其實完全可以把稱號改為b

然後把內部變量a的值傳遞給函數的變量,就是賦值。根本類型的賦值就是把內部a變量的10賦值給函數變量a,所以這其實是兩個變量,兩者之間沒有任何關系,

所以對函數外部變量的改動也不會對內部的變量形成影響。

再來說下援用類型的傳遞,其實是一個道理。

在傳遞的時分是把一個對象的內存地址賦值給函數外部的援用類型的部分變量

如上圖所示,兩個變量是指向同一個對象的。

在第二個例子中,我們在函數外部新創立了一個對象,偏重新賦值給外部變量p,其實是改動了外部變量的援用所指向的對象,如下圖所示

所以對內部的p變量是沒有影響的。

總結:

函數參數傳遞其實是一個賦值的進程,根本類型傳遞的是數值,援用類型傳遞的援用對象的內存地址。

另外一點要特別留意,函數的參數其實是函數外部的部分變量。不要跟內部變量混雜.

以上所述是給大家引見的Java中函數是值傳遞還是援用傳遞問題,希望對大家有所協助,假如大家有任何疑問請給我留言,會及時回復大家的。在此也十分感激大家對網站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved