いろいろやってみる。
はてなブログでツイートを貼り付ける機能があるけども、自分のツイートは出来るけどやり取りの貼り付けが出来ない。
なので、やり取りをふぁぼればいいんじゃね?っていうので試してみる。
@shigemk2 帰宅後にコメントします。一点だけ先に言うと、Javaではプリミティブ型以外の変数への代入はすべて「参照」です(この部分はJavaの枠組みを借りているScalaも同じ)。val a = Hoge(1) みたいなのは参照と呼ばれているという意味です。(続く)
— 七誌 (@7shi) May 16, 2015
@shigemk2 C++の「参照」とは意味合いが異なります。代入時の挙動などC++でのポインタに近いです。そういうポインタのようなものをデフォルトにして*のような記号を付けていないで、それを「参照」と呼んでいます。この辺の知識なしで比較するのはナンセンスです。(続く)
— 七誌 (@7shi) May 16, 2015
@shigemk2 混乱を招くので説明を避けていましたが、C++で Hoge a; のようなものは参照ではなく実体を指していて、Hoge *a = new Hoge; はポインタです。Hoge *b = a; はポインタの代入でコピーコンストラクタとは無関係です。(続く)
— 七誌 (@7shi) May 16, 2015
@shigemk2 Scalaで val a = Hoge(); val b = a とやるのは「参照」と呼ばれているけど実体はポインタに近いというのはそういう意味です。しかしポインタと違ってアドレスを指しているわけではなく、実体はハンドル(主キーのようなもの)です。(続く)
— 七誌 (@7shi) May 16, 2015
@shigemk2 それがどういう意味かと言うと、インスタンスのメモリ上の位置はGCに伴って移動することがあるため(これをコンパクションと呼びます)、アドレスでは不都合があるからです。C++のポインタとも参照とも異なるものを、Javaでは参照と呼ぶということです。(続く)
— 七誌 (@7shi) May 16, 2015
@shigemk2 裏側の仕組みとしてはポインタのようにアドレスを直に扱うより難しいことをしています。そして、これが重要な点ですが、JVMはC++で作られています。だからJVMの上で動く言語と比較するのは色々と筋が悪く、その辺を踏まえないとまともに比較できない代物なのです。(完)
— 七誌 (@7shi) May 16, 2015
@shigemk2 これは引数のことなので、私が話したこととは違います。
— 七誌 (@7shi) May 16, 2015
@shigemk2 それは今やることじゃないと思います。今回のやり取りで出たことはOJTで覚えるようなことではありません。
— 七誌 (@7shi) 2015, 5月 16