lwd8805
lwd8805
2017-05-17 02:59
采纳率: 33.3%
浏览 843
已采纳

java 传递引用问题,希望帮忙解释下

private static class A{
    private int x;
    private int y;
    public A(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

private static void dealA(A a){
    a = new A(1,2);
}
public static void main(String args[]){
    A a = null;
    dealA(a);
    System.out.print(a);
    }
    这时输出是null,若传递引用为啥a没有改变呢,若函数参数换成List<A> ,此时在函数里改变list,函数返回时可以看到修改。明白的人帮忙理解下。
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • qq_34658785
    卖太妃糖的古尔丹 2017-05-17 03:23
    已采纳

    java里传值有两种,引用传递和值传递,基本类型就是值传递,引用类型就是引用传递,由于java里没有指针,所以你直接这样穿过去赋值是不行的,你传过去之后,它会在栈里开辟一个空间声明一个A类型变量a,然后把你传过去的引用赋值给它,你修改的是开辟的栈里的临时变量指向的对象,而不是你main方法里a的指向地址,所以肯定是null,至于你说的List,我不知道你是怎么写的,是不是创建一个List,然后把List的一个集合元素a传过去,如果是这样是可以的,因为你传过去的数组引用,他对这个引用的地址种的a变量进行修改,这样是可以的,看不到代码,不知道你说的是不是这个意思

    点赞 评论
  • caozhy

    list也不行,不信你试试。
    可以修改a(或者给list添加删除),但是不能让a或者list指向另一个对象。

    点赞 评论
  • sihuitiankong
    sihuitiankong 2017-05-17 03:36

    方法返回修改的A才会获得改变的值

    点赞 评论
  • taoleialskdjfhg
    ZealotTL 2017-05-17 03:43

    结构有点错,将class A 提到Run外

    点赞 评论
  • qq_24067223
    i苏摩 2017-05-17 03:44

    我是这样理解的。
    1.传递引用传递的是对象指向的内存地址,实参a是一个新的对象,复制了形参a,指向同一块内存。
    当你a = new A(1,2);时,只是将实参a指向new出来的新对象,并未改变他指向的值,方法dealA结束时,实参a就释放了,所以没有影响形参a。
    2.函数参数换成List的情况,实参list是一个新的对象,复制了形参list,指向同一块内存。
    当你list.add(1);时,实参list在指向的内存中添加了一个值,改变了他指向的内存。形参list与实参list指向的是同一块内存,即使方法结束实参list释放,形参list还是改变了。
    总结,方法中**传递对象**时,等号赋值不会影响原对象,只有修改其属性时才会影响原对象。

    点赞 评论
  • w0220059
    w0220059 2017-05-17 03:44

    main方法中的a指向null
    把这个null引用传递给dealA的参数A a,这个dealA的a指向null
    此时2个a都指向null
    然后dealA方法中对本方法的a引用到新的对象地址,但是main方法中的a没有改变
    最终你输出的是main方法中的a,因此输出null
    这是我的理解

    点赞 评论
  • taoleialskdjfhg
    ZealotTL 2017-05-17 03:47

    main 方法里的a,与dealA 方法里的a不是同一个变量;
    main里的变量a指向null空间,dealA方法里的a开始也是指向null空间,通过new操作之后,dealA方法里的a指向了new的空间,main里的a指向没有改动,所以打印出来是null
    代码改成这样打印的就不是null了
    public class Run {
    public static A a;
    public static void main(String args[]){
    Run.a = null;
    dealA();
    System.out.print(R.a);
    }
    private static void dealA() {
    Run.a = new A(1,2);
    }

    class A{
    private int x;
    private int y;
    public A(int x, int y) {
    this.x = x;
    this.y = y;
    }
    }
    }

    点赞 评论
  • weixin_38791176
    cool小伙 2017-05-17 04:05

    public class A{
    private int x;
    private int y;
    public A() {

    }
    public A(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public String toString() {
        return "A [x=" + x + ", y=" + y + "]";
    }
    
    public static void main(String args[]){
        A a = null;
        dealA(a);
        //System.out.print(a);
    }
    public static void dealA(A a){
        a = new A(1,2);
        System.out.println(a.toString());
    }
    

    }

    点赞 评论
  • chenbaige
    legendCoder 2017-05-17 05:30

    null是不会分配内存空间的,因此在传递的时候相当于没能把地址传递过去。

    点赞 评论

相关推荐