Java語言中方法之間數據傳遞的探討
導語:在面向對象的Java語言中,方法是處理數據的基本模塊,方法之間的數據傳遞是掌握編程方法的關鍵。下面就由小編為大家介紹一下Java語言中方法之間數據傳遞的探討,歡迎大家閲讀!
1問題的提出
在面向對象的Java語言中,類是問題空間的高度抽象和概括,是一個模板,而對象是類的特例,解空間的具體實現則是由若干個類的對象集合而成。方法是類的動態屬性,代表了類所具有的功能和操作。Java語言中的方法既可以在類中,也可以在接口中聲明,但是,它們只能在類中實現。Java語言中的所有操作都是用方法來實現的。
一個方法通過另一個方法的調用被激活,一個被調用的方法被激活,既需要指定被調用方法的方法名,也需要為被調用的方法提供相應的數據,以便於被調用方法對數據的加工處理,乃至於將加工處理的結果返回給方法的調用者。
2Java語言中方法間的數據傳遞方法
方法是數據加工處理或相應操作的基本模塊,為了實現某種需求而調用一個方法,需要為被調用的方法傳遞數據,以便於被調用的方法依據所提供的數據進行相應的操作。
C++語言的函數間的數據傳遞可以分為:數值傳遞、地址傳遞和引用傳遞。地址傳遞的形參是同類型的指針,由於指針操作的不安全等問題,Java語言屏棄了指針,故Java語言方法之間的數據傳遞只有數值傳遞和引用傳遞。
2.1方法間的數值傳遞
所謂的數值傳遞又稱為值傳遞,數值傳遞的特徵是:調用方法的實參可以是常量、變量或者是表達式,形參則是對應數據類型的變量。如果實參是變量,則實參和形參是相互獨立的兩個單元。在方法調用的過程中,實參的值將拷貝到形參中,此後形參的任何修改都不會影響實參。數值傳遞方法見例1。
[例1]數值傳遞調用方法舉例:
.*;
public class ValueTransmit
{publicstatic void main(Stringargs[])
{intx=5,y=66;
tln(“在主方法,交換前的:x=”+x+“,y=”+y);
swap(x,y);
tln(“在主方法,交換後的:x=”+x+“,y=”+y);
}
static voidswap(int x,int y)
{int temp;
tln(“在swap方法未交換時:x=”+x+“,y=”+y);
temp=x;x=y;y=temp;
tln(“在swap方法交換之後:x=”+x+“,y=”+y);
}
}
例1程序的輸出結果如下所示:
在主方法, 交換前的:x=5,y=66
在swap方法未交換時:x=5,y=66
在swap方法交換之後:x=66,y=5
在主方法, 交換前的:x=5,y=66
在例1程序中,方法調用的“swap(x,y);”中的實在參數x,y是兩個單元,而形式參數中的x,y又是兩個單元,它們是互相獨立的。所以,對形式參數的改變並不影響實在參數的內容;程序的運行結果也驗證上述觀點。具體參數傳遞請見圖1所示。
2.2方法間的引用傳遞
方法之間的數據傳遞還有一種方法,就是引用傳遞。引用傳遞的實質就是將實在參數的地址傳遞給形式參數引用,也就是形式參數是實在參數的`別名。引用傳遞方法請見例2。
[例2]引用傳遞方法舉例:
// 參考源代碼如下:
.*;
public class ReferenceTransmit
{publicstatic void main(Stringargs[])
{int a[]= {9,-3,6,22,-77,999},n=6;
t(“數組排序前的情況:”);
for(int i=0;i<6;i++)
t(“ ” +a[i]+“ ”);
tln(“ ”);
SelectSort(a,n);
t(“選擇排序後的情況:”);
for(int i=0;i<6;i++)
t(“ ” +a[i]+“ ”);
}
static voidSelectSort(int arr[],int n)
{int temp,p;
for(int i=0;i { p=i;
for(int j=i+1;j if(arr[p]>arr[j])p=j;
if(p!=i){temp=arr[p]; arr[p]=arr[i];arr[i]=temp;}
}
}
}
例2程序的執行結果如下所示:
數組排序前的情況:9-3622-77999
選擇排序後的情況:-77-36922999
在例2程序的方法調用語句“SelectSort(a,n);”中,a是數組名,是地址常量,是數據區域的首地址;SelectSort(int arr[],int n)的形式參數arr[ ]是數組的引用,而不是數組聲明或定義。在形式參數和實在參數的結合中,形式參數arr是實在參數a的別名。在方法SelectSort()中,對arr[i]的任何修改,實際上就是對實在參數a[i]的修改。程序的運行結果也證明了這一點。
3Java語言方法返值的分類
方法調用有時需要將方法的處理結果返回給方法的調用者,這樣的方法將有返值。依據方法返值與否可以將方法分為無返值方法和有返值方法,本文的例1和例2中的方法都是無返值的方法。依據返值的具體數據類型又可以將方法分為返值為基本數據類型和返值為對象的引用的方法。
3.1方法的返值為基本數據
返值為基本數據的方法在定義方法時要給出基本數據類型説明符。Java語言中,方法的返值為基本數據類型的方法,定義格式為:
訪問控制修飾返值數據類型 方法名(形參表)
{方法體主體部分
return表達式;
}
其中:訪問控制修飾符可以是public、final、static等,用於標識該方法的訪問控制屬性以及作用域選擇等;而返值數據類型就是Java語言的基本數據類型的標識符,用於表明該方法的返值為何種數據類型。返值為基本數據類型的方法請看例3。
[例3]返值為基本數據類型的方法:
// 參考源代碼如下:
import .*;
publicclassReturnBasicDataType
{public static void main(String args[])
{doublearr[]={1.2,290.5,5.7,64.0,879.5},av;
av=aver(arr,5);
tln(“ aver=”+av);
}
static double aver(double a[],int n)
{double sum=0.0;
for(int i=0;i return sum/n;
}
}
例3的輸出結果如下所示:
aver=248.18
本例中“static double aver(double a[],int n)”是方法頭。double是該方法的返值類型,即基本數據類型;參數double a[]是引用傳遞,參數intn是數值傳遞。語句“return sum/n;”是將sum/n的值返回給方法的調用者。
3.2方法的返值為對象的引用
另一種返值類型是對象引用。這種情況一般是:主調方法傳遞的是對象的地址,被調方法的形式參數是對應類型的引用,該方法的返值類型是同一類型的引用。返值為引用的方法見例4。
[例4]返值為引用的方法舉例:
// 參考源代碼如下:
import .*;
publicclassReturnReference
{public static void main(String args[])
{example x=new example(),y;
ata(123,“ABCD”);
tln( ()+“,”+());
y=tranobjct(x);
t(()+“,”+());
}
static exampletranobjct(examplew)
{tln( ()+“,”+());
ata(456,“efhi”);
tln( ()+“,”+());
example z=new example();
ata(567,“MNIJ”);
returnz;
}
}
classexample
{int x; Stringy;
public void setdata(int a,Stringb)
{x=a;y= new String(b); }
public int getx(){return x; }
public String gety(){return y; }
}
例4程序的運行結果如下所示:
123,ABCD
123,ABCD
456,efhi
456,MNIJ
例4的具體情況如圖2所示:
圖2可知:x和w引用所指的是同一個無名對象,所以,以w引用對對象的操作實質就是對x引用所指對象的操作。而 “example z=new example();”語句也創建一個無名對象,設置數據成員後,通過“returnz; ”將此引用返給方法的調用者,使得引用y指向該對象,故有以上輸出。
“tranobjct(x)”語句是將example類對象的引用(地址)x傳遞給tranobjct方法,而在tranobjct()方法中形式參數是example 類的對象的引用w。經過語句“ata(456,”efhi“);”修改參數後,數據顯示結果説明對象的數據成員修改正確。
又有“example z=new example();”語句創建一個新的對象z,通過“ata(567, “MNIJ”);”語句將其數據成員分別設置為“567”和“MNIJ”,並由“returnz;”語句將example類型的引用返回給方法的調用者,即將example對象的引用z返值給同類的引用y。由“tln(()+”,“+());”語句看出, “()”返回的是原對象經過“ata(456,”efhi“);”語句修改後的數據成員x 的值;而“()”返回的是“ata(567,”MNIJ“);”語句操作後數據成員y的值。
4結語
有些資料將“static exampletranobjct(examplew)”方法稱之為返值為對象的方法,筆者不能苟同。上述方法的返值類型貌似example類型的對象,其實質還是“example”類型對象的引用。何以見得?Java語言創建對象的一般格式是:類名 引用名=new 類名([初始化參數]);語句的“new 類名([初始化參數])”部分是創建一個無名對象,再通過賦值操作將無名對象的首地址賦值給一個引用名,今後將以該引用來操作這個無名的對象。故不能將上述方法稱為返值是對象的方法。
-
40個Java多線程問題總結
Java多線程是什麼Java提供的併發(同時、獨立)處理多個任務的機制。多個線程共存於同一JVM進程裏面,所以共用相同的內存空間,較之多進程,多線程之間的通信更輕量級。依我的理解,Java多線程完全就是為了提高CPU的利用率。Java的線程有4種狀態,新建(New)、運行(Runnabl...
-
Java 正則表達式
Java是一門編程語言,那麼大家知道Java正則表達式是怎樣的呢?下面一起來看看!Java正則表達式正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式並不僅限於某一種語言,但是在每種語言中有細微的差別。正則表達式實例一個字符串其...
-
如何學好Java語言編程
決定好想學什麼編程語言了嗎,現在就讓我們開始學習吧。所有你需要做的就是打開一本書,然後開始閲讀,是這樣的嗎?不全是這樣的。learn-first我會給出學習第一門編程語言的理想方法佈局,你不僅應該學習這個佈局方法,還應該享受精通它——如果不能掌握的話。學習第一門...
-
計算機二級考試Java精選訓練題
下面是應屆畢業生考試網小編搜索整理的計算機二級考試Java精選訓練題,希望對大家有所幫助。[簡答題]本題中,在下畫線上填寫代碼,指定變量b為字節型,變量f為單精度實型,變量l為64位整型。publicclassjaval{publicstaticvoidmain(String[-]args){b=49;f=8.9f;l=0xfedl...