本文目錄一覽:
- 1、java中,向方法傳遞對象引用變數是按值傳遞,其中有修改變數和修改對象的問題,
- 2、java 聲明兩個對象,指向一個引用,然後一個對象改變屬性,另一個對象的屬性也變了,直接上代碼
- 3、在java中,引用數據不就是一種對象么?為什麼在調用函數中不能進行修改數值??
- 4、java變數 值的改變 問題
java中,向方法傳遞對象引用變數是按值傳遞,其中有修改變數和修改對象的問題,
傳值傳引用都不夠準確,可以理解成傳引用變數的副本值。引用變數分為字面值引用變數(即基本數據類型引用變數)和對象引用變數 。 詳情需要了解數據類型使用機制和堆棧的概念:
對象引用變數:即普通java對象的引用變數 ,如 String a = “abc” , a就是對象引用變數。java 是不能直接操作對象的,只能通過對「對象引用的操作」來操作對象。而對象的引用的表示就是對象變數。可以多個對象引用變數指向同一個對象。
字面值引用變數:即普通數據類型的引用變數 ,如 int b = 1 , b就是字面值引用變數。可以有多個字面值引用變數指向同一字面值,但其中一個引用修改字面值,不會影響另一個引用字面值,這點要與對象引用區別開。
java 聲明兩個對象,指向一個引用,然後一個對象改變屬性,另一個對象的屬性也變了,直接上代碼
Test tt=new Test();
tt=test;
tt.setId(“2”);
注意Test tt這裡的tt只是一個對象的引用,就好像C中的指針一樣
tt=test;這句話是把test引用指向的對象的地址交給tt,即tt跟test指向了同一個對象
要達到你的目的,可以採用以下方法:
第一,Test tt=new Test();後把test的每個屬性的值賦給tt
第二,就是克隆了,clone函數,原理跟上面一樣,不過更複雜,涉及到深複製和淺複製問題
在java中,引用數據不就是一種對象么?為什麼在調用函數中不能進行修改數值??
樓主語句表達很模糊:
引用數據?(不知道說的是引用數據類型,還是引用某一數據對象)
引用數據類型的數據 ==是對象;
引用數據== 不是對象。而是對某對象的引用; 這是一動態過程;
數值?
1. 對象的值==是內存地址值。即0xaabbcc等; // 這是JVM虛擬機分配的,不能修改值。
2. 對象內部的 成員變數==存在於堆內存中。 //是可以修改的 (此處不考慮final static的情況)
對象 成員函數的值==存在於方法區中。 //這隻可以調用 (此處不考慮final static的情況)
java變數 值的改變 問題
變數名(a,b…)本身是一個地址,而變數的值是在內存中分配的實際的內存數據,比如int a=1,就是指a這個地址指向存放了字面量數據1的內存數據。
變數值的改變是變數表示的地址的改變,差不多就是你說的意思
不能說基本數據類型都存在於棧,這是不準確的,首先你要搞清楚線程這個概念,java運行中,每一個線程都維持一個線程棧(也可以說成方法棧,因為線程就是運行你的方法代碼的),線程棧由一個個棧幀組成,每一個棧幀都表示一個方法的調用(處於棧頂的棧幀就是當前正在運行的方法),所以可以知道,方法中的變數都是存放在棧幀(棧)中的,如果變數引用的是對象,由於對象還是得在堆中分配,那麼就會有一個棧中的變數指向堆中的一個對象。但是一個類本身可以有實例變數啊,如果這個變數是一個基本類型的話,那這個變數就存在於堆中了啊,也就是說基本數據類型也可以存放在堆中啊。
對象的實體確實是存放在堆中沒錯啊
還有什麼不懂可以繼續問。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/298315.html