java函數傳遞
1. java中函數參數的傳遞形式是值傳遞 還是引用傳遞
狹義上說基本類型是值傳遞,引用類型是引用傳遞
廣義上說都是傳值,只不過基本類型傳的是它的值,引用類型傳的是它的指針
2. Java中函數是值傳遞還是引用傳遞
是值傳遞。如果是對象,Java會復制對象具柄進行值傳遞,意思是你可以在函數內部修改和使用參數,但是結果不會隨函數返回!
3. java中參數傳遞方式
當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這里到底是值傳遞還是引用傳遞? 是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。
4. java中函數是值傳遞還是引用傳遞
相信有些同學跟我一樣,曾經對這個問題很疑惑。在網上也看了一些別人說的觀點,評論不一。有說有值傳遞和引用傳遞兩種,也有說只有值傳遞的,這里只說下個人見解
先看一個例子
publicclassTest1{
publicstaticvoidmain(String[]args){
inta=10;
changeNum(a);
System.out.println("maina="+a);
}
staticvoidchangeNum(inta){
a=100;
System.out.println("changeNuma="+a);
}
}
結果:
changeNum a=100
main a=10
說明對於基本的數值類型其實傳遞的是一份數值的拷貝,傳入函數之後跟原來的值就沒有關系了,在函數中改變這個數的值也不會影響到原來的值。
再看一個例子
publicclassP{
Stringname="P";
publicP(Stringname){
this.name=name;
}
@Override
publicStringtoString(){
returnname;
}
}
publicclassTest{
staticPp1=newP("p1");
publicstaticvoidmain(String[]args){
Pp=newP("P");
System.out.println("beforechangep:"+p.toString);
changeObj(p);
System.out.println("afterchangep:"+p.toString());
}
staticvoidchangeObj(Pp){
p=newP("pp");
System.out.println("changep:"+p.toString());
//p=p1;
//System.out.println(p.toString());
}
}
這個例子中的運行結果會是什麼呢?
在這個例子中傳入的是一個對象類型的數據。
我們先來猜想一下:如果傳入的是一個對象的引用,在函數中改變了這個引用所指向的對象,那麼外部的引用"p"應該是指向了新創建的P("pp")的對象才對
所以猜想的結果是:
before change p:P
change p:pp
after change p:pp
那讓我們來實際運行一下看看結果,實際的結果是:
before change p:P
change p:pp
after change p:P
想猜想的不一樣!!!
這就讓我們很疑惑了,為什麼函數沒有改變引用所指向對象呢?
其實是這樣的,首先要理解「=」賦值操作的意義,
對於基本類型來說「=」賦值操作是直接改變內存地址上的值,
而對引用類型來說「=」賦值其實是改變引用變數所指向的內存地址。
所以對外部的p變數是沒有影響的。
總結:
函數參數傳遞其實是一個賦值的過程,基本類型傳遞的是數值,引用類型傳遞的引用對象的內存地址。
另外一點要特別注意,函數的參數其實是函數內部的局部變數。不要跟外部變數混淆
5. java函數的參數傳遞規定
基本類型是值傳遞,在函數中改變參數的值,函數調用處的變數不會改變。對象是地址傳遞,函數中對此類參數的操作,實際操作的是調用處的對象。
6. Java中函數參數的傳遞是怎樣進行的
Java中函數參數的傳遞是按值傳遞。
下面證明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;
}
}
輸出:
10
10
1234
Member name=Douglas age=45
Member 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中參數傳遞的都是值,對應基本類型,傳遞的是原值的拷貝;對於類類型,傳遞的是引用即地址的拷貝.
對於函數對參數的改變是否會影響原值的問題:值類型自然不會影響到原值.而對於類類型要看改變的是參數的地址還是值,如果是前者,參數和原引用指向了不同的地址,它們自然脫離了關系;如果是後者,修改的實例就是原引用指向的實例,這當然對原值進行了修改.
7. java 如何把類型的信息作為函數參數傳遞
Java函數參數是值傳遞的。
1. 如果參數是基本類型,函數不能改變參數的值。(包括 String)
2. 如果參數是對象,函數可以改變參數的屬性。
3. 如果參數是對象,函數不能使參數指向新的對象。
8. java中數組是怎麼作為函數參數進行傳遞的
舉個例子和你說。
傳遞數組參數:
1. 傳遞數組
要傳遞數組到方法里,只要指明傳入的參數是一個數組即可。
例:
public class ArrayDemo //定義主類
{
public static void main(String args[])
{
int a[]={8,23,7,6,9,23}; //定義一維數組
ArrayDemo min=new ArrayDemo (); //創建對象
min.arrayMin(a); //將一維數組a傳入least()方法
}
public void arrayMin(int array[]) //參數array[]接受一維整形數組
{
int temp=array[0];
for(int i=0;i<array.length;i++)
if(temp>array[i])
temp=array[i];
System.out.println("最小的數為:"+temp);
}
}
從該例中可以看出,如果要將數組傳遞到方法里,只需在方法名後的括弧內寫上數組的名即可。二維數組的傳遞與一維數組相似,在需在方法里聲明傳入的參數是一個二維數組。
9. Java函數參數是拷貝傳遞還是引用傳遞
這個要視情況而定,基本類型和String類型是值傳遞(也就是拷貝傳遞),但是對於其他對象類型則大部分是引用傳遞,但是引用傳遞也只是引用的一個副本,當你在方法裡面將該引用指向新的對象,那麼對於原來的對象就不能產生影響。