Java入門・初心者質問スレ Part.11

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウウー Sa07-jGB0)
垢版 |
2021/06/29(火) 11:42:34.74ID:iGYT4fi4a
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

Java初心者のためのスレッドです。

※前スレ
Java入門・初心者質問スレ Part.10
https://mevius.5ch.net/test/read.cgi/tech/1585721355/
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
2021/12/30(木) 20:31:35.60ID:6VQf5wdm0
>>492
なんで、あんなに発火してるのかとおもってたけど、なるほどな。
2021/12/30(木) 20:36:28.43ID:XB+ZZJZYr
2021/12/30(木) 21:45:27.15ID:u/iq0Utz0
>>493
ありがとうございます
再利用性という言葉の意味が理解出来てませんでした

データ隠蔽は、フィールドをprivateアクセスにして外部から隠すこと
カプセル化は、ゲッター・セッターを通してフィールドにアクセスする仕組み
だと理解しております
2021/12/31(金) 00:15:46.51ID:TgisNlKh0
カプセル化と情報隠蔽は人や書籍によって、認識が結構ちがうからなぁ……

私の場合、カプセル化はデータと操作をひとまとめにする事という認識。情報隠蔽を含まない。
setter/getterを通じて情報を設定したり取り出したりするものカプセル化といえるけど、他のメソッドもカプセル化といえる。

ググってみつけた解説。
http://msugai.fc2web.com/java/capsulate.html

この手の解説は近年のQiitaなどよりも、2000年前半とかのブログの方が分かりやすい気がする。
2021/12/31(金) 00:30:47.02ID:TgisNlKh0
もっともWikipediaやMDNなどの解説をみると、カプセル化は情報隠蔽も含んでいるので、話している相手や文脈によるのかなとも思う。
https://ja.m.wikipedia.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96
2022/01/02(日) 02:00:40.90ID:dVy28Elm0
動けばよくね?
何でそんなややこしい関数使おうとするの?
2022/01/02(日) 02:07:24.14ID:wwqM77Jg0
ややこしいと思うのはお前のレベルが低すぎるから
503デフォルトの名無しさん (ワッチョイ 42ad-hDuN)
垢版 |
2022/01/02(日) 13:25:52.77ID:o9R7ffl70
動いていても改造困難になるのではないか?
カプセル化しないとか隠蔽しないということは他との依存度が高い事になるから
全部グローバル変数の昔の BASIC みたいになりかねない
2022/01/02(日) 14:22:03.41ID:BRyyjnE80
隠蔽しない場合、メンテの際に他で呼んでいないかを全ソースにgrepをかけなくて済むくらい?
2022/01/02(日) 14:39:52.91ID:o9R7ffl70
grepぐらいで済むならまだ良い方なのではないかな
a や b 等の短い変数名や同名のローカル変数が沢山使われている場合はそれでは済まないよな
506デフォルトの名無しさん (ワッチョイ dd5f-45BR)
垢版 |
2022/01/02(日) 20:08:46.48ID:dVy28Elm0
動きゃいいんだよバアカ
教科書に載ってること全部覚えても実戦じゃ使わねえよ
ifとforだけ覚えればok
それで動くからjavaなんだろうが
単純化しなければ他人が見てもわからないし自分が後から見てもわからなくなる
頭でっかちもたいがいにしろや
教授にでもなりてえのか?
バアカ
2022/01/02(日) 21:01:26.76ID:wwqM77Jg0
業務経験2、3年ぐらいはありそうな奴でも>>506レベルの池沼がマジで結構いるのがITの凄いところなんだよな
人件費削減で作業メンバーがこのレベルの池沼で半分ぐらい固められたプロジェクトのソースは完全にゴミのエッフェル塔
どんなに綺麗で保守性の高いソースを書いても改修で池沼が手を入れると全てを壊していくからな
ゴミの状態で膨大なテストを通されるとそれら全てを担保する必要があるから容易にリファクタもできなくなる
ゼロから作っても冗長の塊でゴミだし改修させてもゴミだがこの問題は日本特有の忖度であまり騒がれていない
まぁプロジェクト統括する奴も8割悪いんだが
2022/01/02(日) 22:00:37.97ID:H46I7Mvor
大丈夫か?コイツ(506)
動きゃいいって、発想の奴は、早いところ現場から排除するに限る。あるいは穴ほって埋めさせる仕事を延々とやらせるか。
509デフォルトの名無しさん (ワッチョイ 9901-45BR)
垢版 |
2022/01/02(日) 23:27:58.21ID:TQn3/Mee0
動かないほうが良いのか。
2022/01/02(日) 23:29:16.10ID:MAjtqyObr
>>509
2022/01/02(日) 23:44:47.66ID:ddLIrUr40
>>508
首にするわけにはいかない場合
その手の人間が人事に行って
才能のない奴を採用することになる
512デフォルトの名無しさん (ワッチョイ 9901-45BR)
垢版 |
2022/01/03(月) 00:07:48.55ID:3eYYTX8d0
毎日がエブリデー。
2022/01/03(月) 01:16:45.75ID:uj1YSIyDr
マイナス方向に動かれるぐらいなら、動かない方がまだ良い。
514デフォルトの名無しさん (ワッチョイ dd5f-45BR)
垢版 |
2022/01/03(月) 01:53:23.74ID:nkIfxwBw0
バカ多すぎて笑いが止まらん
ハライテエ

どうせ高い教材買わされたから難しいコード書くのが芸術とでも思ってるのか

できるだけシンプルにバカが見てもわかるように単純明快にしなきゃ
意味ねえんだよ!!!!!!!!!!!

これ以上わしを笑わせんといてくれや
わしはifとforだけであらゆるプログラマが組めるんや
もう一度言う
動きゃいいんだよ!!!!!!!!!!!!
2022/01/03(月) 02:40:31.92ID:WZCG/4QI0
かまってもらえてよかったな低能
2022/01/03(月) 02:40:43.89ID:NkK7sfLH0
違う違う。動くのは最低ラインだ。
517デフォルトの名無しさん (ワッチョイ 9901-45BR)
垢版 |
2022/01/03(月) 02:45:50.92ID:3eYYTX8d0
動いてから言え。
2022/01/03(月) 04:35:04.78ID:BomwIDeU0
なんか必死なやつだな。
2022/01/03(月) 09:37:44.26ID:TyT4wr4K0
わしがバカだから単純明快じゃないと受け付けない
って事はわかった
520デフォルトの名無しさん (ワッチョイ dd5f-45BR)
垢版 |
2022/01/03(月) 10:45:30.41ID:nkIfxwBw0
バカな君たちにもわかりやすい例えしてあげるよ

例えるなら純文学とラノベ
難しい言葉書き並べる純文学は全然売れない
簡単で言葉でわかりやすいラノベはよく売れる

プログラミング市場もラノベ
マニアックな個人ならいくらでも純文学プログラムに挑戦したまえ

ようするに君たちは参考書脳なんだよ
参考書作ってるのは頭のいい研究者で現場プログラマーじゃない

将来君たちは研究者になりたいわけじゃないだろう
だから実戦向きのコード書ける練習したほうがいい
そのためにはifとforだけを極めたまえ
もう一度言う
動きゃいいんだよ!!!!!!!!!!!!
2022/01/03(月) 10:51:25.14ID:TyT4wr4K0
よめりゃいいんだよ
といいつつすべてひらがな
2022/01/03(月) 10:59:30.08ID:WZCG/4QI0
低能は小学生向けのプログラミングで我慢しとけ
2022/01/03(月) 12:12:06.88ID:xLtaKBkK0
なんか色々と、文章力にも現れているなw 小さすぎる宇宙
2022/01/03(月) 13:39:36.97ID:6Q3DLr4Ur
NGにつっこんでおこ。
525デフォルトの名無しさん (ワッチョイ 42ad-iZeD)
垢版 |
2022/01/03(月) 15:34:29.34ID:NkK7sfLH0
if や for だけでなく class やメソッド書かないと動く Java プログラムは作れないよなあ・・・
526デフォルトの名無しさん (ワッチョイ dd5f-45BR)
垢版 |
2022/01/03(月) 22:42:53.46ID:nkIfxwBw0
低能とののしるバカがいるようだが、それは最高の誉め言葉だ。
なぜなら現場では低能でも理解できるコードが求められてるからだ。

君たちはJavoの受験勉強でもしているのかね?
難解な数学の公式を解くようにJovaを覚えても何も意味がないことに、いいかげんに気づきたまえ。

プログラマーに必要なのは知識ではない。発想力だ。
発想力があればifとforだけであらゆるプログレミングができるのだ。
小説や作曲のような芸術的発想力がなければ、もうやめたまえ。
教科書をいくら丸暗記しても、それでは新たなプログラムは組めん。

最後にもう一度言う。
動きゃいいんだよ!!!!!!!!!!!!
527デフォルトの名無しさん (ワッチョイ 42ad-hDuN)
垢版 |
2022/01/04(火) 00:34:59.95ID:A3JfSOSv0
Javo、Jova、か・・・
2022/01/04(火) 06:13:40.46ID:3M67Qq0N0
>>526
そうだと思うよ。
それに少し便利な記述を徐々に加えれば効率も上がる。
時代の流れに乗れず、Cを長年使ってきたが、WindowsアプリでC ++のMFCで仕事して、ラズパイでpythonを簡単な記述のみでやって、それでもGUIなんでpyQtで組む、またWindowsの仕事でドットNetのC#で組んだり、今はスマホアプリを請け負ってAndroid studioでjavaだよ。ラムダ式はあきらめたが、アプリは作れて納品出来る。
2022/01/04(火) 06:28:35.58ID:nMzjo4pu0
きしょくわりぃからとっとと消えろ低能
2022/01/04(火) 23:44:16.68ID:l7pw94h+0
>>528
Java書いてて匿名クラス使わないの?
ラムダ式と似たようなものだと思うけど
2022/01/05(水) 00:08:59.24ID:OmbyYbnUr
lambda使わないって事は、Stream APIも使わないのかな。それとも、FunctionとかPredicateの匿名クラス書いてStream API使っているとか?

for/ifの人はStream APIなんて使わないんだろうけど。
2022/01/05(水) 04:07:29.70ID:GtudYxVe0
androidのリスナーグラス登録などの定型には使うが積極的に使う事はない。使えないと言うことだよ。
2022/01/05(水) 05:07:34.15ID:W/9qWRY60
Javaのラムダ式は対応する匿名クラスへのシンタックスシュガーだよね
2022/01/05(水) 06:01:02.31ID:e56dk/ttr
>>533
いや、実際には無名クラスは作らず、invokedynamicによる呼び出しで処理できるように色々するみたいだな。
2022/01/07(金) 14:06:26.94ID:9fSjL2+K0
Java勉強しはじめるとどこの学習サイトや本でも大体変数周りのレクチャーに際して

int age =20;とした場合
「System.out.println ("私の年齢は" +age+ "歳です");」
「なお、intは上書き出来、後述でage = 23;と書けば同じ変数で違う値を入れる事が出来ます」
みたいに書いてある事が多々ありますが実際にこの運用って使うのでしょうか?

まず最初の疑問が余程大きな桁数でも無い限り(特に年齢や西暦程度なら)数字を直入力した方が作業短縮されるのではと感じるのと
変数上書きに関してもあえて事故る可能性のある上書きより別の変数を用意すればいいだけではと思うのですが
これら二つを最序盤で必ず入れるのは後期で何か意味を持つ使い方になるのでしょうか?それとも不要だとしても一応の機能紹介と運用例を出しているだけ?
2022/01/07(金) 14:52:23.56ID:ZFG0FBZS0
>>535
そもそも「私の年齢はage歳です」と表示するなんていうプログラム自体が
機能紹介のためのものなのでねぇ

自分でプログラムを作るときは
・数字を直入力した方がよいか? Yes→直入力できるようにする No→しない
・ageに初期値が必要か? Yes→設定する No→設定しない
・ageの値を保持したいか? Yes→別の変数を用意する No→上書きする
なんてことを、自分で考えたり、周りはどうしているかを見たりして、判断することになる
↑これが、サイトや本に書かれていない、一番重要なプログラミングのポイントなのだが

そしてその判断のためには、言語の機能を知らないとならないわけでさ
2022/01/07(金) 17:47:08.32ID:+rjvm48j0
同じ値を同じ意味で複数個所で使っていて後で修正が必要になった場合は直入力だと全てに修正が必要になって面倒。
尚且つその数が表す意味がわからなくなる可能性がある。(変数名がその数の意味と無関係に付けられていたら同様にわからなくなるが)。

変数の使い回しはプログラムが長くなって来ると混乱してバグの素になると思うので出来ればやらない方が良いとは思う。
特に違う意味の値で使われるような場合は危なっかしい感じがする。また値を変えないで定数として使うのであれば java
ならば final を付けて宣言して変えられないようにしておいた方が良い。その方がコンパイル時に最適化される可能性も高まる。
2022/01/08(土) 12:18:43.14ID:BbhWscnT0
>>536>>537
なるほどありがとう
後の方でまさかの有効活用方が出てくるための序盤仕込みとかではなく、あくまで勉強本として1から10まで説明しなければいけない的な拡張機能の解説で合ってたのね
もしかしたら修正する可能性がある項目を変数化しておくというのも実用的だし、変数上書きは余りしない方が良いという部分のアドバイスも聞けてよかった
2022/01/08(土) 15:42:28.48ID:s2b06pjxM
合ってねーよw
540デフォルトの名無しさん (ワッチョイ df01-3DH6)
垢版 |
2022/01/09(日) 16:01:07.59ID:fk2x27WR0
Androidアプリ関係の質問てここであってますか?
541デフォルトの名無しさん (ワッチョイ df01-3DH6)
垢版 |
2022/01/09(日) 16:03:23.24ID:fk2x27WR0
すいません開発質問スレ見つけました
2022/01/28(金) 17:19:42.17ID:ueGBMAtL0
浅いコピー深いコピーって概念がよくわからないんですけど
深いコピーをしたいオプジェクトやリストがあればその中身や型に合わせて
それぞれ専用のメソッドをその都度自分で書かないといけないってことですか?
2022/01/28(金) 19:09:56.53ID:L6caMnrmH
>>542
lisp 用語だから lisp をやればわかる…
2022/01/28(金) 21:32:44.86ID:bcAzYVuU0
>>542

https://medium-company.com/ディープコピーとシャローコピーの違い/amp/

簡単に言えば浅いコピーは参照?が指している場所が同じ状態でのコピー
obj1 = obj2 のような状態
深いコピーはご自分で言っているように別のオブジェクトとして生成してフィールドをコピーしている状態
2022/01/28(金) 22:44:02.36ID:Avl2EljRM
>>542
だいたい合ってるけど専用のメソッドが必要になるのは浅くても深くても同じだよ
ただ浅い場合は1段でいいから楽なだけ
深い場合は型と型の組み合わせになるから組み合わせの数が無数で書く量が増える
2022/01/28(金) 23:07:08.14ID:VTFqAYi/0
windowsでいうと
浅いコピーは「ショートカットの作成」
深いコピーはフォルダーのバックアップ
2022/01/29(土) 00:37:34.81ID:31J+rcQrH
>>546
不合格
2022/01/29(土) 01:04:37.76ID:8+GQA2NX0
>>546
フォルダーの中にショートカットが入ってたら?
2022/01/29(土) 08:48:50.39ID:7ZcbKf0S0
>>542です
返答ありがとうございます
とても参考になりました
2022/02/06(日) 23:13:39.10ID:0YSKiQEf0
昔Javaを触ってたけど、しばらく離れてた(テンプレートやアノテーションが出る直前)
最新のJavaを学びなおそうと思っているんだけど、おすすめのサイトor書籍を教えてください
ただし、オライリーは嫌いなのでパス
2022/02/06(日) 23:46:22.33ID:2R1v+vma0
>>550
https://gihyo.jp/book/2017/978-4-7741-8909-3
ちょっと古いけどJava8には追いつける
いやかなりかな

Java11以降は他の方に・・・
2022/02/06(日) 23:55:34.82ID:Yp2ViaMv0
独習Javaはどうすか?
553デフォルトの名無しさん (ワッチョイ 9fad-zD41)
垢版 |
2022/02/07(月) 02:30:14.57ID:b6RunKLB0
Kotlin もよろしく
2022/02/07(月) 06:59:39.42ID:VlGFXZxF0
>>552
旧版なら糞本、新版でてますか?
2022/02/07(月) 23:41:32.94ID:b3L+kEpa0
>>551
サンクス
でもどうせなら最新を

>>552
独習Javaは昔見たことあるけど、あまり印象に残ってない
2022/02/07(月) 23:56:42.08ID:TWNt6zjr0
>>555
吸盤独習Java なんて忘れたほうがいいですよ、ハーバード・シルトの本にしなさい…
2022/02/08(火) 22:59:01.06ID:PIdUK9FC0
あとは電機大が出してる厚い本とか
2022/02/12(土) 08:24:36.57ID:L9XEDv670
質問です
乱数を得るための方法は主にjava.util.Random()またはMath.random()の2通りあると思うんですが
なぜjava.util.Random()の方はMath.random()と違ってstaticではないのでしょうか?
それとint x = Math.random(n, m); でn以上m以下の整数を得るみたいにしたいんですけど
これを実現するには自分でメソッドを用意する必要がありますか?
2022/02/12(土) 09:00:22.02ID:KQlQ75KL0
>>558
ドキュメント嫁

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Math.html#random--

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Random.html
2022/02/12(土) 10:05:52.17ID:aqVglo+b0
学校の課題かな?
ランダム値生成のアルゴリズムは最初にシードを与えて値を複数回取り出すという内部状態を保持する操作なのでstaticは合わない
またサブクラス化してアルゴリズムを置き換えられるデザインになっている
クラス設計に慣れないうちはstaticが便利に感じるけど、後からMathのアルゴリズムを置き換えたいと思い立ったときにStrictMathのような似て非なるクラスを作るハメになったりする

整数を得るのはメソッド作るのがいいね
掛け算してから端数を切り捨てて最後に最小値を足す
2022/02/12(土) 15:40:29.63ID:63ijDjoD0
>>559-560
返答ありがとうございます!
大変参考になりました
562デフォルトの名無しさん (アウアウアー Sa6e-lJHB)
垢版 |
2022/02/12(土) 19:08:23.72ID:PUK1mMLna
コンピューターはランダムというのが苦手ですからね。
2022/02/12(土) 19:24:12.62ID:8ted8XK+0
確か、Java の乱数は、線形合同法だから偏るだろ

Ruby のRandom は、メルセンヌ・ツイスタ・MT19937、
SecureRandom は、/dev/urandom または、OpenSSL
2022/02/12(土) 19:26:57.53ID:38y+ETg9r
MTも200個くらい連続して同じシードの値を取得できれば次を予測できるとか
565デフォルトの名無しさん (ワッチョイ a701-piVT)
垢版 |
2022/02/12(土) 20:56:52.34ID:kBzBXJs50
C++は選んで組み合わせ。
テンプレートでスタティックに。
2022/02/16(水) 19:32:30.84ID:H+eMlsPeM
javaからjnaでcのdllを呼び出した時のmain()ってjna側に取られてるんでしょうか?
main()からしか正常に扱えないライブラリを使おうとしていて、困っています。
ラッパー噛ませても何でもいいですので、jna呼び出しでc側のmain()をハンドリングする方法があれば教えてください。
2022/02/17(木) 15:33:23.38ID:opMSV7ie0
リンカの仕組みわかってなさそう
568デフォルトの名無しさん (ワッチョイ 12ad-rCQD)
垢版 |
2022/02/18(金) 23:26:24.54ID:EylFm52t0
main()からしか正常に扱えないライブラリ?
どういうライブラリだそれ?
2022/02/19(土) 22:57:01.76ID:Oy5N7IRS0
質問です
JavaSE11Silver黒本の204〜205ページにあるメソッドの可変長引数の解説で
(int... num, int value)のように宣言するとどこまでが第1引数でどこからが第2引数なのか判断できませんが、
(int value, int... num)のように宣言すると第1引数と第2引数以降が区別できます とありますが、
可変長引数が複数ない限り前者のパターンでも第1引数と第2引数は区別できる気がするんですけど
先に位置が確定してる引数を当てはめて残りを可変長引数として処理するみたいな逆算はできないってことでしょうか?
2022/02/20(日) 00:00:49.60ID:XdacCmOfM
できるよね
原文読んでないけどたぶん説明が良くないんだと思う
単にシンプル志向なので可変長引数は最後の引数でしか定義できないという言語仕様なだけだと思う
途中に置けるからといって変なところに置かれてもスゲー読みにくいし保守しにくい
2022/02/20(日) 01:16:34.47ID:URWJGBg90
>>570
返答ありがとうございます
納得できました
2022/02/24(木) 10:32:06.60ID:M77OcTbQ0
intellJでjava Enterprise プロジェクトを作成したんですが、サンプルページのHello ServletのURLクリックすると要求されたリソースが〜の404エラーになります。
javaファイルが読み込めてないっぽいのですがファイルの配置が悪いのでしょうか?
アプリケーションサーバーはtomcatです。
どなたか教えて下さるとありがたいです。
2022/02/24(木) 19:45:53.21ID:Egr6Ec660
そんなマイナーなIDEは誰も使ってないから知らんわあほ
2022/02/26(土) 21:26:52.21ID:lcZINIkB0
スッキリの次はどの本読んだらいいか教えてくれませんか?
2022/02/26(土) 22:38:15.58ID:xS/SyeLk0
スッキリのservlet編か
その次はspringあたりか
2022/02/27(日) 00:39:11.36ID:1rka99/l0
>>575
ECサイトを見てみます
ありがとうございました
2022/03/05(土) 05:07:33.50ID:UJmt72ot0
StreamAPIについて質問です
一つのStreamに対して終端処理が1回しかできないのはどういう理由からなのでしょうか?
共通の中間処理に対して複数の終端処理を行いたい場合一旦Collectionに戻してから
それぞれの終端処理に対して再度.stream()で再変換するのが手間に感じるのですが
2022/03/05(土) 09:29:53.13ID:GtenIzBYM
>>577
minとmaxなんかは両方呼びたいという感覚はわかる
でもfindFirstとreduceは共存できない
findFirstを先に呼ぶと要素が見つかったらストリームが終了してしまうし、reduceを先に呼ぶと一つにまとめられてしまう
Streamの仕組みとユースケース的に妥当
共存させるための一般化した方法は二つ思いつく
一つは終端処理の直前で器に一旦溜め込むやり方
まさにcollectで終端させることと同じ
varとStream.toList()が使えれば多少は書きやすくなる
もう一つは複数の終端処理を引数にとり、すべての処理の気が済むまで委譲するという終端処理を用意すること
調べたらCollectors.teeing()というメソッドがJava12から導入されてた模様
2022/03/05(土) 09:38:57.36ID:suTSuZtU0
>>577
ストリームだからとしか。
Streamの元が、もしかしたらネットワークの向こう側から順次流れてくるデータかもしれないわけで、そうなると一度読み取って処理した値をもう一度使うにはメモリ上に溜めておくとかしないといけない。なので、一度Listにするとかが必要になる。
2022/03/05(土) 09:42:36.47ID:suTSuZtU0
>>577
ちな、minとmaxの両方を一度に欲しいとかなら、summarizingIntとか使えば可能。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Collectors.html#summarizingInt-java.util.function.ToIntFunction-

あるいはreduceとかで自分で集計すれば、一度でも色々できはする。
2022/03/05(土) 10:46:22.36ID:ijTxjZdoM
https://udemy.benesse.co.jp/development/system/java-if-else.html

>>Javaでネスト(入れ子)したif文の使い方

>> if( num1 > 5 ) {
>> System.out.println("5〜15の間");

×:(num1 > 5)
○:(num1 >= 5)

×:udemy
○:usomy

Java以前の問題
2022/03/05(土) 11:08:53.14ID:T37B/JxU0
>>578-580
返答ありがとうございます
とても詳細で解りやすく仕組みまで含めてすんなり理解できました
2022/03/05(土) 12:00:38.16ID:YJGHHadX0
多態性について質問です

https://paiza.io/projects/UevdJ8eMt3M3RHe7IEHBPQ
上のコードで、24行目のa.method();を実行した際に、
なぜサブクラスのメソッドが呼ばれるのか分かりません
確かに参考書にはそう書いてあるのですが、21行目のA a = b;を
実行した瞬間に変数aはサブクラスの情報がそぎ落とされてしまうような気が
するのですが…
2022/03/05(土) 12:55:32.36ID:E5axBTdN0
>>583
スーパークラスだからイメージがわかないのかもしれないけどインタフェースでイメージしたらわかりやすいかな
インタフェースは実装を持たないけど左辺の型としては使えるよね
だとしたら実装はどこになるのかといったら右辺のインスタンスにある
これも同じで左辺はスーパークラスの型だけど実態は右辺のインスタンスだから動くのも右辺のインスタンスの処理
2022/03/05(土) 15:36:27.34ID:YJGHHadX0
>>584
レスありがとうございます
ではサブクラス型の変数をスーパークラス型の変数に代入する時には、
サブクラスとしての情報は残したまま代入されるという解釈でよろしいでしょうか?
2022/03/05(土) 16:09:21.61ID:GtenIzBYM
Aに代入したからといってBがAに化けるわけじゃないよ
BをAとして認識するというニュアンス
例えば車両クラス(A)から派生した戦車クラス(B)のインスタンスをnewで一台生産したとする
戦車(B)であると知っている上官が前進しろと命令したら運転手はキャタピラで進む
ただの車両(A)としてしか認識してない交通整理員が前進しろと命令しても同じようにキャタピラで進む
動作するのはあくまでnewされて実体を得た本人
ただし車両としてしか認識してない人からしたら、砲撃メソッドを実装していることを意識してないので呼び出せない
でも車両クラスのメソッドをどう演じるかは本人の実装次第
2022/03/05(土) 16:10:37.95ID:tv2gNRUqM
おそらく変数に代入っていうイメージが間違ってる
参照型のイメージができてなさそう
2022/03/05(土) 16:57:36.99ID:ucLsxDYZ0
>>587
俺もそう思う
2022/03/05(土) 16:59:54.39ID:ucLsxDYZ0
>>588の続き

参照型はイメージ的にはC言語のポインタみたいなものかな
実際には別物だけど
変数よりは近い
2022/03/05(土) 17:39:28.28ID:YJGHHadX0
>>586-589
ありがとうございます

難しいですね
確かにその辺りの理解はあやふやになっています…

結局、先の例では、スーパークラスA型の変数aがサブクラスB型のインスタンスbを
参照する時、Bでオーバーライドした(元々Aで定義されている)メソッドは、
Bに基づく動作内容で呼ぶことになり、Bで新しく定義した(Aにはない)メソッドは
aからは呼べなくなるってことですよね?
2022/03/05(土) 18:01:27.61ID:E5axBTdN0
>>590
Eclipseとかのエディタのコード補完(.を打った時に呼び出せるメソッドが出てくるやつ)では
A型として識別されるからaからは呼べないように見える。
2022/03/05(土) 18:04:49.47ID:E5axBTdN0
途中で投げてしまったすみません。

だけど、実態としてはあるからリフレクションであれば呼び出せる。
2022/03/05(土) 18:15:28.23ID:ucLsxDYZ0
>>590

> >>586-589
> ありがとうございます
>
> 難しいですね
> 確かにその辺りの理解はあやふやになっています…
>
> 結局、先の例では、スーパークラスA型の変数aがサブクラスB型のインスタンスbを
> 参照する時、Bでオーバーライドした(元々Aで定義されている)メソッドは、
> Bに基づく動作内容で呼ぶことになり、Bで新しく定義した(Aにはない)メソッドは
> aからは呼べなくなるってことですよね?

大体合ってると思う
ただ、> スーパークラスA型の変数aがサブクラスB型のインスタンスbを の部分が違う気がする

あまり詳しくはないけど、まずnewで生成したオブジェクトのアドレスに相当するものがaに入る
そして、そのオブジェクトの動きはnewした方のクラスから見たものになる
だけど、動かすことのできるメソッド等は「親クラスにあるものだけ」になるね

継承した後のクラスは直接動かせない
もちろん、メソッド内で間接的に呼び出すとかなら可能だけど

簡単に言えば、mainメソッドとかのオブジェクトを動かす方からすれば「親の方で考える」ってこと
上のやつだとAの方にあるものだけ使える

デザインパターンのFactoryパターンのように、生成するメソッドで生成するって考えるとわかるかも
2022/03/05(土) 21:14:30.65ID:YJGHHadX0
>>591-593
ありがとうございます

>>593
えーとですね、俺頭が弱いので全部は理解出来なかったです…
2022/03/05(土) 22:07:38.34ID:ucLsxDYZ0
>>594
うーん、別に頭の良し悪しじゃなくて、単にイメージがしづらいだけじゃないかな

概念的なこと聞くより手を動かした方がいいかも
俺もいろんなとこで聞いたけど理解できずに、デザインパターンをやったりいろいろ工夫して手を動かしたらすんなり理解できるようになったし

まずデザインパターンのFactoryパターン辺りをやってみて?

Parent obj = new Child();
という生成をFactoryパターンでやると、
Parent obj = Factory.Create();
のような感じになるはず

そしたらこのobjを動かす方は内部でChildでnewしているかどうかは見えないよね?
単にParent型である保証しかされてない
でも言い換えると「Parentにあるメソッドはと持ってる」だよね?
実際の処理はオブジェクトであるobjが知ってるからobjに紐付いているメソッドを動かす

オーバーライドしてる場合は直近の「自身で再定義した方」
と解釈され、オーバーライドされてない場合は直近の「親の方」と解釈される
だって「自身で再定義した方」はないからね

そしてobjを動かす方からすれば(Childでnewしていようと)Childかなんてわかんない
だからChild独自のメソッドは使えない

もちろん、C#だとasとかでキャストしたりすれば(Childで生成しているなら)Child独自のメソッドも使えるけどね

FactoryMethodパターンはFactoryパターンの拡張版だからFactoryパターンを理解してみて)
2022/03/05(土) 22:11:54.81ID:ucLsxDYZ0
>>595だけど、すまん
C#じゃなくてJavaだったね

asみたいなキャスト をダウンキャストして とかみたいに読み替えてね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況