GCなしの言語(C/C++/Rust ..)から来ています。配列が再割り当てされた場合、どういうことが起こっているのだろうかと思います。私たちは言語のようなC++(擬似コード)にいる場合Javaの参照値とは何ですか?なぜそれが変更されますか?
が、これが悪いと考えられている:
Obj *x = xarr[2];
xarr.push(new Obj(12));
do_with(x);
がプッシュした後、C++ http://ideone.com/qk7vcj
で例を実行し、xが原因解放されたメモリを指すことがありますxarrの再割り当て
xは基本的に、xarr [2]のメモリアドレスを格納するポインタサイズの整数です。
もし私がjavaで同じことをするならば。これは正常に動作していると私はなぜ思っていますか?
List<OBJ> list = new ArrayList<>();
list.add(new OBJ());
list.add(new OBJ());
list.add(new OBJ());
OBJ x = list.get(2);
for (int idx = 0; idx < 1000000; idx++) {
list.add(new OBJ());
}
do_it(x);
xが正確に何であり、どうやってxのメモリアドレスが変更されたように見えるのですか?
明らかに、x2はこのコードのようにx2を変更できないため、配列のコピーを作成していないため、xのアドレスも変更されています。
private static class OBJ {
int one;
String two;
public OBJ() {
this.one = 1;
this.two = "two";
}
}
public static void do_it(OBJ o) {
System.out.println("o.two is: " + o.two);
}
public static void main(String[] args)
{
List<OBJ> list = new ArrayList<>();
list.add(new OBJ());
list.add(new OBJ());
list.add(new OBJ());
OBJ x = list.get(2);
printAddresses("Address x", x);
for (int idx = 0; idx < 1000000; idx++) {
list.add(new OBJ());
}
OBJ x2 = list.get(2);
x2.two = "haha";
printAddresses("Address x", x);
do_it(x);
}
がフル実施例は、ここにhttp://ideone.com/P3j6xF
を見つけることができます。この
Address x: 0x525554440
Address x: 0x550882b80
o.two is: haha
をプリントアウトしてはならないので、xのアドレスがリストの再配分後にどのように変化するか質問を頼みます。そして、いわゆる「参照」とは何か?私は、Javaでのいわゆる "参照"は、Javaですべてが参照ではなく値渡されるため、自動参照やポインタ演算のない通常のポインタだと考えました。これは、xがポインタのように動作しているが、必要に応じて何とかJavaはそれをリダイレクトしているようなので、それはそう
x.one: 2 x.two: two
をプリントアウトhttp://ideone.com/k4Ijq0
public static void test1(OBJ o) {
o.one = 2;
}
public static void test2(OBJ o) {
o = new OBJ();
o.two = "no reference";
}
public static void main (String[] args) throws java.lang.Exception
{
OBJ x = new OBJ();
test1(x);
test2(x);
System.out.println("x.one: " + x.one + " x.two: " + x.two);
}
このコードでは明らかです。これはどのように作動しますか? 「参照」という用語は余計に混乱しますが、なぜそれはそのように呼び出されますか?
また、[変数、オブジェクト、および参照の違いは何ですか?](http://stackoverflow.com/questions/32010172/what-is-the-difference-between-a-variable-object-and -reference) –
@ Sotirios Delimanolisこれは実際に私の問題に対処していません。 –
これを明確にしてください。あなたはそれを参照して何を意味するのですか? –