java中参数存储_Java中函数参数传递和数据存储
值傳遞是將要傳遞的值作為一副本傳遞的..
引用傳遞,傳遞的是引用對象的內存地址..
例如:
int i=4;
int j=i; ? //相當于把4復制了一個副本賦給了j
輸出結果是i=4 ,j=4
C
int *p,*p1;
int j=5;
p=j; ? ?//這里是把j在內存當中的地址賦給了指針p
p1=p; ? //這里是把指針p中保存的地址(就是j的地址)賦給了指針p1
j=4; ? ?//這里改變j的值
輸出結果是 ?j=4 ?, ?*p=4 ?, ?*p1=4 ?//因為p和p1指向的都是j ?所以他們的值隨j值改變
(以上說明和代碼來自http://zhidao.baidu.com/question/31191252.html)
Java中函數參數的傳遞是值傳遞還是引用傳遞?
Java中參數傳遞時傳遞到函數中的參數都是原變量的一份拷貝,對于非類類型如int,float等,這份拷貝自然和原變量脫離了關系,這不難理解;
而對于類的實例而言,這份拷貝恰巧是實例引用的拷貝,它(參數)指向的實例地址和原實例引用指向的實例地址都是一樣的,因此對參數的修改有時也會影響到實 例本身,故此造成了Java傳遞類實例是傳遞的引用即地址的假象,如下面例子中的changeMemberField函數,但是我們把參數指向的地址改到 別的實例上時,如changeMember函數,我們會發現參數和原實例引用再也不會發生關系了,這里證明Java中參數傳遞是完完全全是傳值而不是傳 址。
例子代碼:
代碼:
package?com.sitinspring;
public?class?ChangeClass{
public?void?changeInt(int?i){
i=5;
}
public?void?changeLong(long?i){
i=555;
}
public?void?changeString(String?str){
str="5555";
}
public?void?changeMember(Member?member){
member=new?Member("Cindy",35);
}
public?void?changeMemberField(Member?member){
member.setAge(20);
member.setName("Andy");
}
public?static?void?main(String[]?args){
ChangeClass?changeClass=new?ChangeClass();
int?intValue=10;
changeClass.changeInt(intValue);
System.out.println(intValue);
long?longValue=10;
changeClass.changeLong(longValue);
System.out.println(longValue);
String?stringValue="1234";
changeClass.changeString(stringValue);
System.out.println(stringValue);
Member?member2=new?Member("Douglas",45);
changeClass.changeMember(member2);
System.out.println(member2);
Member?member=new?Member("Bill",25);
changeClass.changeMemberField(member);
System.out.println(member);
}
}
package?com.sitinspring;
public?class?Member{
private?String?name;
private?int?age;
public?Member(String?name,int?age){
this.age=age;
this.name=name;
}
public?String?toString(){
return?"Member?name="+name+"?age="+age;
}
public?int?getAge()?{
return?age;
}
public?void?setAge(int?age)?{
this.age?=?age;
}
public?String?getName()?{
return?name;
}
public?void?setName(String?name)?{
this.name?=?name;
}
}
輸出:
10101234Member name=Douglas age=45Member name=Andy age=20
解釋:
第一個輸出10是因為int是基本類型,傳遞的參數是intValue的拷貝,對拷貝的修改對原值intValue沒有影響.
第一個輸出10和上面是一個道理.
第三個輸出1234.由于String是類類型, str是stringValue的地址拷貝,參數str指向的地址和stringValue的一致,但在函數changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等價的, str指向了新的”5555”所在的地址,此句后str就與原來的stringValue徹底脫離了聯系.
第四個輸出Member?name=Douglas?age=45的道理和上面相同.
第五個輸出Member?name=Andy?age=20是因為changeMemberField函數中修改了參數member 的值,也就是修改member指向實例的值,而這個實例正是member指向的值,因此member就變成了name=Andy 且age=20.
結論
Java中參數傳遞的都是值,對應基本類型,傳遞的是原值的拷貝;對于類類型,傳遞的是引用即地址的拷貝.
對于函數對參數的改變是否會影響原值的問題:值類型自然不會影響到原值.而對于類類型要看改變的是參數的地址還是值,如果是前者,參數和原引用指向了不同的地址,它們自然脫離了關系;如果是后者,修改的實例就是原引用指向的實例,這當然對原值進行了修改.
java的數據類型分為兩種:基本類型和引用類型。
引用類型分為下面幾種:類類型(class,interface,enum,annotation)和數組類型
java數據類型圖:
┏數值型━┳━整數型:byte?short?int?long
┏基本數據類型━━┫??????????????┗━浮點型:float?do
┃????????????????┣字符型:char
數據類型╋??????????????????????┗布爾型:boolean
┃????????????????┏類(class)
┗引用數據類型━━╋接口(interface)
┗數組(array)
數組是引用類型,創建的是對象,如:int[]?a?=?new?int[5];則說明a是int型數組對象。其實“一切皆對象”。
參考文章:
總結
以上是生活随笔為你收集整理的java中参数存储_Java中函数参数传递和数据存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美特斯邦威java面试_在美特斯邦威工作
- 下一篇: 2018java多线程面试题_2018J