JAVA関数は入力した変数を修正できますか?
1518 ワード
一般的に言えば、时にはできないこともあると言えます.では、具体的に、テーマに直入して、治療効果を見てみましょう.次の例です.
実際、上記の問題とこの問題は「JAVA関数が値を渡すのか、参照するのか」という問題です.
JAVAは値を渡すが、この値のValueは変数の参照である.
Change(int tmp)入力値を変更しなかったのは,Integerが可変オブジェクトであり,Integerの値を直接変更することができず,新しいオブジェクトを生成して指向するしかないためである.このように関数内の一時変数と入力変数値(参照)は既に異なる.
change(final Listlist)の値が修正されたのは、パラメータが出入りする値が参照であるため、参照は変化しないが、参照の対象は変化する.参照の対象が変化したため、この対象を指すすべての変数も当然変化する.
注意深いことに、change(int tmp)というパラメータはfinalを追加できないことに気づいたかもしれません.
追加がtmpを表す場合は別のオブジェクトに変更できませんが、change(finalListlist)は可能です.理由も同じです.
change(int tmp):関数の内容では、tmpを変更するため、tmpが異なるオブジェクトを指し、finalと宣言すると修正箇所で構文エラーが発生します.
change(final Listlist):final修飾後は別のオブジェクトに変更できませんが、オブジェクト内の内容は変更できます.
import java.util.LinkedList;
import java.util.List;
public class Api {
public static final void main(String[] args) {
int tmp = 10;
change(tmp);
// , temp
System.out.println(tmp);
List<Integer> list = new LinkedList<Integer>();
change(list);
// , List , 0, 1
System.out.println("size=" + list.size());
}
public static void change(int tmp) {
tmp = tmp * 2;
}
public static void change(final List<Integer> list) {
list.add(1);
}
}
実際、上記の問題とこの問題は「JAVA関数が値を渡すのか、参照するのか」という問題です.
JAVAは値を渡すが、この値のValueは変数の参照である.
Change(int tmp)入力値を変更しなかったのは,Integerが可変オブジェクトであり,Integerの値を直接変更することができず,新しいオブジェクトを生成して指向するしかないためである.このように関数内の一時変数と入力変数値(参照)は既に異なる.
change(final List
注意深いことに、change(int tmp)というパラメータはfinalを追加できないことに気づいたかもしれません.
追加がtmpを表す場合は別のオブジェクトに変更できませんが、change(finalList
change(int tmp):関数の内容では、tmpを変更するため、tmpが異なるオブジェクトを指し、finalと宣言すると修正箇所で構文エラーが発生します.
change(final List