public class Person { /**
 * @param args
 */
int i=100;
void chage(Person p){
p=null;  //1
}
public static void main(String[] args) {
Person pp=new Person();
pp.chage(pp);
System.out.println(pp.i);
}
}
//output:
100
chage方法中是按照的引用方式传递 那么pp不是应该指向的是null吧 而为什么事实却不是如此呢?高手来帮帮忙啊!!

解决方案 »

  1.   

    传递的是引用的副本,pp.chage(pp); 这个pp和
    void chage(Person p){
    p=null;  //1

    中的p不是一个东西。
    不过这个例子够经典的,想让本身成为null吗?
      

  2.   

    可是对副本的操作是对其本身的操作吗?
    如果不是那么
    public class Person { /**
     * @param args
     */
    int i=100;
    void chage(Person p){
    p.i=1;
    }
    public static void main(String[] args) {
    Person pp=new Person();
    pp.chage(pp);
    System.out.println(pp.i);
    }
    }
    pp.i是不应该改变的啊 但是 实际是改变了啊 i=1了?
      

  3.   

    pp.chage(pp); 
    自己改变自己? 写个static 的change试试
      

  4.   

    副本和本身都是引用,指向在堆里的同一个对象。
    p.i是改变了对象的数据,因为pp和p引用的是一个对象,当然起作用
    p=null;是改变了p这个引用,让p指向null,p不和pp指向同一个对象了而已。跟pp就没有关系了。
      

  5.   

    public class Test {/**
    * @param args
    */
      int i=100;
      void chage(Test p){
         p.i=1;
      }
      public static void main(String[] args) {
        Test pp=new Test();
        pp.chage(pp);
        Test t = new Test();
        System.out.println(pp.i);
        System.out.println(t.i+"********");
      }

    你这样测试一下就知道了,输出的结果分别为,1和100
      

  6.   

    晕,就别再用pp.chage(pp);这样奇怪的代码举例子了。
      

  7.   

    有点点明白了,本人是刚学java 多谢高手帮忙了!
      

  8.   

    void chage(Person p){ 
    p=null;  //这个P开始指向和pp对中的同一个对象,然后有指向了null并不影响pp的指向,他改变的只是他自身的指向
      

  9.   

    ZangXT好厉害,对细节都这么的了解.....顺便问下哪里可以看到这些方面的介绍呢
    Java Virtual Machine Specification有中文版吗
      

  10.   

    那是不是说重新生成了一个引用,然后这个chage(person)改变的其实是这个新生成的引用?
    thanks
      

  11.   

    public class Person {/**
    * @param args
    */
    int i=100;
    Person chage(Person p){
    p=null;  //1
    return p;
    }
    public static void main(String[] args) {
    Person pp=new Person();
    pp=pp.chage(pp);
    System.out.println(pp);
    }
    }
    output:null不是涉及到引用就是引用传递,这分明是个值传递问题。
      

  12.   

    没办法,很多书起到了误导作用。
    java的设计者们选择术语的时候也有问题。
      

  13.   

    来我博客看看啊,我也是新手,关于值传递,我花了1个小时总结的
    http://blog.csdn.net/niuniu20008/archive/2008/09/19/2953785.aspx
      

  14.   

    public class Person { 
    public static void main(String[] args) { 
    Person p1  = new Person ();
    Person p2 = p1;
    p2=null;
    //here p1=? 

    }
    }这样就明白了~