ここから本文です

超初歩的ですが、Javaにおいて代入式の捉え方(イメージ)について質問です。

ten********さん

2020/7/1321:35:14

超初歩的ですが、Javaにおいて代入式の捉え方(イメージ)について質問です。

C言語やJavaで
int x = 5;
のような表記があれば、
『int型のxという変数に5を代入するということ。(数学と一緒)
ただし、数学ではxは5と同値だし、"逆に"5もxと同値だと考えられるけど、プログラミングではその"逆"が成り立たない』
というふうに捉えていたのですが、これは間違いでしょうか?

というのも、Javaでポリモーフィズム(多態性)の勉強をしている最中に思ったんです。

kuruma(車)はnorimono(乗り物)だと"大雑把に見れば"同一視だけど、その逆は無理。
kuruma is a norimonoの関係は成立しますが、norimono is a kurumaは無理ですよね。

それで、
norimono k = new kuruma();
というコードを見て、思ったんです。
これは、「kという乗り物型変数は、車インスタンスと”大雑把に見れば”同じもの」だとイメージしました。
でも、実際はその逆で
「車インスタンスは、kという乗り物型変数と"大雑把に見れば"同じもの」というイメージが正しいのですよね?

逆のイメージを持ってしまうのは、冒頭の『』内の理解が誤っているからなのかなと思って質問させていただきました。
ぶっちゃけ『』内のイメージは間違いですか?
ポリモーフィズムを知るまでは、一度も違和感を覚えたことはありませんでした。

素直にプログラムの代入式は「同値」とか「等しい」とか考えず、「左辺の箱(変数)の中に右辺のリテラル(もしくはインスタンス※実体)を入れる」だけだと考えるべきなのでしょうか?

抽象的な文章ですみません。テーマがテーマだけになかなか伝わりにくいかもしれませんが…。

補足訂正です。

同一視だけど→同じだけど
その逆は無理→その逆は成り立たない(kurumaがnorimonoと"大雑把には同じ"だと言えても、norimonoがkurumaと"大雑把には同じ"だとは言えない)


あと、"大雑把に見れば同じ"といった表現に納得がいかない方もいるかもしれませんが、参考書にそう書いてありました。
A is a Bのとき、Aは大雑把に見ればBと捉えられる と。

閲覧数:
21
回答数:
4

違反報告

回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

n2q37_cppさん

2020/7/1409:23:42

norimono k = new kuruma();

norimono k = (norimono)new kuruma();


このように見ていただく必要があります。(norimono) というキャスト演算子が隠れている形です。


ですから、k と new kuruma() を比べるのではなくて、k と (norimono)new kuruma() を比べるべきというわけです。


【C言語やJavaで int x = 5; のような表記があれば、『int型のxという変数に5を代入するということ。(数学と一緒)ただし、数学ではxは5と同値だし、"逆に"5もxと同値だと考えられるけど、プログラミングではその"逆"が成り立たない』というふうに捉えていたのですが、これは間違いでしょうか?】


x を 5 で初期化しているという風に見ていただくのが適切であると考えます。


int x;
x = 5;

この手続きは「int型のxという変数に5を代入するということ」と言えます。


norimono k;
k = new kuruma();

この手続きはkuruma型オブジェクトを新規に作成して変数 k に代入するということ、と言えます。

この手続きが終わった後の状況を描写する際、「kという乗り物型変数は、車インスタンスと”大雑把に見れば”同じもの」と言えば言えるかもしれません。

もう少し細かく言うとしますと、ここで「車インスタンス」ではなくて、それに対して(norimono)のキャスト演算子を適用したものということになります。


【でも、実際はその逆で「車インスタンスは、kという乗り物型変数と"大雑把に見れば"同じもの」というイメージが正しいのですよね?】

「逆」とおっしゃる部分に理解が及んでいませんが、やはり代入後の状況を「"大雑把に見れば"同じもの」という風に言えば言えると思います。



【ぶっちゃけ『』内のイメージは間違いですか?】

間違いではないと思います。但し、正確な捉え方との隔たりがどれくらいあるかという部分で少し検討が必要かもしれません。


【素直にプログラムの代入式は「同値」とか「等しい」とか考えず、「左辺の箱(変数)の中に右辺のリテラル(もしくはインスタンス※実体)を入れる」だけだと考えるべきなのでしょうか?】

等しいと考えるべきだと思います。しかし、何が等しいのかは隠れたキャスト演算子の部分についても見ることが必要になってくると考えます。

それと Java においては、この場合の変数はポインタです。つまり、インスタンスの実体を入れることは不可能。キャストも、そういうわけでポインタのキャストです。実体を変形させているものではなくて。

というところの捉え方も、この場合は重要になって来る気がしています。

prwssさん

2020/7/1323:52:37

>「左辺の箱(変数)の中に右辺のリテラル(もしくはインスタンス※実体)を入れる」

はい

あなたは、伝統的な箱の比喩だけで考えた方がいいです

***

要するに集合や分類でして、乗り物がクルマを含むなら、乗り物型の変数にはクルマを入れられます

つまり、norimono⊃kuruma です

言語的な記述のis-aよりも、集合の包含関係での文字通りのイメージ(絵)にした方が早いです

なので、乗り物型の変数にウマを入れてもいいです

なぜなら、ウマも乗り物だからです

乗り物という抽象的なモノに分類されている具体的なモノは、全て乗り物変数に突っ込んでいいです

***

ついでに、「乗り物」というそれそのものは存在しないです

「乗り物」というモノは単語だけであり、実物がないです

プロフィール画像

カテゴリマスター

あみやさん

2020/7/1323:12:16

プログラミングの代入は、数学とは全く別物と考えた方が、変に悩まなくて住みます。

そもそものプログラミングにおける変数というのは、メモリ上の特定のエリアを人間に分かりやすい形として表した、架空の存在でしかありません。
(実際、コンパイルした後のマシン語にはもはや変数は存在しません)

変数への代入の実態は、メモリの特定のアドレスへのデータの書き込みです。

変数の型というのは、その際にメモリ上の何ビットを使うのか?というサイズの問題と
そこに書かれているデータをどういう意味として読み書きするのか?というフォーマットの問題になります。

とりあえず、まずはそういうイメージで見るとシンプルになります。

(その上でオブジェクト指向のポリモーフィズムの方は少し別の層の考え方が必要になります)

  • あみやさん

    2020/7/1400:51:18

    変数の正体はメモリアドレス
    変数の型はデータフォーマット
    と理解すると、数学とは全く違うものが見えてきます。

    それぞれの記述の本当の意味はこうなります。

    int x
    メモリから4バイト分のメモリを確保せよ。
    これよりコード上のxという変数は、確保したアドレス(仮に0x0100)から始まる4バイトのエリアとする。

    x = 5
    (0x0100)から4バイトのメモリ空間へint型のフォーマットで、5を書き込め。

    こんな感じなので、プログラミングの代入に、同値とか等しいといった意味は、一切ありません。
    『素直に箱に入れるだけと考えるべき』というのはそのとおりです。


    その上で、ポリモーフィズムにとって大事なのは、上で書いた、『型はとはデータフォーマットである』ということです。

  • その他の返信(3件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

kidotakaさん

2020/7/1323:10:37

入れるだけと考えてください。
変数への代入であって、等式ではないです。
assignであって、equalではないです。
そしてassignの方向は常に右辺から左辺です。

一方でif文における
if (a == b)の==は等式の評価をしています。

あと、インスタンスの場合は、実体が入るというよりは、参照(アドレス)が入ります。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる