《java核心技术》第八版,第115页,第4.5节,第二段:java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数的值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。
但下面的代码却修改了值,这是何道理?输出:100import java.io.Console;
import java.util.*;
import java.lang.System;
import java.math.BigInteger;
import java.io.*;class Employee
{
public Employee(int money)
{
this.salary = money;
}
public int salary;
}
public class EmployeeTest
{
public static void main(String[] args)
{
Employee ea = new Employee(10);
A.s(ea);
System.out.println(ea.salary );
}
}class A
{
static void s (Employee m)
{
m.salary = m.salary *10;
}
}

解决方案 »

  1.   

    java里面不存在地址,所以不存在传递地址,java里面的地址都由jvm控制;
    而与地址等效的的引用,一个对象的引用实际就是一个对象的标识,标识可以理解为一值,通过这个值可以找到一个指定的对象,但这个值他就不是地址。
      

  2.   

    ‘java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数的值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。’这句话的意思是,方法不能对参数进行重新赋值,比如,把类A改成class A
    {
        static void s (Employee m)
        {
            m = new Employee(100); 
        }
    }其他不变,你再运行程序,看看
    这么改变后调用A.s后,ea并不改变实际上,调用A.s后,形参m和实参ea都指向一个对象,通过m调用对象的方法改变了对象的状态,由ea和m引用同一个对象,所以ea也改变了。
      

  3.   

    对呀,就是100 ,传的是值,不过这个值有些特别 是一个指向那个对象的引用,而不是对象
    方法中的形参e(局部变量,只在方法内有效),接收引用,此时,引用指向的值,依然是那个对象
    然后通过引用 改变对象中的值,(此时有两个引用指向那个对象
    局部变量(形参)e生命周期结束了
    并没有改变主函数中的引用sa(sa的指向还是不变)
    主函数中的sa还是指向那个对象
    此时的对象内容,已经被另一个引用改变了,所以打印出来的内容是改变后的内容
      

  4.   

        static void s (Employee m)
        {
            m.salary = m.salary *10;
        }
    =>
        static void s (Employee m)
        {
            m  = new Employee(20);  // 这叫修改变量m的内容。上面是修改引用m所指向对象的内容。
        }
      

  5.   

    把Employee换成基本数据类型值就不变了
      

  6.   


    整明白这个问题,java就算入门了
      

  7.   

    java程序设计语言总是采用值调用。也就是说,方法得到的是所有参数的值的一个拷贝,特别是,方法不能修改传递给他的任何参数变量的内容。’其实这句话已经说的很明确了:你程序修改的值,而不是那个值的一个拷贝,即参数
      

  8.   


    其实这句话已经说的很明确了:你程序修改的是你那个变量salary的值,而不是修改那个值的一个拷贝,即传递给方法的参数
      

  9.   

    class Test{
       public static void main(String[] args){
           int i=5;
           fun(i);
           System.out.println(i);
           
      }  static void fun(int j){
           j+=5;
           System.out.println(j);
      }
    }
    运行上面的程序得到如下结果:
    10
    5
    引用三楼:
    实际上,调用A.s后,形参m和实参ea都指向一个对象,通过m调用对象的方法改变了对象的状态,由ea和m引用同一个对象,所以ea也改变了。
      

  10.   

    java语言中只有值传递,当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用,对象的内容可以在被调用的方法中改变,但是对象的引用确实永远不会改变的。