JAVA的值傳遞問題

為什么 Java 中只有值傳遞?

首先回顧一下在程序設計語言中有關將參數傳遞給方法(或函數)的一些專業術語。按值調用(call by value)表示方法接收的是調用者提供的值,而按引用調用(call by reference)表示方法接收的是調用者提供的變量地址。一個方法可以修改傳遞引用所對應的變量值,而不能修改傳遞值調用所對應的變量值。?它用來描述各種程序設計語言(不只是Java)中方法參數傳遞方式。

Java程序設計語言總是采用按值調用。也就是說,方法得到的是所有參數值的一個拷貝,也就是說,方法不能修改傳遞給它的任何參數變量的內容。

下面通過 3 個例子來給大家說明

example 1

public static void main(String[] args) {int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); }

結果:

a = 20
b = 10
num1 = 10
num2 = 20

解析:

example 1

在swap方法中,a、b的值進行交換,并不會影響到 num1、num2。因為,a、b中的值,只是從 num1、num2 的復制過來的。也就是說,a、b相當于num1、num2 的副本,副本的內容無論怎么修改,都不會影響到原件本身。

通過上面例子,我們已經知道了一個方法不能修改一個基本數據類型的參數,而對象引用作為參數就不一樣,請看 example2.

example 2

	public static void main(String[] args) {int[] arr = { 1, 2, 3, 4, 5 }; System.out.println(arr[0]); change(arr); System.out.println(arr[0]); } public static void change(int[] array) { // 將數組的第一個元素變為0 array[0] = 0; }

結果:

1
0

解析:

example 2

array 被初始化 arr 的拷貝也就是一個對象的引用,也就是說 array 和 arr 指向的時同一個數組對象。 因此,外部對引用對象的改變會反映到所對應的對象上。

通過 example2 我們已經看到,實現一個改變對象參數狀態的方法并不是一件難事。理由很簡單,方法得到的是對象引用的拷貝,對象引用及其他的拷貝同時引用同一個對象。

很多程序設計語言(特別是,C++和Pascal)提供了兩種參數傳遞的方式:值調用和引用調用。有些程序員(甚至本書的作者)認為Java程序設計語言對對象采用的是引用調用,實際上,這種理解是不對的。由于這種誤解具有一定的普遍性,所以下面給出一個反例來詳細地闡述一下這個問題。

example 3

public class Test {public static void main(String[] args) { // TODO Auto-generated method stub Student s1 = new Student("小張"); Student s2 = new Student("小李"); Test.swap(s1, s2); System.out.println("s1:" + s1.getName()); System.out.println("s2:" + s2.getName()); } public static void swap(Student x, Student y) { Student temp = x; x = y; y = temp; System.out.println("x:" + x.getName()); System.out.println("y:" + y.getName()); } }

結果:

x:小李
y:小張
s1:小張
s2:小李

解析:

交換之前:

交換之后:

通過上面兩張圖可以很清晰的看出:?方法并沒有改變存儲在變量 s1 和 s2 中的對象引用。swap方法的參數x和y被初始化為兩個對象引用的拷貝,這個方法交換的是這兩個拷貝

總結

Java程序設計語言對對象采用的不是引用調用,實際上,對象引用是按 值傳遞的。

下面再總結一下Java中方法參數的使用情況:

  • 一個方法不能修改一個基本數據類型的參數(即數值型或布爾型》
  • 一個方法可以改變一個對象參數的狀態。
  • 一個方法不能讓對象參數引用一個新的對象。
?

轉載于:https://www.cnblogs.com/yangjinprocess/p/10112280.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序如何封裝自定義組件(Toast)

1、創建和pages 同級的component目錄新建一個myToast目錄 例如: 2、myToast.wxml文件內容: <!-- 自定義toast組件 --> <!-- name 模塊名稱 --><template name"toast" ><!-- catchtouchmove‘xxx’ 遮罩層的滾動穿透 --><!-- isHide 顯示…

2017 百度杯丶二月場第一周WP

1.禍起北荒 題目&#xff1a; 億萬年前 天子之子華夜&#xff0c;被父神之神末淵上神告知六荒十海之北荒西二旗即將發生一場“百度杯”的諸神之戰 他作為天族的太子必須參與到此次諸神之戰定六荒十海 華夜臨危受命&#xff0c;馬上帶著火鳳凰飛行到北荒“西二旗” 卻沒想到這六…

docker保存對容器的修改

Docker 子命令: attach commit diff export history import insert kill login port pull restart rmi save start tag version build cp events help images info inspect load logs ps …

中國涉5.9億份簡歷信息泄露

據美國科技媒體ZDNet報道&#xff0c;有研究人員發現&#xff0c;中國企業今年前3個月出現數起簡歷信息泄漏事故&#xff0c;涉及5.9億份簡歷。大多數簡歷之所以泄露&#xff0c;主要是因為MongoDB和ElasticSearch服務器安全措施不到位&#xff0c;不需要密碼就能在網上看到信息…

阿里云亮相2019聯通合作伙伴大會,邊緣計算等3款云產品助力5G時代產業數字化轉型...

4月23日&#xff0c;2019中國聯通合作伙伴大會在上海正式開幕&#xff0c;本次大會以“合作不設限&#xff0c;共筑新生態”為主題&#xff0c;涉及5G、邊緣計算、云計算、物聯網、新媒體、人工智能、互聯網化等各領域超過600家合作伙伴與3萬名各行業觀眾參會。據了解&#xff…

hadoop2.7 偽分布

hadoop 2.7.3偽分布式環境運行官方wordcounthadoop 2.7.3偽分布式模式運行wordcount 基本環境&#xff1a; 系統&#xff1a;win7 虛機環境&#xff1a;virtualBox 虛機&#xff1a;centos 7 hadoop版本&#xff1a;2.7.3 本次以偽分布式模式來運行wordcount。 參考&#xff1a…

iPhone手機屏幕尺寸(分辨率)

第一代iPhone2G屏幕為3.5英吋&#xff0c;分辨率為320*480像素&#xff0c;比例為3:2。 第二代iPhone3G屏幕為3.5英吋&#xff0c;分辨率為320*480像素&#xff0c;比例為3:2。 第三代iPhone3GS屏幕為3.5英吋&#xff0c;分辨率為320*480像素&#xff0c;比例為3:2。 第四代iPh…

[Java in NetBeans] Lesson 06. Custom classes

這個課程的參考視頻和圖片來自youtube。 主要學到的知識點有&#xff1a; Constructors: A special method called when an object of the class is createdproperty pattern and encapsulation(封裝): hide the implementation details from the user, so when the class is b…

UDP打洞NAT大致分為下面四類 P2P

NAT大致分為下面四類 1) Full Cone 這種NAT內部的機器A連接過外網機器C后,NAT會打開一個端口.然后外網的任何發到這個打開的端口的UDP數據報都可以到達A.不管是不是C發過來的. 例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88 A(192.168.8.100:5000) -> NAT(202.1…

讓內核突破512字節的限制

轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/10124237.html

高頻算法面試題(字符串) 242. 有效的字母異位詞

leetcode 242. 有效的字母異位詞 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的一個字母異位詞。示例 1: 輸入: s "anagram", t "nagaram" 輸出: true 復制代碼示例 2: 輸入: s "rat", t "car" 輸出: fals…

struts2的漏洞

文章前半部分來自團隊小伙伴阿德馬的總結&#xff0c;后半部分的Poc和Exp是小編匆忙之際借鑒而來&#xff0c;感謝寫Poc和Exp的伙伴~ 安恒給官方上報的&#xff0c;然后官方選擇了1個對國內來說比較敏感的時期發了公告出來&#xff0c;好蛋疼。 該漏洞的CVE編號是CVE-2017-56…

Java Statement PK PrepareStatement

PreparedStatement是用來執行SQL查詢語句的API之一&#xff0c;Java提供了 Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句&#xff0c;其中 Statement 用于通用查詢&#xff0c; PreparedStatement 用于執行參數化查詢&#xff0c;而 CallableStat…

mysql在linux 下安裝

安裝環境&#xff1a;系統是 centos6.5 1、下載 下載地址&#xff1a;http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下載版本&#xff1a;我這里選擇的5.6.33&#xff0c;通用版&#xff0c;linux下64位 也可以直接復制64位的下載地址&#xff0c;通過命令下載&a…

Leetcode PHP題解--D47 868. Binary Gap

2019獨角獸企業重金招聘Python工程師標準>>> D47 868. Binary Gap 題目鏈接 868. Binary Gap 題目分析 給定一個數字&#xff0c;計算其二進制表示中&#xff0c;出現的兩個1最大距離。 思路 當然是先轉換成二進制了。再進行遍歷。 當只有一個1時&#xff0c;返回0。…

[洛谷P5048][Ynoi2019模擬賽]Yuno loves sqrt technology III

題目大意&#xff1a;有$n(n\leqslant5\times10^5)$個數&#xff0c;$m(m\leqslant5\times10^5)$個詢問&#xff0c;每個詢問問區間$[l,r]$中眾數的出現次數 題解&#xff1a;分塊&#xff0c;設塊大小為$S$&#xff0c;先可以預處理出兩兩塊之間的眾數出現次數&#xff0c;復雜…

C#接口實現多態

我比較喜歡對感興趣的理論進行反復的理解甚至理解背誦下來&#xff0c;接下來再復習一下什么叫多態&#xff08;哈哈哈&#xff09; 多態&#xff1a;在同一粒度視圖下對相同類型的事物不做區別的統一處理 接下來看一下接口和引擎類是如何實現多態的&#xff1a; 一、 1、創建了…

docker 網絡 不好用 docker: Error response from daemon: failed to create endpoint jovial_wing on network b

啟動容器時&#xff0c;有可能會遇到如下問題&#xff0c;比如啟動redis容器&#xff1a; sudo docker run -d -p 6379:6379 --name redis redis:latest Linux代碼docker: Error response from daemon: failed to create endpoint redis on network bridge: iptables failed: …

hadoop-hdfs-存儲模型-架構模型-角色介紹

轉載于:https://www.cnblogs.com/LXL616/p/10803978.html

docker 鏡像 導入導出

很喜歡玩docker&#xff0c;但最新遇到一個問題&#xff0c;公司給的新機器的dns有問題&#xff0c;導致pull不下來鏡像。 沒辦法了&#xff0c;沒有鏡像什么神馬都干不了&#xff0c;又不能花很多時間去搭建私有的鏡像庫&#xff0c;只有另尋辦法了。 廢話少說&#xff0c;經…