Javaは、値渡し(常にコピーで動作します)をサポートしますが、ユーザー定義オブジェクトを渡すと、実際のオブジェクト(参照渡しの種類はポインタの変更の種類)なぜchangeObject2CLEARメソッドが実際にオブジェクトの値を変更しているのか理解していますか?代わりにそれはコピーで動作する必要がありますか?Javaでの値渡しの問題
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());
}
}
*参照*を値渡ししています。 Googleについてこれについてたくさん説明します。良い質問。 – Bathsheba
@Arunあなたの質問の洗練されたフォームに対処するために自分の答えを更新しました –
短く 'changeObject2NULL(Map m)はメソッドパラメータである独自のローカル変数* mを含みます。 'changeObject2NULL(map)'のようにこのメソッドを使うと、 'm'は' map'が保持しているオブジェクトに関する情報をコピーします(このアドレスは 'map'変数の* value *です)。したがって、 'm.clear()'を呼び出すと 'map'が保持する同じオブジェクトに対して' clear'メソッドが呼び出されるので、 'map'を介してそのオブジェクトの新しい状態を見ることができます。'm = null'を呼び出すと、単に' m'が 'null'に保持するオブジェクトを変更するだけです。これは 'map'やそれが参照しているオブジェクトには影響しません。 –
Pshemo