If I instantiate an object and pass it to an function, in this function I assign this object to null. It seems when return from the function, the object still there.
I just want to know when I assign null, what happens.
If I instantiate an object and pass it to an function, in this function I assign this object to null. It seems when return from the function, the object still there.
I just want to know when I assign null, what happens.
オブジェクトに割り当てることはできません。あなたが今まで持っているのはプリミティブと参照だけです。参照は、nullまたは適切なクラスのオブジェクトへのポインタのいずれかです。
Java引数は値で渡されます。呼び出されたメソッドは、参照のコピーを取得しました。その参照をnullにしました。呼び出し元のメソッドには、渡されたコピーへの割り当ての影響を受けない独自の参照があります。その参照はまだオブジェクトを指しています。
Javaのメソッドへの引数は「値渡し」です。これは、オブジェクト参照のコピーをメソッドに渡すことを意味します。この参照にnullの値を割り当てると、メソッド呼び出し内でその値が変更されますが、コピーであるため、メソッド外の参照には何も行われません。コードで示されています:
void doSomething(final String input) {
input = null;
System.out.println("Input is: " + input); // prints null
return;
}
final String name = "Bob";
doSomething(name);
System.out.println("Name is: " + name); // prints 'Bob'
オブジェクトをインスタンス化して関数に渡し、関数内でそれをnullなどに再割り当てすると、呼び出し側では、引数が値(オブジェクトの場合は参照のコピー)によって渡されるため、呼び出し時に反映されません。側はまだ古いオブジェクトを指します。メソッドでの再割り当てを制限する場合はfinal
、メソッドパラメータでキーワードを使用できます
オブジェクト参照を関数に渡すと(Javaでは常にメソッドと呼ばれます)、メソッドスコープで新しい参照がスタックメモリに作成されますが、それらはヒープメモリ内の同じオブジェクトを指します。したがって、新しいにnullを割り当てると参照、そのオブジェクトへのこの参照のリンクのみが壊れています。前の参照には影響しません。