JAVA関数は入力した変数を修正できますか?

1518 ワード

一般的に言えば、时にはできないこともあると言えます.では、具体的に、テーマに直入して、治療効果を見てみましょう.次の例です.
 
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 Listlist)の値が修正されたのは、パラメータが出入りする値が参照であるため、参照は変化しないが、参照の対象は変化する.参照の対象が変化したため、この対象を指すすべての変数も当然変化する.
 
 
注意深いことに、change(int tmp)というパラメータはfinalを追加できないことに気づいたかもしれません.
追加がtmpを表す場合は別のオブジェクトに変更できませんが、change(finalListlist)は可能です.理由も同じです.
change(int tmp):関数の内容では、tmpを変更するため、tmpが異なるオブジェクトを指し、finalと宣言すると修正箇所で構文エラーが発生します.
 
change(final Listlist):final修飾後は別のオブジェクトに変更できませんが、オブジェクト内の内容は変更できます.