NoobyGoo 2019-02-18 22:36 采纳率: 0%
浏览 732

Java什么情况下方法会改变传递给它的参数变量的内容?

书上说Java程序总是采用按值调用的,方法不能修改传递给它的任何参数变量的内容。下面的代码数组scores传入方法perfect后值却跟数组x一样改变了,这是为什么?

import java.util.*;
public class HelloWorld {

public static void main(String[] args) {
    int[] scores=new int[]{89,-23,64,91,119,52,73};
    HelloWorld a=new HelloWorld();
    a.perfect(scores);
    for(int t:scores)
    System.out.print(t+" ");     

}   
//定义方法完成成绩排序并输出前三名的功能
public void perfect(int[] x)
{
    for(int i=0;i<x.length;i++)
    {
        if(x[i]<0||x[i]>100)
        x[i]=0;
    }
    Arrays.sort(x);
    System.out.println("考试成绩前三名为:");
    System.out.println(x[6]);
    System.out.println(x[5]);
    System.out.println(x[4]);
    for(int r:x)
    System.out.print(r+" ");
    System.out.println();

}


输出为:
    考试成绩前三名为:

91

89

73

0 0 52 64 73 89 91

0 0 52 64 73 89 91

}

  • 写回答

3条回答

  • threenewbee 2019-02-18 23:45
    关注
    任何情况下都不会改变变量。
    
    你这个不是改变变量,而是改变了变量(引用)对象本身。
    
    看下面两个的不同:
    (1)修改变量
    void foo(int i)
    {
    i = 3; //改变i
    }
    void bar(Person p)
    {
    p = new Person(); //对于引用变量,改变了它指向的对象。
    }
    以上,都不会反应到实参。
    (2)修改对象的状态:
    void foo(ArrayList l)
    {
    l.add(123); //还是那个l变量,没有指向新的变量,而是改变它的状态
    }
    void bar(Person p)
    {
    p.Name = "xxx"; //还是那个p,注意和Person p = new Person(); p.Name = xxx; 的区别
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)