JAvaでの参照とオーバーフロー

989 ワード

前に書いた文章『プログラミング言語における様々な「ポインタ」』』でjavaリファレンスについて書いたことがあります.まとめると、javaで関数にパラメータを渡す場合、パラメータがオブジェクトタイプ(例えば配列、または最終的にObjectから継承されたオブジェクト、int、byte、longなどの単純なタイプとは異なる)である場合、参照方式を採用し、関数内部でオブジェクトの属性を変更し、関数呼び出しが完了した後も、これらの変更は保持されます.
オーバーフローの問題についてお話ししますが、ここでの「オーバーフロー」とは、C言語のメモリオーバーフローではなく、変数の修正可能な領域が予想以上の場合を指します.たとえば、次のコードがあります.
public class RefTest {
	public static final int DATA_LEN = 10;
	private final byte[] data = new byte[DATA_LEN];	
	
	public RefTest() {
		
	}
	
	public byte[] getData() {
		return data;
	}
	
	public static void main(String[] argv) {
		RefTest test = new RefTest();
		byte[] data = test.getData();
		System.out.println(data[0]);
		data[0] = 10;
		byte[] data2 = test.getData();
		System.out.println(data2[0]);
	}
}

コードクリップ1
最後の文System.out.println(data 2[0]);何が印刷されますか?0になりますか?おめでとうございます.答えを間違えました.10のはずです.privateプロパティにsetterのような方法を提供していないと思ってはいけません.外部では変更できません.上のコードのgetData関数は、属性dataを完全に漏れ出しており、外部では内部データを勝手に変更することができます.