關於Java函數傳參以及參數在函數內部改變的問題——JAVA值傳遞與引用最淺顯的說明!


  看了很多關於闡述JAVA傳參到底是值傳遞還是引用的問題,有些說得很膚淺讓人感覺似懂非懂的感覺,但是好像又能解決一些問題,然后就止步了。還有一些則是,講得很深奧,看着好像很有道理的樣子,但是其實還是沒怎么懂。

  今天再次碰到這個問題時,自己再反思了一下,個人對於一個問題的解決思路,突然覺得大部分人都是碰到問題就去百度,沒有去思考這些問題的根本,我們大部分人都缺少獨立思考的能力。我一直覺得,所有一切的知識都是一種參考,最最重要的是你以什么方式去保存到大腦里面,是臨時的內存保存,還是稍微深刻的硬盤保存,還是再加個快捷方式直達目的?所以,我想以自己的獨立思考的方式去分析這個問題。

 

一,為什么會有這樣的問題?

  歸根到底是學習了C語言的緣故,因為C的指針問題一直是一個比較難啃的骨頭,也因為難啃所以就成了考試的難點和重點,於是莘莘學子就去攻占,然而大部分情況大家都知道,學校里學的知識雖然很有用,很基礎,但是我們大部分人僅僅用它來考試而已(現在后悔了還來得及!)……到了真正要用完全是兩碼事,最好的教科書就是百度,而搜索出來的一些“大神”,顯然並不是都是大神,至少很多並沒有考慮到問題的根本原因,就開始各種摘剪(特別是,當大家碰到問題開始大量搜索文章時就會發現這個問題),而一傳十,十傳百后,就是各種混亂……

 

二,怎么解決這個問題?

下面是用於舉例的函數

 public int change(int i) {
    i = 111;
    return i;
  }

  public User change(User user) {
    user = new User("Jim","Green");
user.setAge(16);
return user; }

  首先,要明確一點,為什么會有引用?因為有指針!Java有指針嗎?表面上是沒有,但是你要知道幾乎所有的高級語言,底層都是用C寫的。Java沒有指針這類說法是因為Java把指針封裝起來了,減少程序員對指針的復雜的操作,所以Java就沒有引用這個概念,然后就出現了網上說的Java的傳參都是值傳遞!這是事實,因為你(這個你是指程序猿而不是JAVA)沒機會用到指針唄!然而並沒有什么卵用!至少對於你理解內存這一塊沒任何幫助,因為在Java內部確實是有指針操作的。

三,怎么解釋這個問題?

  一號問題,值傳遞到底有什么意思?簡單的意思就是你把一個參數傳到函數里面去,傳進去的是這個參數的值(參數的復制品),而不是這個參數的本身!比如你傳了個int a=10;的a到函數里面去,實際是相當於傳了個i=a到函數里面去(注意:i是i,a是a,它們是獨立存在的!),函數外a是什么還是什么!無論你在函數里面怎么賦值,都不會影響到外面的數!記住僅僅是賦值沒有影響!

  二號問題,為什么僅僅是賦值沒有影響。要解釋這個問題,還得回到指針這個原始位置(這個是理解這個問題的根本所在!)。首先對於像int,char,long之類不是對象的基本數據類型,就不說了,因為它們只有賦值操作,所以它們肯定是不會反生任何改變的(參考解釋在下面)。

  但是對於對象類型的參數,要是離開指針去解釋,那沒有任何人可以解釋,因為這是根本!

  依舊拿上面的例子來說,你傳入一個User.class類型的參數進來(命名為User tom= new User(“Tom”,“Smith”);)所指的內存是TomMemory。

  函數內部就會有一個獨立的變量user(注意,不要因為你函數外部有個變量是User user = new User();就把它們當作一樣的user!它們不一樣!是獨立的!)。

  此時,傳進來那個刻(還沒到函數體的時候)是這樣的:user -> TomMemory;外部的當然依舊是tom=TomMemory;

  1,如果你進行賦值操作,比如例子中的user = new User(“Jim”,“Green”);那就變成了user -> JimMemory,后面對user的任何操作,都是基於JimMemory的操作。然后你返回的user當然也是JimMemory,這跟TomMemory沒有任何關系啊!當然也就對函數外的tom沒有任何影響。上面說的基本數據類型,也是因為這個原理,賦值使得他們指向了不同的內存,兩個獨立內存當然就沒有什么影響了!

  2,如果不是賦值操作,而是set之類的改變傳入對象屬性的操作,那就生效了!為什么?原理同上!因為進來的時候,它們指向的是同一內存塊,user和tom都是指向TomMemory,而你直接通過user的方法去操作這個對象,就是直接操作TomMemory內存塊,那當然就有效啦。

 

  結束語

  盡量不要讓自己的思維局限於某個人所說的話,接受之前要加上一些自己的判斷力,至少能讓你在保存這部分知識不會產生太多知識碎片!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM