大家帮我看一下,究竟代码哪里出了问题?

bellyreborn 2020-05-18 12:18:25
刚刚开始自学代码,遇到了一点问题,大家帮我看一下为什么程序执行的结果会是这样的?
下面代码中,我在Sort类中定义了一个turn()的方法,想完成数组的转置,让数组中的元素前后颠倒。
但是当我调用了这个方法以后,输出的确实原来数组的内容,并没有发生前后颠倒。请问究竟为什么会导致这样的结果?
代码如下:


class Sort
{
public static void printArray(int [] temp){ //对数组进行打印的方法
for(int x : temp){
System.out.print(x + "\t");
}
System.out.println();
}

public static void turn(int [] temp){ //数组转置的方法
int [] t = new int [(temp.length)];
int foot = temp.length -1;
for(int x = 0 ; x < temp.length ; x++){
t[foot --] = temp[x];
}
temp = t;
}
}
public class ArrayDemo
{
public static void main(String args[]){
int data [] = new int [] {8,9,0,2,3,5,10,7,6,1};
Sort.turn(data);
Sort.printArray(data);//输出:8,9,0,2,3,5,10,7,6,1
}
}
...全文
261 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大隐藏于寺 2020-05-22
  • 打赏
  • 举报
回复
引用 楼主 bellyreborn 的回复:
刚刚开始自学代码,遇到了一点问题,大家帮我看一下为什么程序执行的结果会是这样的? 下面代码中,我在Sort类中定义了一个turn()的方法,想完成数组的转置,让数组中的元素前后颠倒。 但是当我调用了这个方法以后,输出的确实原来数组的内容,并没有发生前后颠倒。请问究竟为什么会导致这样的结果? 代码如下:

class Sort
{
	public static void printArray(int [] temp){ //对数组进行打印的方法
		for(int x : temp){
			System.out.print(x + "\t");
		}
		System.out.println();
	}
	
	public static void turn(int [] temp){ //数组转置的方法
		int [] t = new int [(temp.length)];
		int foot = temp.length -1;
		for(int x = 0 ; x < temp.length ; x++){
			t[foot --] = temp[x];
		}
		temp = t;
	} 
}
public class ArrayDemo 
{
	public static void main(String args[]){		
		int data [] = new int [] {8,9,0,2,3,5,10,7,6,1};
		Sort.turn(data);
		Sort.printArray(data);//输出:8,9,0,2,3,5,10,7,6,1
	}
}
引用你一楼的方法来说明. turn()方法执行到行号为12的代码时,java虚拟机内存数据区简略信息入下图 此时turn()方法中的变量temp与main()方法中的变量data都指向同一个数组{8,9,0,2,3,5,10,7,6,1},而turn()方法中的变量t指向空数组 执行turn()方法到行号17行时,java虚拟机内存数据区简略信息入下图 此时turn()方法中的变量temp与变量t都指向同一个数组{1,6,7,10,5,3,2,0,9,8},而main方法中的变量data仍然指向数组{8,9,0,2,3,5,10,7,6,1}. 执行完turn()方法,turn()方法栈帧弹出虚拟机栈内存,变量temp与变量t不复存在,没有变量指向堆内存中的数组{1,6,7,10,5,3,2,0,9,8},这个数组在合适的时机会被虚拟机回收掉. 回到main方法,执行printArray()方法,行号为4,此时的java虚拟机内存数据区简略信息入下图 printArray()方法的变量temp指向数组{8,9,0,2,3,5,10,7,6,1},剩下的就是循环打印数组中的元素. 希望对你有帮助.
程序员小武生 2020-05-20
  • 打赏
  • 举报
回复
这个是实参和形参的问题,你可以百度看一下,形参改变不会影响实参的
qq_39936465 2020-05-18
  • 打赏
  • 举报
回复
引用 楼主 bellyreborn 的回复:
刚刚开始自学代码,遇到了一点问题,大家帮我看一下为什么程序执行的结果会是这样的? 下面代码中,我在Sort类中定义了一个turn()的方法,想完成数组的转置,让数组中的元素前后颠倒。 但是当我调用了这个方法以后,输出的确实原来数组的内容,并没有发生前后颠倒。请问究竟为什么会导致这样的结果? 代码如下:
注意变量作用域

class Sort
{    
	public static void printArray(int [] temp){ //对数组进行打印的方法
        for(int x : temp){
            System.out.print(x + "\t");
        }
        System.out.println();
    }
     
    public static int[] turn(int [] temp){ //数组转置的方法
        int [] t = new int [(temp.length)];
        int foot = temp.length -1;
        for(int x = 0 ; x < temp.length ; x++){
            t[foot --] = temp[x];
        }
       return t;
    } 
}
public class ArrayDemo 
{
    public static void main(String args[]){       
        int data[]= new int [] {8,9,0,2,3,5,10,7,6,1};
        data=Sort.turn(data);
        Sort.printArray(data);
    }
}

qq_39936465 2020-05-18
  • 打赏
  • 举报
回复
引用 3 楼 bellyreborn 的回复:
当然,我也知道,解决这个数组转置问题可以通过修改代码有多种实现方式和思路,我只是想弄明白程序输出意想不到的结果的原因究竟是什么?是不是我对某个哪个知识点的理解本身就有问题,希望前辈不吝赐教。
因为数组是作为参数传入的,方法获得的是参数的地址的引用。当temp=t,temp的地址引用被改为t的地址引用,不会对原来的地址有影响,只有改变参数引用地址内的值才会对元数组产生影响。 #2的方法 和最后有没有temp=t都没关系,因为在改变temp地址引用前已经改变了引用的参数地址内的值。
bellyreborn 2020-05-18
  • 打赏
  • 举报
回复
引用 1 楼 qq_39936465 的回复:
[quote=引用 楼主 bellyreborn 的回复:] 刚刚开始自学代码,遇到了一点问题,大家帮我看一下为什么程序执行的结果会是这样的? 下面代码中,我在Sort类中定义了一个turn()的方法,想完成数组的转置,让数组中的元素前后颠倒。 但是当我调用了这个方法以后,输出的确实原来数组的内容,并没有发生前后颠倒。请问究竟为什么会导致这样的结果? 代码如下:
注意变量作用域

class Sort
{    
	public static void printArray(int [] temp){ //对数组进行打印的方法
        for(int x : temp){
            System.out.print(x + "\t");
        }
        System.out.println();
    }
     
    public static int[] turn(int [] temp){ //数组转置的方法
        int [] t = new int [(temp.length)];
        int foot = temp.length -1;
        for(int x = 0 ; x < temp.length ; x++){
            t[foot --] = temp[x];
        }
       return t;
    } 
}
public class ArrayDemo 
{
    public static void main(String args[]){       
        int data[]= new int [] {8,9,0,2,3,5,10,7,6,1};
        data=Sort.turn(data);
        Sort.printArray(data);
    }
}

[/quote] 非常感谢前辈的回复,提供返回值的方法确实能够解决这个问题,而且简单明了。 不过,关于“变量作用域”,我其实还是不明白为什么会错。我之所以在这个问题上这么纠结,是因为数组是引用数据类型,在我的代码中,通过引用传递,temp [ ]→data[ ] ,之后在turn( )中通过一系列操作,将data[ ]中的元素前后顺序颠倒赋值给新的数组t[ ] ,然后把赋值之后的数组t[ ]重新赋值还给data[ ],这个过程为什么会涉及到变量作用域的问题? 我在我的代码中重新增加了测试变量数值,请看下面的代码:

class Sort
{
    public static void printArray(int [] temp){ //对数组进行打印的方法
        for(int x : temp){
            System.out.print(x + "\t");
        }
        System.out.println();
    }
     
    public static void turn(int [] temp){ //数组转置的方法
        int [] t = new int [(temp.length)];
        int foot = temp.length -1;
        for(int x = 0 ; x < temp.length ; x++){
            t[foot --] = temp[x];
        }
		printArray(t);    //输出:1 6 7 10 5 3 2 0 9 8
        temp = t;
		printArray(temp);  //输出:1 6 7 10 5 3 2 0 9 8
    } 
}
public class ArrayDemo 
{
    public static void main(String args[]){       
        int data [] = new int [] {8,9,0,2,3,5,10,7,6,1};
        Sort.turn(data);
        Sort.printArray(data);   //输出:8 9 0 2 3 5 10 7 6 1
    }
}
当然,我也知道,解决这个数组转置问题可以通过修改代码有多种实现方式和思路,我只是想弄明白程序输出意想不到的结果的原因究竟是什么?是不是我对某个哪个知识点的理解本身就有问题,希望前辈不吝赐教。
YangjulongTrue 2020-05-18
  • 打赏
  • 举报
回复
引用 楼主 bellyreborn 的回复:
刚刚开始自学代码,遇到了一点问题,大家帮我看一下为什么程序执行的结果会是这样的?
下面代码中,我在Sort类中定义了一个turn()的方法,想完成数组的转置,让数组中的元素前后颠倒。
但是当我调用了这个方法以后,输出的确实原来数组的内容,并没有发生前后颠倒。请问究竟为什么会导致这样的结果?
代码如下:


class Sort
{
public static void printArray(int [] temp){ //对数组进行打印的方法
for(int x : temp){
System.out.print(x + "\t");
}
System.out.println();
}

public static void turn(int [] temp){ //数组转置的方法
int [] t = new int [(temp.length)];
int foot = temp.length -1;
for(int x = 0 ; x < temp.length ; x++){
t[foot --] = temp[x];
}
temp = t;
}
}
public class ArrayDemo
{
public static void main(String args[]){
int data [] = new int [] {8,9,0,2,3,5,10,7,6,1};
Sort.turn(data);
Sort.printArray(data);//输出:8,9,0,2,3,5,10,7,6,1
}
}

你只是把 值单方面的赋值到后面值并没有交换 你可以这样
	    public static void turn(int [] temp){ //数组转置的方法
int [] t = new int [temp.length];
int tempx;
for(int x = 0 ; x < temp.length/2 ; x++){
tempx=temp[x];
temp[x]=temp[temp.length-x-1];
temp[temp.length-x-1]=tempx;
}
temp = t;
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧