在java中传递值的问题

AKS*_*AKS 5 java pass-by-value

Java支持按值传递(总是在副本上工作),但是当你传递一个用户定义的对象时,它会改变实际的对象(通过引用传递但没有指针改变的类型),我理解但是为什么下面的changeObject2CLEAR方法实际上正在改变对象的价值?相反,它必须在副本上工作?


import java.util.HashMap;
import java.util.Map;

public class PassBy {

    class CustomBean {
        public CustomBean() {

        }

        private int id;
        private String name;

        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }   

        @Override
        public String toString() {
            return id + ", " + name;
        }
    }

    public Map<Integer, String> changeObject2NULL (Map<Integer, String> m) {
        m = null;
        return m;
    }

    public Map<Integer, String> changeObject2CLEAR (Map<Integer, String> m) {
        m.clear();
        return m;
    }

    public CustomBean changeCustomObject (CustomBean _e) {

        _e.setId(_e.getId() + 1);
        return _e;
    }

    public static void main(String[] args) {

    PassBy passby = new PassBy();

    Map<Integer, String> map = new HashMap<Integer, String>();
    map.put(1, "value");

    CustomBean bean = passby.new CustomBean();
    bean.setId(1);
    bean.setName("arun");

    // Initial Value
    System.out.println(map.toString());
    System.out.println(bean.toString());
    System.out.println("-------------------------");

    // Pass by value works fine
    passby.changeObject2NULL(map);
    passby.changeCustomObject(bean);

    // Custom object value changes since we pass as the object reference but Map remains with actual value
    System.out.println(map.toString());
    System.out.println(bean.toString());
    System.out.println("-------------------------");

    // Testing Pass by value - CANT UNDERSTAND why it changed the object since it has to be pass-by-value and not by ref in this case ??
    // Why setting to null not chainging the value but clear does ?
    passby.changeObject2CLEAR(map);
    System.out.println(map.toString());

    }
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*ugh 1

你打电话时changeObject2CLEAR

passby.changeObject2CLEAR(map);
Run Code Online (Sandbox Code Playgroud)

你正在传递实例map

在方法中changeObject2CLEAR

public Map<Integer, String> changeObject2CLEAR (Map<Integer, String> m) {
    m.clear();
    return m;
}
Run Code Online (Sandbox Code Playgroud)

即使在调用它的方法中,您也可以.clear()在同一个实例上执行。mapm

作为理解练习,请注意以下方法将执行相同的操作。

public void changeObject2CLEAR (Map<Integer, String> m) {
    m.clear();
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不必返回 ,Map<Integer, String> m因为map您可以访问的 是在调用该方法时传入的相同实例对象。

编辑:为什么m = null;表现为按值传递但m.clear()表现为按引用传递?

当您“分配”值时,nullm正在将引用从先前的实例对象更改map为新的内存位置,即null.

当您调用.clear()实例对象上的方法时m,您正在调用位于 引用的内存位置的同一对象上的方法map,因此您修改了该map对象。