大家看段代码:public class Student {
  
String name;
int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}

 public  void change(Student s){
 s.age=10;
 s.name="lisi";
 }  public  void change2(Student s){
 s=null;
 }
}
public class Test {
   public static void main(String[] args) {

 Student stu=new Student("zhangsan",20);
 
 stu.change(stu);
 System.out.println(stu.name+"    "+stu.age); //这里打印结果是 lisi  10
 
 stu.change2(stu);
 System.out.println(stu.name+"    "+stu.age);//而这里为什么不报空指针异常,stu变量为什么没
                                                               //被销毁? 怎么解释?
}
}基础没学好,求指点谢谢。
为什么不报空指针异常? 我的本意是想销毁stu变量。

解决方案 »

  1.   

    s是一个局部引用类型(引用Student)的变量,出了change2()的方法体,别的地方引用不了,除非这个函数返回s。
    像这样public Student change2(Student s)
    {
    s = null;
    return s;
    }然后再用这个s去调用其成员函数,就会提示java.lang.NullPointerException
    另外,stu引用的对象并没有改变,这和局部变量s不是一回事。
      

  2.   

    其实很好理解的 你在change(change2)函数中创建的都是引用变量,而引用变量只是用于操作对象的而不是对象本身,也可以理解为又一个指向对象的指针,因此change函数能修改成功完全就是另一个指针(s)进行了一次对象操作,而change2函数中仅仅只是让这个指针(s)指向null(本来是指向stu所指向的对象的)!因此这种情况是不会出现空指针异常的
    ps:java中是没有指针的,这里我只是为了方便述说所以使用了这个说法
      

  3.   

    那这句会不会也没有改变s的变量public void change(Student s){
    s.age=10;
    s.name="lisi";
    }
      

  4.   

    这里你传stu进来,所改变的只是stu所引用对象的成员变量,并没有改变stu引用对象的地址。楼主的想法是销毁stu变量,也就是不让stu引用原有的对象。
      

  5.   

    public void change2(Student s){
    s=null;
    }只是先把局部变量S指向stu所引用对象,再把s指向null,stu指向从来没变过。S就像STU的别名,大家所指向的对象一样,但是你把S删除了并不影响STU,他还是存在的
      

  6.   

    楼主你只要记住一句话:Java传参只有值传递。
      

  7.   

    就是java里参数很严格的传值的规定。之前也给了我不少困惑的。
      

  8.   

    public void change2(Student s){
    s=null;
    }
    java中只有值传递,此时s与stu指向同一个内村地址,s=null,只是单纯的将s的对象销毁,stu还是指向原来的内存地址,所以stu没有改变,,可以画出内存地址图看下,,
      

  9.   

    你把change2 改成 public static void change2(Student s){s=null}试试