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
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みたいなキャスト をダウンキャストして とかみたいに読み替えてね
2022/03/07(月) 00:20:26.58ID:UdMygMD90
>>595-596
丁寧にありがとうございます
2022/03/08(火) 10:00:08.97ID:fDKm90VIM
バッファってなんや
2022/03/08(火) 10:22:50.69ID:HM66xeZmM
音楽の父や
2022/03/08(火) 10:49:04.07ID:fDKm90VIM
バッハじゃなくて……
2022/03/08(火) 11:02:44.47ID:44N8vijo0
>>598
文脈次第だとは思うけど「変数や配列のこと」だと思う
Stringとかみたいな
2022/03/08(火) 12:02:51.15ID:HM66xeZmM
イメージ的にダムとかコンデンサとかみたいな何かを貯めておくものを指すよ
ダムに水を貯めておけば日照りが続いても安定して水が飲めるし、川上が増水しても川下の村が水浸しにならない
しょぼい乾電池でも電流をコンデンサに貯めれば強烈なフラッシュを炊ける
プログラミングの場合も同じ
典型的には、ネットワークから受信したりプログラムで動的に生成したデータをファイルに書き込みたいときとか、互いの読み書き速度が違う2つのデータの流れがあるとき、互いの性能差を埋めつつ資源を有効活用する(読み書き回数を減らしたり専有時間を最小化する等)ときとかに使う
2022/03/08(火) 17:48:34.50ID:mkTZ49v/0
例えばファイルを読み込むときにFileStreamのバッファサイズが1Mだと
ディスクから1M読み込んで処理してまた1M読み込むから効率が悪くなる。
バッファサイズを100Mにすればディスクから100Mまとめて一気に読み込むから効率が良い。
でも、その分メモリを消費するから性能とメモリのトレードオフ。
604デフォルトの名無しさん (アークセー Sx4f-kpC5)
垢版 |
2022/03/09(水) 12:05:39.48ID:BxY0cuLtx
java初心者です。初案件でjavaのマイグレーションとのことで入ることになりました。
現状これ以上の情報がまだはいっていません。
Javasilverは独学にて取得済みです。
これって経験としてどうなんでしょうか。どなたか教えて頂きたいです。
よろしくお願いします。
2022/03/09(水) 13:17:42.06ID:YihDzyuxM
>>604
そもそもマイグレーションって何だかわかってますか?
606デフォルトの名無しさん (アークセー Sx4f-kpC5)
垢版 |
2022/03/09(水) 17:03:56.48ID:BxY0cuLtx
>>605
ありがとうございます。
いえ、あんまりわかってないです。ネットで調べた程度で
活用中のシステムを別の環境やバージョンへ「移行すること」
だそうで、リプレイスとは違うとかなんとか。
現行のシステムから移行計画をたてて、テストして、本番環境
に切り替える程度の認識です。
これって上流工程なのかテストもあるし、そんなにスキル
がつくのかもわからないです。
一応まだ断ることもできるんですが、
何かしらアドバイスいただけたらありがたいです。
2022/03/09(水) 21:18:10.88ID:y0Y93q++M
Javaのバージョン上げるだけとかならそれなりに出来ることありそうだけど
それ以外ならテスター要員だろうな
2022/03/10(木) 08:01:42.64ID:Uh43IBqs0
到達不能コードのコンパイルエラーについて質問です
JavaSE11Silver黒本の3章18問に下記のコードの結果を答える問題があり、答えは「Cが表示される」なのですが
このときnum = 10ならば必ずCが表示され、Dは絶対に表示されないため
到達不能コードでコンパイルエラーが発生する気がするのですが
ifの判定文まで到達可能ならば例えばif(false)であってもその中身は到達不能コードには当たらないのでしょうか?
int num = 10;
if (num == 100)
System.out.println("A");
else if (10 < num)
System.out.println("B");
else
if (num == 10)
System.out.println("C");
else
if (num == 10)
System.out.println("D");
609デフォルトの名無しさん (ワッチョイ 9fd1-OYGG)
垢版 |
2022/03/10(木) 08:13:43.65ID:bRBcjGmR0
あくまで補助機能だからね
判断はご自分でとうぞ
2022/03/10(木) 08:25:16.02ID:9QpyAq00M
そういう仕様のはず
テスト的に処理の冒頭で例外を起こしたいとき if (true) throw Exception(); みたいに書ける
2022/03/10(木) 09:12:34.07ID:Uh43IBqs0
>>609-610
返答ありがとうございます
自分でコードを書けばエラーが発生するかどうかは明らかですが
試験でunreachable codeが発生するかどうか問われた時は内容次第なので
状況毎に暗記する必要があるということですか?
612デフォルトの名無しさん (ワッチョイ 9fd1-OYGG)
垢版 |
2022/03/10(木) 09:18:54.74ID:bRBcjGmR0
解らない問題に答える必要あるの?
経験者むけサービスかもよ?
2022/03/10(木) 10:15:57.73ID:Sbdp6iYa0
素直に言語仕様読め

ttps://docs.oracle.com/javase/specs/index.html
ttps://docs.oracle.com/javase/specs/jls/se17/html/jls-14.html#jls-14.22
> 14.22. Unreachable Statements
>
> It is a compile-time error if a statement cannot be executed because it is unreachable.
>
> This section is devoted to a precise explanation of the word "reachable."
> The idea is that there must be some possible execution path
> from the beginning of the constructor, method, instance initializer, or static initializer
> that contains the statement to the statement itself.
> The analysis takes into account the structure of statements.
> Except for the special treatment of while, do, and for statements
> whose condition expression has the constant value true,
> the values of expressions are not taken into account in the flow analysis.
2022/03/10(木) 10:31:00.79ID:Uh43IBqs0
>>612-613
ありがとうございますとても参考になりました
規則をよく読んで理解を深めたいと思います
615デフォルトの名無しさん (アークセー Sx4f-kpC5)
垢版 |
2022/03/10(木) 10:43:42.56ID:gMDgr+Ggx
>>607
ありがとうございます。なるほど、
テスター要因ですか。
今のところ言語をJavaへ変更するとのことで
バージョン上げるではなさそうです。
2022/03/10(木) 14:00:24.98ID:Pbl5vAiZM
>>611
そんな細かいところまで覚えなくても試験受かるよ
2022/03/11(金) 20:56:48.66ID:dOzyUYLo0
>>607

>>606はテスターも務まらないだろう。
奴は自分が楽をするために結果を捏造するでしょう。
2022/03/12(土) 17:05:26.26ID:d2Iz9kMm0
質問です
https://paiza.io/projects/b4a4wtvE8DNSwj1jy0ciTg
上のコードの7行目の出力結果がab, aになる理由が分かりません
str2はstr1と同じものを参照しているので、str1の参照先が変われば
str2の参照先も変わると思うのですが
2022/03/12(土) 17:23:02.54ID:UYsDHEDe0
こういうC/C++のポインタ、文字列定数、newとかの理解なしにJavaだけやろうとすると間接参照の構造が理解できなくて分からんくなるよね
JavaのStringクラスはイミュータブルといって内容を途中で変更しないポリシーになっている
正しいかは知らんけど下記のような意味になる
String str1=new String("a");
String str2 = str1;
str1=new String(str1 + "b");
文字列結合演算子は新しいStringクラスを生成する
str1とstr2は結果として異なるものを指しているのでab,aとなる
2022/03/12(土) 17:57:26.72ID:GGUhV+6j0
str2
str2 = str1 の時点で新たな領域を確保してるんじゃないかな
str2 = str1 の直後にデバッガで str1 の値を変更しても st2 の値が変わらない
文字列の足し算をしたときに str1 が別の領域を指すようになるというのはその通りだけども
2022/03/12(土) 18:20:39.50ID:GGUhV+6j0
間違いでした。str1 に文字を足した時点で str1 が別の領域を指すようになるが正しいですね。失礼しました。
2022/03/12(土) 19:13:53.68ID:Pwg7r5DPM
> 同じものを参照しているので、str1の参照先が変わればstr2の参照先も変わる

これが誤解
参照先が一緒に変わることはない
もしそんなことが起こる言語仕様なら、一時的に同じものを参照させていたけど、後からまた別々のものを参照させたい、という操作ができなくなってしまう
2022/03/12(土) 21:48:07.71ID:d2Iz9kMm0
>>619-622
回答ありがとうございます

>>618のコードの4行目ではstr1とstr2は同じアドレスを参照していて、
6行目でstr1の参照先だけが変わり、str2は変わらず同じアドレスを指している
という理解でいいですかね?

https://paiza.io/projects/5peEJB86LZ16u2cgEFvEgA
int型変数の場合も同じような挙動になるようですね
2022/03/13(日) 12:26:10.29ID:1xjzmzRe0
>>623
プリミティブ型は値そのものを持っているから
そのレベルなら基礎の本を最初に読んだ方がいいと思う
2022/03/13(日) 18:43:53.11ID:sEX+LZN60
>>624
ありがとうございました
2022/03/14(月) 22:21:25.59ID:0OByol6E0
スレチだったら申し訳ないのですが、imgui-javaをM1 macで使うことって可能でしょうか?
githubのissueに「I won't support it macOS arm64」とあるので既にダメそうではあるのですが…

issueで報告されているエラーではなくCan't load library: libimgui-java64.dylibというエラーが出たのみだったのでどうにか解決できないかなと感じてます
2022/03/15(火) 08:26:03.34ID:7JI7znBe0
↑ですが解決しました
お騒がせいたしました
628デフォルトの名無しさん (ワッチョイ 095f-vveo)
垢版 |
2022/03/15(火) 17:44:34.36ID:xLirFsOB0
try{
 処理
} catch(ArrayIndexOutOfBoundsException e){
 処理
} catch (IOException e) {
 処理
} finally{
 処理
}
上記のプログラムで
ArrayIndexOutOfBoundsExce
IOException
を問わずexceptionが発生したら実行したい処理があります
何か良い方法はありませんでしょうか
catchは処理の都合でわざと分けています
2022/03/15(火) 18:25:38.65ID:Cmsuiz4vM
共通処理をprivateメソッドに切り出して双方から呼ぶ
2022/03/15(火) 20:51:31.95ID:2TepCKpy0
>>628
3個目のcatchにException eとすれば?
2022/03/15(火) 21:13:33.30ID:w32P7zDl0
>>628,624
ああ、そういうことね
IOExceptionとかの親(継承や実装する前のやつ)で受け取ればいいはず
632デフォルトの名無しさん (ワッチョイ 095f-vveo)
垢版 |
2022/03/15(火) 22:12:25.19ID:xLirFsOB0
>>630
exceptionは共通して処理したいんですよ
種類に関わらず
ioとか決まったのは一部処理を追加したいのです
2022/03/15(火) 22:28:50.19ID:7LI6bjmj0
>>628
>>629の方も書いてますが、例外処理用にメソッドを用意しておいて
双方のcatchブロック内で呼び出すのが良いのでは?
2022/03/16(水) 00:10:57.72ID:94N7KM3GM
finallyで例外発生判定して処理をいれるかな
2022/03/16(水) 09:42:24.80ID:sDB+P2C+0
>>634
やっぱそうだよなぁ
俺でもそうするかも
フラグを保持してIOExceptionのときにtrue,デフォではfalse

finallyでフラグが立っているときだけ独自の処理
かなぁ
2022/03/16(水) 10:14:39.11ID:Cxe0x8xaM
まぢか
637デフォルトの名無しさん (ワッチョイ 7979-8qwV)
垢版 |
2022/03/16(水) 10:29:07.64ID:DqmOUHXz0
} catch(ArrayIndexOutOfBoundsExce | IOException e){
 if(e instanceof ArrayIndexOutOfBoundsExce){
 
 } else if(e instanceof IOException){
 
 }
 /*
 共通の処理
 */
}
2022/03/16(水) 10:57:20.37ID:vuvQrc+kM
いやこんな問題にフラグはやめようよ…
脱初心者しようぜ
if文なしで表現できるコードにif文を使わないのは可読性維持のセオリー
関数の各種メトリクスが改善する

finallyの中に置くのもやめよう
それが本質的にfinallyに書くべき処理でない場合は書かないでくれ
その例外処理の中でさらに例外が出たときに、本来必ず実行されるはずだったfinallyのリソース解放などが実行されなくなってしまう
2022/03/16(水) 11:02:02.05ID:vuvQrc+kM
変数の数を減らす、if文を減らす、どっちも改善の定石なんよ
フラグは手っ取り早く動くコードを書くのに便利だけどgotoのようにスパゲッティを招く諸刃の剣
2022/03/16(水) 14:15:12.53ID:sDB+P2C+0
>>637,639

え、catchするときって、複数の例外ってできたんだ…
(本当に知らなかった)

それができるのならそっちを選ぶかな
639が言うようにできるだけ変数を減らしたりするのがベターだろうけど、catch( MyEx | TestEx e ) 的なものができること自体知らなかったからC#みたいに別の例外でラップして再送するか、finallyで分岐させるかしか思いつかなかったわ…

複数例外をcatchできると知っていたらそっちの方を書いていたかも
2022/03/16(水) 14:16:57.11ID:sDB+P2C+0
640の追記でJava SE 7以降で追加されたやつっぽいね

https://docs.oracle.com/javase/jp/7/technotes/guides/language/catch-multiple.html
2022/03/16(水) 16:03:46.18ID:FemHJp4N0
>>640
一種の多態性だね
2022/03/16(水) 16:29:45.19ID:SGyptLP1M
catchは処理の都合でわざと分けてるって言うからマルチキャッチは知ってて使えないケースのお題かと思ったわ
privateメソッドに切り出すのは何が嫌なんだろ
複雑化する感覚があるのかな
2022/03/16(水) 17:09:10.32ID:3w6VtJRl0
>>640
C#も似たようなことできるよ
2022/03/16(水) 17:35:36.75ID:V6fjUOMTM
サンプルだからなのかもしれないが
IOExceptionとIndexOutOfBoundsの2つだけを一つのcatchにまとめるのは種類が違いすぎてかなり違和感がある
2022/03/16(水) 17:45:45.22ID:prpzjaFx0
JavaSE11から存在する単一のソースファイルならばコンパイルを介さずに
>java Main.javaで直接起動できる機能についてお聞きします
下記のページの解説だとソースファイルと同名のクラスファイルが既に存在している場合には
エラーが出るとあるのですが、自分で試してみたところMain.classが既に存在する場合でも
>java Main.javaで直接起動してもエラーが出ずに正常に終了します
自分の解釈が悪いのか仕様が変更になったのか教えて欲しいです
https://openjdk.java.net/jeps/330
2022/03/16(水) 18:11:27.06ID:sDB+P2C+0
>>644
みたいだね
648デフォルトの名無しさん (ワッチョイ 8dba-8k9/)
垢版 |
2022/03/17(木) 17:52:11.09ID:efbJz0WM0
ttps://pastebin.com/auZDmFp7

矢印キー(上か下)を押下した際に、道路の幅がズレる(滑らかなでない)状況です。
y座標の計算に問題があると思うのですが、どのように修正したらいいのでしょうか?
drawPolygon()は整数をとるのでdoubleが使えない状態です。
2022/03/18(金) 22:04:29.65ID:q2/HZ4bm0
↑もう見られない
650デフォルトの名無しさん (ワッチョイ 51ba-Ww1w)
垢版 |
2022/03/19(土) 11:34:53.69ID:BPQikdeF0
>>649
再度アップロードしてみました。
ttps://pastebin.com/28pAYitY
2022/03/19(土) 15:33:58.19ID:4fsbAAf/0
Threadクラスについて質問です
volatile修飾子とsynchronized修飾子の使い分けがよく分かりません
どなたか教えて頂けませんか?
2022/03/19(土) 17:01:31.57ID:HATaEOMdr
volatileは排他制御されない。スレッド間でのメモリの同期はとられる。

synchronizedは排他制御される。
2022/03/19(土) 17:04:40.42ID:aNaAXnkzr
このあたりがわかりやすいかも。
https://blog.j5ik2o.me/entry/20110220/1298215999
2022/03/19(土) 17:07:03.79ID:a55IiZ5SM
synchronizedだけ使えばいいよ
性能改善の必要に迫られたときだけ、元からアトミックな処理という前提下でvolatileに置き換えできるケースがあるけど、まずそんなシーンはない
予めオブジェクトを生成しておいてconcurrentパッケージのクラスを使うほうがいい
2022/03/19(土) 19:20:18.43ID:4fsbAAf/0
>>652-654
分かりました
ありがとうございました
2022/03/19(土) 23:27:17.51ID:1WLrxt8x0
>>650
ざっと見た感じだけど
ybl = y + h +(int) ((i+1)<gradients.length ? gradients[i+1] * gradient : 0);
ybr = y + h +(int) ((i+1)<gradients.length ? gradients[i+1] * gradient : 0);

あと↓みたいにすればxtlとかdouble使えると思う
g.drawPolygon(new int[] { (int)xtl, (int)xtr, (int)xbl, (int)xbr }, new int[] { (int)ytl, (int)ytr, (int)ybl, (int)ybr }, 4);
657デフォルトの名無しさん (ワッチョイ 51ba-Ww1w)
垢版 |
2022/03/20(日) 19:08:03.40ID:TKFJ8s2x0
>>656
ありがとうございます。
教えていただいた方法で実装してみます。
2022/03/24(木) 18:41:59.43ID:YQF9OG/30
質問です
JavaSE11黒本の12章47問で複数の数式から一つを選択する問題がありますが
そのうち正解となる選択肢Aと選択肢Cが常に同じ結果を示すように見えて違いが解らないです
選択肢A : a = b * (c * Math.pow(1 + c, n) / (Math.pow(1 + c, n) -1));
選択肢C : a = b * c * (Math.pow(1 + c, n) / (Math.pow(1 + c, n) -1));
Javaでは浮動小数点が絡んだ場合に誤差が生じる可能性があるため
乗算は非可換であり明確に区別されるという規則があるのでしょうか?
2022/03/24(木) 20:30:16.55ID:4pzw63OrM
誤植か筆者がバカなんじゃね?
計算順によって結果が変わることはありうるけど、別にどちらが正解でどちらが間違っているということはない
2022/03/24(木) 20:33:39.29ID:4pzw63OrM
ああ、値のオーダー次第では適切な順序で掛け合わさないと指数がオーバーフローするケースはあるかもな
>>658の情報だけじゃ分からんが
2022/03/24(木) 21:32:26.39ID:YQF9OG/30
>>660
確かに値の範囲がある以上計算順も厳密に考慮しなければならないですね
ありがとうございます納得できました
662デフォルトの名無しさん (ワッチョイ b15f-v+TM)
垢版 |
2022/03/24(木) 21:53:31.07ID:oxaoDT0s0
>>659 は数学のルールでものを語っているが、プログラミング言語の世界では、計算順序は決まっているので、複数の答えがあるはずがない。
663デフォルトの名無しさん (ワッチョイ b15f-v+TM)
垢版 |
2022/03/24(木) 22:00:44.34ID:oxaoDT0s0
>>661
データ型を問う問題だと思われる。
2022/03/24(木) 23:15:56.79ID:BUawFPKH0
お聞きしたいことがあります

らくらく突破Javaの本文中で、インスタンス変数(のスコープ)はその変数が属する
クラス内にある「全ての」メソッド内で有効、という記述があったのですが、
これは正確ではないですよね?
クラスメソッド(staticメソッド)内で利用するとコンパイルエラーになる、
とスッキリJavaに書かれていたような気がするのですが
665デフォルトの名無しさん (ワッチョイ b15f-v+TM)
垢版 |
2022/03/25(金) 00:16:37.09ID:F8nkIqx90
>>664
問題文が言葉足らずで解釈が割れるのは普通だから。
2022/03/25(金) 00:41:50.60ID:XVe+E9v/0
英国では、富士通の郵便局のシステムで、
700人以上の郵便局長が有罪になっている

計算が合わないから、盗んだだろって

イギリス史上最大の冤罪事件

計算順序・誤算などは危険
2022/03/25(金) 00:56:54.43ID:XVe+E9v/0
インスタンス変数は、各インスタンスで固有のもの

一方、クラスメソッドは、そのクラスで使われるもので、
すべてのインスタンスで共有されるのかな?

または、そもそもインスタンスを作らなくても呼び出せるものかも?
単なるモジュール関数で、インスタンスとは結びつかないものかな?

どちらかは知らないけど
668デフォルトの名無しさん (ワッチョイ b15f-v+TM)
垢版 |
2022/03/25(金) 01:00:47.17ID:F8nkIqx90
>>667
同じロジックのコピーを作るわけがない。少しはコンピューターの仕組みを理解してくれ。
2022/03/25(金) 12:08:45.30ID:2VDK7PA50
>>667
俺の理解では、メソッドはC言語でいう関数ポインタ的なやつでオブジェクトに紐づいている感じ
staticなメソッドはなんだろうな…C#とかでいう名前空間に包まれたメソッドかな?
2022/03/25(金) 12:29:06.82ID:H1veNHpAM
単純にクラスに紐付いているという理解でいいよ
インスタンスが0個だろうと関係ない
2022/03/25(金) 18:05:18.51ID:2VDK7PA50
>>670
staticな方? だよな…
2022/03/25(金) 18:33:22.79ID:tb8uqVBLM
>>671
違う。インスタンスメソッドもクラスに紐付いている。
同じクラスから生成されたインスタンスなら同じメソッドを持っているのだから、各オブジェクトにポインタを持たせる必要はない。
オブジェクトの型を調べてその型の関数テーブルを見に行けばよい。
2022/03/25(金) 19:15:32.56ID:2VDK7PA50
>>672
あー、そうかそっちかぁ
2022/03/25(金) 22:56:42.76ID:QepENKM50
>>672
>同じクラスから生成されたインスタンスなら同じメソッドを持っているのだから、各オブジェクトにポインタを持たせる必要はない。
virtual ...
2022/03/25(金) 23:08:00.32ID:CnzFn2Nz0
各オブジェクトにはクラス毎にある共有のクラスデータへのポインタ1つ持ってるだけ
各クラスデータにクラス名とか関数ポインタ並べた関数テーブルvtableは1つで共有すれぼいい
各オブジェクト毎にいちいち関数ポインタ全部をメンバで持たせる意味はない
これだと単純にリフレクションで特定のオブジェクトの特定のメソッドだけ差し替えるとかできないけど知らん
関数ポインタと関数テーブルをごっちゃにすると話が分からんことになるぞ
2022/03/25(金) 23:21:00.51ID:QepENKM50
>>675
>各オブジェクトにはクラス毎にある共有のクラスデータへのポインタ1つ持ってる

ということは、

>>672
>各オブジェクトにポインタを持たせる必要はない。
は間違いですよね…

そして Java はデフォで virtual だし…
2022/03/25(金) 23:25:17.61ID:pf6/Mxtd0
レスくれた方ありがとうございます
お礼が遅くなってすいません
2022/03/25(金) 23:34:03.29ID:YQJ39BAyd
>>676
言ってることは一緒だよ
オブジェクトは「型情報」を持っていて、それはクラスの共有情報へのポインタと考えることもできる
そしてvirtualを気にしているようだが、オーバーライドされてようが同じクラスのインスタンスなら呼ばれるメソッドは同じだろ?
だからクラスが関数テーブルを持ってりゃ十分なんだよ
2022/03/25(金) 23:56:18.43ID:bplTxLs1M
インタンスメソッドが実際にどういう持ち方をされてるのかっていうのは割とどうでもいいよ
そのへんはシームレスに使える
必要に迫られたら学べばいい
元質問はメンバ変数のスコープに関する話なのでもっとずっと初歩でシンプルかつ大事
680デフォルトの名無しさん (ワッチョイ 655f-ZnE1)
垢版 |
2022/03/26(土) 00:19:37.66ID:lKHoVGOW0
変数のスコープの話だと思ったのは、質問者がそう思い込んだだけだけどな。
2022/03/26(土) 01:55:39.86ID:KWdFYtrC0
2022/04/04(月) 16:34:16.00ID:TiyvLquy0
クラスにfinalを付けて宣言してもメンバ変数に代入が許されてしまうのは何故ですか。
メンバも代入禁止にする方法はないですか?
ただしもちろんfinalつけずに変更しながら使う場合もあるのてメンバ変数自体をfinalで宣言するのは不可です。
2022/04/04(月) 18:26:50.83ID:nAFl9YQG0
>>682
メンバ変数にfinal付ける。
publicと同じ。
2022/04/04(月) 18:38:24.18ID:+wFw0XNcr
>>682
フィールドへの代入を禁止したいけど、変更して使うこともあるって、どういうこと??
2022/04/04(月) 18:39:57.29ID:kQC4QAS9r
>>682
ちな、クラスへのfinalは継承を禁止するものなので、フィールドの値が変更不可になるわけではない。
2022/04/04(月) 20:45:08.75ID:TiyvLquy0
>>684
例えば、publicなフィールドx,y,zを持つ3次元座標を表すクラスHogeがあったとして、
通常は座標値を弄るのでフィールドをfinalにするのはできないのですが、
不動の座標値を使いたい(例えば、原点の0,0,0など。)時に、Hoge型の定数のように宣言したいです。

//↓フィールド変更不可
final Hoge ZERO = new Hoge(0,0,0);
//↓自由にフィールド変更可能
Hoge point = new Hoge();

みたいにしたいです。
要するにc++のconst的な宣言の仕方をしたいです。
2022/04/04(月) 21:23:46.54ID:LKr43FX/M
定数になるような型ならメンバ変数をfinalにしてイミュータブル(不変)なクラス設計とするのがベストプラクティス
値を変えたくなったら別のオブジェクトをコピーして返す
Stringクラスと同じ考え方
最近のJavaで導入されたrecord型もそういう発想で不変しか用意されてない
オブジェクトが増えるので性能が気になるかもしれないけど有意差にならないことも多い
可変にするとキャッシュも定数化もできないから性能面でのデメリットもある
どうしても可変な値がないと処理効率が悪すぎて性能目標がクリアできなくなるほどの処理があるなら、StringBuilderのような可変クラスを別で用意してもいい
可変と不変のクラス間でCharSequenceのような読み取り専用のビューを用意するとなお良い
メンバ数が多すぎてコピーがしんどいなら定数になるべき部分だけを切り出して不変にしてメンバで持たせる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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