本小白財務出生,最近在自學java,剛學到陣列部分,寫了一個陣列轉置的方法 ,但輸出的陣列還是{7,6,5,4,3,2,1},代碼如下,想請教一下哪里有問題。用同樣的邏輯把sort方法直接寫在主方法下運行結果又是正確的,代碼如下面第二段代碼,請教一下問題在哪里。自己實在想不通了。謝謝各位。
—————————————————————————————————————————————————————————
public class TestDemo{
public static void main(String args[]){
int data[]=new int[]{7,6,5,4,3,2,1};
ArryData.sort(data);
ArryData.tell(data);
}
}
class ArryData{
public static void sort(int[] arry){
int temp[]= new int[arry.length];
int foot=arry.length-1; //定義temp陣列的角標
for(int x=0;x<arry.length;x++){
temp[foot]=arry[x];
foot = foot -1;
}
arry=temp;
}
public static void tell(int[] arry){
for(int x=0;x<arry.length;x++){
System.out.println(arry[x]);
}
}
}
—————————————————————————————————————————————————————————
public class TestDemo{
public static void main(String args[]){
int data[]=new int[]{7,6,5,4,3,2,1};
int temp[]= new int[data.length];
int foot=data.length-1; //定義temp陣列的角標
for(int x=0;x<data.length;x++){
temp[foot]=data[x];
foot = foot -1;
}
data=https://bbs.csdn.net/topics/temp;
ArryData.tell(data);
}
}
class ArryData{
public static void tell(int[] arry){
for(int x=0;x<arry.length;x++){
System.out.println(arry[x]);
}
}
}
uj5u.com熱心網友回復:
這么說不知道你明不明白。變數data ---對應參考“new int[]{7,6,5,4,3,2,1}”
在你呼叫ArryData.sort(data)方法時候,你傳入的實際上不是data這個東西,而是data對應的“參考new int[]{7,6,5,4,3,2,1}”。
而在這個方法里,可以改變“參考new int[]{7,6,5,4,3,2,1}”,但是不會改變 變數data 和 參考new int[]{7,6,5,4,3,2,1}的對應關系。
如果這個你能明白,后面就很好理解了。
首先,你新建了一個物件temp,并且將arry的倒敘{1,2,3,4,5,6,7}成功賦給了temp。重點來了:
你直接將arry=temp,這樣子操作的解釋是:
arry--對應的參考由“new int[]{7,6,5,4,3,2,1}”變成 “new int[]{1,2,3,4,5,6,7}”
而實際上你并沒有改變“new int[]{7,6,5,4,3,2,1}”這個參考的內容。
所以,脫離了這個方法后,由于參考“new int[]{7,6,5,4,3,2,1}”沒有改變,所以data值對應的還是“new int[]{7,6,5,4,3,2,1}”
解決方法就是在ArryData.sort(data)這個方法里對該參考進行操作即可。如下所示:
將arry = temp; 修改為
for (int x = 0; x < temp.length; x++) {
arry[x] = temp[x];
}
這樣子就ok了。不懂可以回帖子
uj5u.com熱心網友回復:
class ArryData{public static void sort(int[] arry){
int temp[]= new int[arry.length];
int foot=arry.length-1; //定義temp陣列的角標
for(int x=0;x<arry.length;x++){
temp[foot]=arry[x];
foot = foot -1;
}
arry=temp;//你要明白arry和main方法的data是什么關系,data在main方法里(也就是作用域在main方法里),sort方法看不到data,它看到的arry之所以和data一樣只是因為傳引數的時候做了值傳遞arry=data,然而你在sort里重新給arry賦值了array=temp,也就是arry!=data了,只是改變了arry,并沒有改變data
}
改成一下
class ArryData{
public static void sort(int[] arry){
int temp[]= new int[arry.length];
int foot=arry.length-1; //定義temp陣列的角標
for(int x=0;x<arry.length;x++){
temp[foot]=arry[x];
foot = foot -1;
}
//arry=temp;
System.arraycopy(temp, 0, arry, 0, arry.length); //改成這樣就可以了,因為arry=data沒變,把temp復制給arry就是復制給data
}
uj5u.com熱心網友回復:
樓上說的都很清楚了!另外,還有一種方法解決你的問題,把你的sort函式可以簡化成如下:
public static void sort(int[] arry) {
for (int i = 0; i < arry.length / 2; i++) {
int temp = arry[i];
arry[i] = arry[arry.length - i - 1];
arry[arry.length - i - 1] = temp;
}
}
uj5u.com熱心網友回復:
老師您好!我還是有點昏,我理解的是arry=temp執行后,就是把temp堆疊記憶體保存的地址賦予arry了,讓arry也指向temp指向的堆記憶體內容,也就是{1,2,3,4,5,6,7},所以arry回傳也應該是{1,2,3,4,5,6,7}。ArryData.sort(data)這個方法也是讓data指向temp指向的堆記憶體內容。麻煩老師再指點一下我哪里有問題,因為不是科班出生,有點難理解。謝謝老師!??uj5u.com熱心網友回復:
老師您好!我還是有點昏,我理解的是arry=temp執行后,就是把temp堆疊記憶體保存的地址賦予arry了,讓arry也指向temp指向的堆記憶體內容,也就是{1,2,3,4,5,6,7},所以arry回傳也應該是{1,2,3,4,5,6,7}。ArryData.sort(data)這個方法也是讓data指向temp指向的堆記憶體內容。麻煩老師再指點一下我想法哪里有問題,因為不是科班出生,有點難理解。謝謝老師!??uj5u.com熱心網友回復:
謝謝老師 我自己想的思路也是按老師您這個邏輯來寫的 沒搞清楚這個是網課老師提供的一種思路 雖然他說不太好 我還是想學習一下 謝謝老師的回復uj5u.com熱心網友回復:
ArryData.sort(data)這個data在main方法里,sort是不認識它的,只認識引數arry,方法呼叫時arry=data做了引數傳遞,所以arry和data指向了相同的堆記憶體,但是arry=temp就會改變arry的指向,使它指向temp的對記憶體,int temp[]= new int[arry.length]; temp的堆記憶體是另外new出來的,和data的堆記憶體不是同一個記憶體,所以arry=temp怎么能改變data指向的堆記憶體呢?uj5u.com熱心網友回復:
老師您好!請問下ArryData.sort(data)這個方法的意思把data堆疊記憶體的地址給arry,讓arry指向data的堆記憶體內容嗎?所以我最后的arry=temp實際只是讓arry指向了temp的堆記憶體內容,data還是指向data的堆記憶體內容,因為data指向的堆記憶體內容不變,所以輸出結果不變。老師我這樣理解對嗎?uj5u.com熱心網友回復:
這是個很簡單的問題,第一段你把最終值賦予了array,但是這個和你的main沒有什么關系,你main中的data值根本沒有改變,如果需要改變,請把方法加入回傳值。看一下下圖理解一下。
uj5u.com熱心網友回復:
上圖有點錯誤,arry是同一個
uj5u.com熱心網友回復:
謝謝老師!uj5u.com熱心網友回復:
sort方法里面應該加入return array的回傳值,然后在main方法里面將是sort()方法的回傳值賦值給datauj5u.com熱心網友回復:
謝謝老師 ??uj5u.com熱心網友回復:
物件、陣列、佇列,可能都不會自動(或者預設)支持賦值操作。就是說、那個賦值號背后執行的操作是什么,還是什么都沒有做,誰也說不好。佇列,有的編譯器的實作,是支持拷貝操作的,可能應該使用Arryn.copy(); 要不,就應該使用遍歷演算法一項一項的賦值。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130981.html
標籤:Java SE
上一篇:報錯 求助
