程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java辦法參數是援用挪用照樣值挪用?

Java辦法參數是援用挪用照樣值挪用?

編輯:關於JAVA

Java辦法參數是援用挪用照樣值挪用?。本站提示廣大學習愛好者:(Java辦法參數是援用挪用照樣值挪用?)文章只能為提供參考,不一定能成為您想要的結果。以下是Java辦法參數是援用挪用照樣值挪用?正文


辦法挪用(call by) 是一個尺度的盤算機迷信術語。辦法挪用依據參數傳遞的情形又分為值挪用( call by reference ) 和援用挪用( call by value ) 。江湖上有許多關於這兩種挪用的界說 ,最平日的說法是傳遞值的是值挪用,傳遞地址的是援用挪用。這其實很不適當,這類 這些說法很輕易讓我們聯想到Java的對象參數傳遞是援用挪用,現實上,Java的對象參數傳遞依然是值挪用 。

我們起首用一段代碼來證明一下為何Java的對象參數傳遞是值挪用。

public class Employee { 

  public String name=null; 

  public Employee(String n){ 
    this.name=n; 
  } 
  //將兩個Employee對象交流 
  public static void swap(Employee e1,Employee e2){ 
    Employee temp=e1; 
    e1=e2; 
    e2=temp; 
        System.out.println(e1.name+" "+e2.name); //打印成果:李四 張三 
  } 
  //主函數 
  public static void main(String[] args) { 
    Employee worker=new Employee("張三"); 
    Employee manager=new Employee("李四"); 
    swap(worker,manager); 
    System.out.println(worker.name+" "+manager.name); //打印成果依然是: 張三 李四 
  } 
} 

下面的成果讓人很掉望,固然形參對象e1,e2的內容交流了,但實參對象worker,manager並沒有交換內容。這外面最主要的緣由就在於形參e1,e2是實參worker,manager的地址拷貝。

年夜家都曉得,在Java中對象變量名現實上代表的是對象在堆中的地址(專業術語叫做對象援用 )。在Java辦法挪用的時刻,參數傳遞的是對象的援用。主要的是,形參和實參所占的內存地址其實不一樣,形參中的內容只是實參中存儲的對象援用的一份拷貝。

假如年夜家對JVM內存治理中Java棧 的部分變量區 有所懂得的話(可以拜見《 Java 虛擬機系統構造 》),就很好懂得下面這句話。在JVM運轉下面的法式時,運轉main辦法和swap辦法,會在Java棧中前後push兩個叫做棧幀 的內存空間。main棧幀中有一塊叫部分變量區的內存用來存儲實參對象worker和manager的援用。而swap棧幀中的部分變量區則存儲了形參對象e1和e2的援用。固然e1和e2的援用值分離與worker和manager雷同,然則它們占用了分歧的內存空間。當e1和e2的援用產生交流時,上面的圖很清楚的看出完整不會影響worker和manager的援用值。

Java對象參數傳遞固然傳遞的是地址(援用),但依然是值挪用。是時刻須要給援用挪用和值挪用一個精確的界說了。

值挪用(call by value): 在參數傳遞進程中,形參和實參占用了兩個完整分歧的內存空間。形參所存儲的內容是實參存儲內容的一份拷貝。現實上,Java對象的傳遞就相符這個界說,只不外形參和實參所貯存的內容其實不是慣例意義上的變量值,而是變量的地址。咳,回過火想一想:變量的地址不也是一種值嗎!

援用挪用(call by reference) : 在參數傳遞的進程中,形參和實參完整是統一塊內存空間,二者不分彼此。 現實上,形參名和實參名只是編程中的分歧符號,在法式運轉進程中,內存中存儲的空間才是最主要的。分歧的變量名其實不能解釋占用的內存存儲空間分歧。

年夜體上說,兩種挪用的基本其實不在於傳遞的是值照樣地址(究竟地址也是一個值),而是在於形參和實參能否占用統一塊內存空間。現實上,C/C++的指針參數傳遞也是值挪用,不信嘗嘗上面的C代碼吧!

#include<stdio.h> 
void swap(int *a1,int *b1){ 
  int *t=a1; 
  a1=b1; 
  b1=t; 
} 
int main(){ 
  int x1=100; 
  int x2=200; 
    int *a=&x1; 
  int *b=&x2; 
  printf("%d %d\n",*a,*b); 
  swap(a,b); 
  printf("%d %d\n",*a,*b); 
  return 0; 
} 

但C/C++是有援用挪用的,這就是C/C++一種叫做援用的變量聲明辦法: int a; int &ra=a; 個中ra是a的別號,二者在內存中沒有差別,占用了統一個內存空間。而經由過程援用(別號)的參數傳遞就相符援用挪用的特色了。年夜家可以去嘗嘗void swap(int &a1,int &b1);的運轉成果。

經由過程本文年夜家應當曉得Java辦法參數是援用挪用照樣值挪用了吧。

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