class Data{
  public int m;
}
...
void half(Data d) {
   D.m /= 2;
}

解决方案 »

  1.   

    传址的话,该地址是不能改变的.但地址中的内容可以改变.
    当把Data d传给half(),我们可以改d中的内容.但d指向的地址不变.
    整个程序应该是:
    class Data{
      public int m;
    }
    public class CallByValue
    {
    static void half(Data d)
    {
    d.m /= 2;
    System.out.println("half方法d.m="+d.m);
    }
    public static void main(String args[])
    {
    Data d = new Data();
                      d.m=Integer.parseInt(args[0]);
    System.out.println("调用half之前d.m="+d.m);
    half(d);
    System.out.println("调用half之后d.m="+d.m);
    }
    }
    这段程序没有用编译器验过,可能会有小错. :-)
      

  2.   

    helpall() 的程序正确运行。
    这是一个传值和传址的问题。是基本类型与对象类型的区别。
      

  3.   

    public class CallByValue
    {
    static int half(int n)
    {
    n=n/2;
    System.out.println("half方法n="+n);
                      return n;
    }
    public static void main(String args[])
    {
    int m=Integer.parseInt(args[0]);
    System.out.println("调用half之前m="+m);
    m=half(m);
    System.out.println("调用half之后m="+m);
    }
    }
      

  4.   

    以我的理解,在java也好,在C/C++也好,所有函数调用中的参数传递都是把外部变量的值拷贝一份,再把该值传进去,只是有的时候这个值是地址而已.   如果在函数中改变的是传进去的地址中的值,那么外部的变量也会变.如果改变的是地址本身,那就只好说sorry了. 我们当然不能指望改变备份的值也能改变外部的值.   实际上用C/C++的指针很好理解这一概念.如果传给你一个指针(像StringBuffer buf),你把指针指向的地址的内容改了:
       buf.append("abc"); //StringBuffer可改,String是不可改的
    外部变量也是指向那地址, 它也就变了.如果你把指针指向的地址改了:
       buf = new StringBuffer("abc");
    外部变量还是指向老地址,不会变.
       不必拘泥于名词,关键是理解.我认为所有调用都是传值,传址只是传值的特例,值是地址罢了.