亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java 是傳值還是傳引用

2019-11-18 13:24:18
字體:
來源:轉載
供稿:網友

  1. 簡單類型是按值傳遞的
    java 方法的參數是簡單類型的時候,是按值傳遞的 (pass by value)。這一點我們可以通過
  一個簡單的例子來說明:
  
  /* 例 1 */
  /**
   * @(#) Test.java
   * @author fancy
   */
  public class Test {
   public static void test(boolean test) {
   test = ! test;
   System.out.  String b = a;
    這里,a 和 b 是不同的兩個引用,我們使用了兩個定義語句來定義它們。但它們的值是一樣
  的,都指向同一個對象 "Hello"。也許你還覺得不夠直觀,因為 String 對象的值本身是不可更
  改的 (像 b = "World"; b = a; 這種情況不是改變了 "World" 這一對象的值,而是改變了它的
  引用 b 的值使之指向了另一個 String 對象 a)。那么我們用 StringBuffer 來舉一個例子:
  
  
  /* 例 2 */
  /**
   * @(#) Test.java
   * @author fancy
   */
  public class Test {
   public static void main(String[] args) {
   StringBuffer a = new StringBuffer("Hello");
   StringBuffer b = a;
   b.append(", World");
   System.out.println("a is " + a);
   }
  }
    運行結果:
  
  a is Hello, World
    這個例子中 a 和 b 都是引用,當改變了 b 指示的對象的值的時候,從輸出結果來看,a 所
  指示的對象的值也改變了。所以,a 和 b 都指向同一個對象即包含 "Hello" 的一個
  StringBuffer 對象。
  
    這里我描述了兩個要點:
  
  1. 引用是一種數據類型,保存了對象在內存中的地址,這種類型即不是我們平時所說的簡單數據
  類型也不是類實例(對象);
  2. 不同的引用可能指向同一個對象,換句話說,一個對象可以有多個引用,即該類類型的變
  量。
  3. 對象是如何傳遞的呢
    關于對象的傳遞,有兩種說法,即“它是按值傳遞的”和“它是按引用傳遞的”。這兩種說
  法各有各的道理,但是它們都沒有從本質上去分析,即致于產生了爭論。
  
    既然現在我們已經知道了引用是什么東西,那么現在不妨來分析一下對象作是參數是如何傳
  遞的。還是先以一個程序為例:
  
  /* 例 3 */
  /**
   * @(#) Test.java
   * @author fancy
   */
  public class Test {
   public static void test(StringBuffer str) {
   str.append(", World!");
   }
   public static void main(String[] args) {
   StringBuffer string = new StringBuffer("Hello");
   test(string);
   System.out.println(string);
   }
  }
    運行結果:
  
  Hello, World!
    test(string) 調用了 test(StringBuffer) 方法,并將 string 作為參數傳遞了進去。這
  里 string 是一個引用,這一點是勿庸置疑的。前面提到,引用是一種數據類型,而且不是對
  象,所以它不可能按引用傳遞,所以它是按值傳遞的,它么它的值究竟是什么呢?是對象的地
  址。
  
    由此可見,對象作為參數的時候是按值傳遞的,對嗎?錯!為什么錯,讓我們看另一個例
  子:
  
  /* 例 4 */
  /**
   * @(#) Test.java
   * @author fancy
   */
  public class Test {
   public static void test(String str) {
   str = "World";
   }
   public static void main(String[] args) {
   String string = "Hello";
   test(string);
   System.out.println(string);
   }
  }
    運行結果:
  
  Hello
    為什么會這樣呢?因為參數 str 是一個引用,而且它與 string 是不同的引用,雖然它們都
  是同一個對象的引用。str = "World" 則改變了 str 的值,使之指向了另一個對象,然而 str
  指向的對象改變了,但它并沒有對 "Hello" 造成任何影響,而且由于 string 和 str 是不同的
  引用,str 的改變也沒有對 string 造成任何影響,結果就如例中所示。
  
    其結果是推翻了參數按值傳遞的說法。那么,對象作為參數的時候是按引用傳遞的了?也
  錯!因為上一個例子的確能夠說明它是按值傳遞的。
  
    結果,就像光到底是波還是粒子的問題一樣,Java 方法的參數是按什么傳遞的問題,其答案
  就只能是:即是按值傳遞也是按引用傳遞,只是參照物不同,結果也就不同。
  
  4. 正確看待傳值還是傳引用的問題
    要正確的看待這個問題必須要搞清楚為什么會有這樣一個問題。
  
    實際上,問題來源于 C,而不是 Java。
  
    C 語言中有一種數據類型叫做指針,于是將一個數據作為參數傳遞給某個函數的時候,就有
  兩種方式:傳值,或是傳指針,它們的區別,可以用一個簡單的例子說明:
  
  /* 例 5 */
  /**
   * @(#) test.c
   * @author fancy
   */
  void SwapValue(int a, int b) {
   int t = a;
   a = b;
   b = t;
  }
  void SwapPointer(int * a, int * b) {
   int t = * a;
   * a = * b;
   * b = t;
  }
  void main() {
   int a = 0, b = 1;
   printf("1 : a = %d, b = %d/n", a, b);
   SwapValue(a, b);
   printf("2 : a = %d, b = %d/n", a, b);
   SwapPointer(&a, &b);
   printf("3 : a = %d, b = %d/n", a, b);
  }
    運行結果:
  
  1 : a = 0, b = 1
  2 : a = 0, b = 1
  3 : a = 1, b = 0
    大家可以明顯的看到,按指針傳遞參數可以方便的修改通過參數傳遞進來的值,而按值傳遞
  就不行。
  
    當 Java 成長起來的時候,許多的 C 程序員開始轉向學習 Java,他們發現,使用類似
  SwapValue 的方法仍然不能改變通過參數傳遞進來的簡單數據類型的值,但是假如是一個對象,
  則可能將其成員隨意更改。于是他們覺得這很像是 C 語言中傳值/傳指針的問題。但是 Java 中
  沒有指針,那么這個問題就演變成了傳值/傳引用的問題??上⑦@個問題放在 Java 中進行討論
  并不恰當。
  
    討論這樣一個問題的最終目的只是為了搞清楚何種情況才能在方法函數中方便的更改參數的
  值并使之長期有效。
  
    Java 中,改變參數的值有兩種情況,第一種,使用賦值號“=”直接進行賦值使其改變,如
  例 1 和例 4;第二種,對于某些對象的引用,通過一定途徑對其成員數據進行改變,如例 3。對
  于第一種情況,其改變不會影響到方法該方法以外的數據,或者直接說源數據。而第二種方法,
  則相反,會影響到源數據——因為引用指示的對象沒有變,對其成員數據進行改變則實質上是改
  變的該對象。
  
  5. 如何實現類似 swap 的方法
    傳值還是傳引用的問題,到此已經算是解決了,但是我們仍然不能解決這樣一個問題:假如
  我有兩個 int 型的變量

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品久久亚洲高清不卡| 欧美—级a级欧美特级ar全黄| 91av在线播放视频| 亚洲一区二区在线| 久久久久久久久久久网站| 欧美美女15p| 黑人巨大精品欧美一区二区免费| 色与欲影视天天看综合网| 丝袜美腿亚洲一区二区| 粗暴蹂躏中文一区二区三区| 久久久久一本一区二区青青蜜月| 91久久精品在线| 国产精彩精品视频| 欧美成人精品激情在线观看| 亚洲成avwww人| 九九久久久久99精品| 亚洲日韩欧美视频| 日韩精品在线免费观看| 国产成人综合久久| 中文字幕免费国产精品| 欧美一区深夜视频| 在线观看成人黄色| 日韩美女视频在线观看| 午夜精品一区二区三区在线视频| yellow中文字幕久久| 亚洲精品99999| 国产日韩欧美中文| 在线视频欧美性高潮| 亚洲午夜精品久久久久久久久久久久| 亚洲欧美日韩精品| 国产精品亚洲片夜色在线| 欧美资源在线观看| 精品国产成人在线| 欧美激情第99页| 美女福利视频一区| 伊人久久久久久久久久久久久| 久久天天躁狠狠躁夜夜躁2014| 亚洲精品资源在线| 成人午夜高潮视频| 国产精品福利久久久| 国产成人精品优优av| 欧美成年人视频网站| 久久99热这里只有精品国产| 国产精品7m视频| 午夜精品一区二区三区视频免费看| 国产精品露脸av在线| 亚洲精品小视频| 欧美午夜电影在线| 超碰91人人草人人干| 97视频免费观看| 亚洲韩国欧洲国产日产av| 亚洲一区二区久久久久久| 岛国精品视频在线播放| 亚洲人成亚洲人成在线观看| 成人激情视频网| 国产欧美精品日韩精品| 欧美日韩在线视频一区| 欧美精品一区在线播放| 久久人91精品久久久久久不卡| 亚洲成人精品av| 亚洲精品日韩激情在线电影| 一本久久综合亚洲鲁鲁| 成人精品一区二区三区电影黑人| 国产精品网站入口| 亚洲精选在线观看| 亚洲欧美成人一区二区在线电影| 亚洲精品网站在线播放gif| 欧美高清视频在线| 亚洲视频在线免费观看| 91九色精品视频| 亚洲欧洲在线看| 亚洲免费av电影| 欧美第一页在线| 亚洲的天堂在线中文字幕| 日韩一区二区久久久| 久久免费视频这里只有精品| 欧美黄色成人网| 中文精品99久久国产香蕉| 日本道色综合久久影院| 亚洲午夜av电影| 欧美日韩在线一区| 91在线免费网站| 久久综合免费视频影院| 日本aⅴ大伊香蕉精品视频| 正在播放亚洲1区| 国内精品小视频在线观看| 91视频国产高清| 久久久久亚洲精品| 日韩中文字幕在线精品| 亚洲黄色片网站| 国产精品青青在线观看爽香蕉| 久久久亚洲精品视频| 亚洲视频一区二区三区| 亚洲一区二区三区四区视频| 尤物精品国产第一福利三区| 亚洲成av人乱码色午夜| 亚洲韩国欧洲国产日产av| 久久精品久久久久久国产 免费| 欧美成人午夜剧场免费观看| 欧美乱大交xxxxx另类电影| 性欧美激情精品| 九九精品在线播放| 成人激情视频在线观看| 欧美精品免费看| 欧美午夜精品久久久久久久| 51ⅴ精品国产91久久久久久| 亚洲三级黄色在线观看| 色先锋资源久久综合5566| 欧美成人三级视频网站| 97香蕉超级碰碰久久免费的优势| 久久九九全国免费精品观看| 国产精品18久久久久久麻辣| 亚洲第一福利网| 亚洲一区二区在线| 成人免费视频网| 欧美日韩国产综合新一区| 韩剧1988在线观看免费完整版| 亚洲毛片在线免费观看| 亚洲欧美国产va在线影院| 亚洲97在线观看| 日韩精品视频三区| 亚洲自拍高清视频网站| 日韩欧美国产成人| 中文字幕在线亚洲| 亚洲欧美国内爽妇网| 国产精品毛片a∨一区二区三区|国| 成人在线一区二区| 欧美极品美女视频网站在线观看免费| 国产精品av免费在线观看| 欧美一区二区色| 午夜精品一区二区三区av| 日韩h在线观看| 国产一区二区三区网站| 亚洲人成在线播放| 国产小视频91| 亚洲精品在线观看www| 国产一区二区三区在线看| 国产精品成人久久久久| 一区二区三区国产在线观看| 日韩精品久久久久久福利| 欧美性xxxxxx| 在线看福利67194| 在线观看不卡av| 欧美巨乳在线观看| 欧洲成人午夜免费大片| 日韩精品福利在线| 欧洲亚洲女同hd| 秋霞av国产精品一区| 欧美电影在线免费观看网站| 美女扒开尿口让男人操亚洲视频网站| 日韩人体视频一二区| 欧美激情免费观看| 中文字幕日韩欧美在线视频| 国产精品久久久久久久久久久久久| 2021久久精品国产99国产精品| 热久久这里只有精品| 亚洲一区二区少妇| 欧美精品精品精品精品免费| 精品夜色国产国偷在线| www.欧美三级电影.com| 国产成人精彩在线视频九色| 国产精品一区二区久久久久| 久久在线免费观看视频| 不卡av在线播放|