Java中安按值调用和引用调用问题

按值调用和引用调用


Java中只有按值调用,没有引用调用
示例:

class Operation {
    int data = 50;

    void change(int data) {
        data = data + 100;
    }

    public static void main(String args[]) {
        Operation op = new Operation();

        System.out.println("before change " + op.data);
        op.change(500);
        System.out.println("after change " + op.data);

    }
}

示例结果

before change 50
after change 50

另外一个比较容易混淆的示例

class Operation2 {
    int data = 50;

    void change(Operation2 op) {
        op.data = op.data + 100;
    }

    public static void main(String args[]) {
        Operation2 op = new Operation2();

        System.out.println("before change " + op.data);
        op.change(op);
        System.out.println("after change " + op.data);

    }
}

数据结果

before change 50
after change 150

貌似通过change是按照应用调用的;实际上依然是按值调用;
第一个案例中的change()方法;

void change(int data) {
    data = data + 100;         
}

//实际上 this.data = data,传进来的data已经不是原来的data了,所以这里data+100,只是This.data + 100,原来的值不变;

而第二个示例

    void change(Operation2 op) {
        op.data = op.data + 100;
    }

传入的是对象op,同样this.op = op;但是op中,data都是同一个;
Java中安按值调用和引用调用问题
两个对象同时引用data,所以当this.data 改变时,op的data也改变,虽然看着像引用调用,但是实际上还是按值调用。