JAvaでの参照とオーバーフロー
989 ワード
前に書いた文章『プログラミング言語における様々な「ポインタ」』』でjavaリファレンスについて書いたことがあります.まとめると、javaで関数にパラメータを渡す場合、パラメータがオブジェクトタイプ(例えば配列、または最終的にObjectから継承されたオブジェクト、int、byte、longなどの単純なタイプとは異なる)である場合、参照方式を採用し、関数内部でオブジェクトの属性を変更し、関数呼び出しが完了した後も、これらの変更は保持されます.
オーバーフローの問題についてお話ししますが、ここでの「オーバーフロー」とは、C言語のメモリオーバーフローではなく、変数の修正可能な領域が予想以上の場合を指します.たとえば、次のコードがあります.
コードクリップ1
最後の文System.out.println(data 2[0]);何が印刷されますか?0になりますか?おめでとうございます.答えを間違えました.10のはずです.privateプロパティにsetterのような方法を提供していないと思ってはいけません.外部では変更できません.上のコードのgetData関数は、属性dataを完全に漏れ出しており、外部では内部データを勝手に変更することができます.
オーバーフローの問題についてお話ししますが、ここでの「オーバーフロー」とは、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を完全に漏れ出しており、外部では内部データを勝手に変更することができます.