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

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2019/03/09(土) 23:59:15.92ID:ACok0wnJ
Java初心者のためのスレッドです。

※前スレ
Java入門・初心者質問スレ Part.8
http://mevius.5ch.net/test/read.cgi/tech/1528370228/
2019/12/28(土) 14:58:29.40ID:Nw+g0oHm
処理の順序が正しいかご教示願います

次にプログラムをコンパイル及び実行した結果として正しいものはどれか
1 class Q23 {
2 public static void main (String [ ] args ) {
3 int i = 1 , sum = 0 ;
4 while ( i ++ < = 10 ) sum + = i ;
5 System . out .print ( sum ) ;
6 }

解答、66が表示される

@intのiに1が代入
Asumは0が代入
Bwhileは〜の間
Ci=1が10より小さい間
Di=1に++、i=2
sum=0 += i=2、sum=【2】
Ei=2、
Fi=2が10より小さい間
Gi=2に++、i=3
sum=2 += i=3、sum=【5】
中略
Hsum=11 になったら終わり
sumにはiの2,3,4,5,6,7,8,9,10,11が加算され【65】になる
2019/12/28(土) 16:16:21.77ID:vGmL5pRR
>>284
合っていますが、

> 解答、66が表示される
ではなく「解答、65が表示される」、

> Hsum=11 になったら終わり
は 「i = 11 になったら終わり」ですね。

細かい部分をいい加減にするとあなたの理解の妨げになりますし、
読む方も書き間違えただけなのか理解できてないのか分かりにくくて面倒です。
2019/12/28(土) 16:28:31.89ID:vGmL5pRR
>>283
>>277のプログラムでfor文で繰り返し実行されるのは5行目の
sum += data[i];
部分(とi++)だけです。
ここでint配列に格納されているすべての要素を順にsumに足し合わせています。
sum = sum + data[0]; // i=0の時
sum = sum + data[1];
sum = sum + data[2];
sum = sum + data[3];
sum = sum + data[4]; // i=4の時

結果、forループ終了時点でsumは150 (= 10 + 20 + 30 + 40 + 50)で、
System.out.println(150 / 5) の結果(5はdata.length)、30が表示されます。
それだけのことです。
2019/12/28(土) 16:33:47.11ID:Nw+g0oHm
Javaの問題集でありました。なぜ10行目でコンパイルエラーになるのが理解できていません
for(;;)のカッコの中の;;が無限ループ?になるからでしょうか

public class p28Q26 {
public static void main(String[] args) {
int i=0;
for (;;) {
if(i >= 5)
i=0;
else
i++;
}
System.out.print(i);
}
}
2019/12/28(土) 16:36:30.25ID:Nw+g0oHm
>>285
解説有難うございます
「解答65が表示される」が正しいです。
誤字脱字申し訳ありません
2019/12/28(土) 16:47:11.07ID:Nw+g0oHm
>>286
解説有難うございます
5行目、for ( int i = 0 ; i <= data . length -1 ; i ++ ) sum += data [ i ] ;
ここで、sumに加算されていくんですね
見てたつもりで見てなかったです。

親切に解説して下さり本当に有難うございます
290デフォルトの名無しさん
垢版 |
2019/12/28(土) 18:17:08.70ID:p8R0Q+BH
>>287
システムアウトの構文がメソッド内ではなく、クラスに書かれているから。
291デフォルトの名無しさん
垢版 |
2019/12/28(土) 18:18:22.25ID:p8R0Q+BH
>>290
間違った。わからんな。
2019/12/28(土) 18:22:25.71ID:Nw+g0oHm
なぜ解答がfalseになるのかが分かりません

次のプログラムを粉ピル及び実行した結果として正しいものはどれか
1 public static void main(String[] args) {
2 int count = 3;
3 int limit = 2;
4 System.out.println(count <= limit);
5 }

解答:コンパイル及び実行されfalseが表示される

質問1:
eclipsでコード入力し実行すると4と表示されました
奇数はtureで偶数はfalse等の決まりがあるのでしょうか
質問2:
System.out.println(3 <= 2);
3が2よりも小さいなら・・・「小さいのでture」と考えてしまいました
何を基準にtureでfolseなのか理解できてません

何度も教えてクレクレで申し訳ありません。
宜しくお願いいたします
<m(__)m>
2019/12/28(土) 18:29:17.74ID:Nw+g0oHm
>>291
有難うございます。

解説では
「4行目から9行目のforループからぬけることがないため、10行目に制御が移ることが出来ない
そのため、コンパイル時に10行目でコンパイルエラーとなる」
と記載されております。
以前、聞いた話では
例えば
for ( int i = 0 ; i < 10 ; i++ ) {
のiのことをループ変数と呼ぶので、そこに「 ; 」を入れるとループすると聞いた覚えがあります
2019/12/28(土) 18:30:24.52ID:Nw+g0oHm
>>292
誤字脱字すみません
「粉ピル」でなく「コンパイル」です
誤⇒次のプログラムを粉ピル及び実行した結果として正しいものはどれか
正⇒次のプログラムをコンパイル及び実行した結果として正しいものはどれか
295デフォルトの名無しさん
垢版 |
2019/12/28(土) 18:40:26.94ID:p8R0Q+BH
>>292
少なくとも奇数、偶数という概念はない。
2019/12/28(土) 18:47:52.83ID:Nw+g0oHm
記号の意味を教えて下さい

int left = 12;
int rigth = 34
system.out.println(left > rigth ? left - rigth : rigth - left );

この「 ? 」と「 : 」はなんの記号なのでしょうか
2019/12/28(土) 18:49:18.19ID:Nw+g0oHm
>>295
有難うございます。
エクセル出来る人が昔、言ってたような気がしたのですが勘違いですね
親切に有難うございます
<m(__)m>
2019/12/28(土) 19:08:40.59ID:wFzdDG/T
>>296
A ? B : C
AならB、違えばC
大きい方から小さい方を引く処理をしてる
2019/12/28(土) 19:14:16.39ID:Nw+g0oHm
>>298
解説有難うございます

処理方法は
@left > raiget
Aleft - rigth = 12 - 34 = -22
Brigth - left = 34 - -22 = 22
2019/12/28(土) 19:20:59.18ID:Nw+g0oHm
>>298
アドバイスして頂いた後に問題集の解説を読み返して分かりました

「条件演算子を使った式である。条件式、left > rigth 、が成り立つ場合に、 left - rigth :が
そうでない場合はrigth - left 、が結果となる」

本当に有難うございます
<m(__)m>
301デフォルトの名無しさん
垢版 |
2019/12/28(土) 19:31:28.91ID:un29Kqgd
いきなり問題集で勉強しているのが不思議
2019/12/28(土) 19:38:00.99ID:Nw+g0oHm
>>301
「スッキリわかる」は読みましたが
無限ループの「 ; 」や、「left > rigth ? left - rigth : rigth - left」は乗ってなかったです
あまりも理解力がなさすぎて困りもんです
for文が苦手です。
2019/12/28(土) 22:12:24.13ID:/9L9K2QS
誤字脱字が多いとか、半角全角が混ざってるとか、不要なスペースが入ってたり必要なスペースが無かったりとか、プログラマとして致命的な欠陥
意識して直したほうがいいと思うよ
304デフォルトの名無しさん
垢版 |
2019/12/28(土) 23:30:03.54ID:un29Kqgd
>>302
あなたが質問していることは資格を取るための知識であって、Javaプログラマに必要な知識ではない。
2019/12/29(日) 00:42:02.66ID:siL0YjcS
誤字脱字多いですね。申し訳ありません
音声再生リストに入れたりして学習してる関係で不要なスペースを入れたりしてました。

どの程度知識あるか把握するのに資格は必要かと思ってました。
解説して下さった方には本当に感謝です
有難うございます。
2019/12/29(日) 08:46:31.43
プログラ魔
2019/12/29(日) 13:50:30.21ID:KIjz0jVz
あなうめ式Javaプログラミング超入門、2019/12/3
大津 真、田中 賢一郎、馬場 貴之

こういう本が出てるのだろ

大津真は、多言語の本を書いてる著者。
日経Linux のライターでもあるのか?
2019/12/29(日) 15:49:06.27ID:v8cZXQkF
eclipse で書けば、最低限の文法ミスは取れると思うのだが
それをやる気はないんですか?
2019/12/29(日) 16:13:51.10ID:siL0YjcS
>>308
「スッキリわかる」や問題集を音声変換ソフトに入力して日々聞いています
eclipsに書いても、音声変換ソフトではスペース多く入れないと変な英語になったりするので
音声変換ソフトに入力しています
310デフォルトの名無しさん
垢版 |
2019/12/29(日) 18:36:48.23ID:oAHsONBK
>>309
エクリップス?
311デフォルトの名無しさん
垢版 |
2019/12/29(日) 18:38:36.04ID:oAHsONBK
文系みたいな勉強法だなw
2019/12/29(日) 18:51:03.48ID:v8cZXQkF
実際に動かしてみないのか!
畳の上の水練だな
プログラムは動いてなんぼなので
必ず動かしてみることを強くお勧めする
動かないプログラムは何の意味もない
2019/12/29(日) 19:54:32.63ID:siL0YjcS
>>312
アドバイス有難うございます
実際に入力しても理解できないものがあり質問していました。

例えば
public class q18{
 public static void main(String[] args) {
  int count = 3;
  int limit = 2;
 System.out.println(count <= limit);
 }
}
実行結果は「4」と出ますが
問題集の解答は「コンパイル及び実行されfalseが表示される」との事です
エクセルの関数で奇数偶数表示でfalseやtureと判断する場合があるので
Javaでもあるのか?等、質問してましたが未だに判明していないです
2019/12/29(日) 19:56:46.80ID:f7fle0nG
10進法でシフトさせる方法って無いですか?
例えば1234→12、とかってやりたいんですが…
2019/12/29(日) 19:59:13.49ID:yqbBnK7b
>>314
10 で割るのが適当かと
316デフォルトの名無しさん
垢版 |
2019/12/29(日) 20:40:13.14ID:2ZGuf6bc
>>313
4と出るわけがないから実行するもの間違えてるよ
317デフォルトの名無しさん
垢版 |
2019/12/29(日) 20:42:12.56ID:2ZGuf6bc
https://paiza.io/projects/FhYUXk-mGxVmUKEaiXt5vw
2019/12/29(日) 21:12:21.70ID:Zt6NZoPC
>>314
10のn乗で割る
2桁シフトさせたいなら10の2乗の100で割る
ビット演算のシフトも意味としては同じ
2019/12/29(日) 21:55:22.43ID:siL0YjcS
>>316
有難うございます。
申し訳ありません。4じゃなくて「2」でした。
以下で実行すると2と表示されます

package Study;
public class Stady03 {
public static void main(String[] args) {

int count = 3;
int limit = 2;
System.out.println(count <= limit);
}
}
2019/12/29(日) 22:07:40.40ID:siL0YjcS
>>316
有難うございます
試しに「hello java」と入力しても「2」と表示されてました。
「false」と表示出来ました。
本当に有難うございます
321314
垢版 |
2019/12/29(日) 22:50:01.82ID:f7fle0nG
>>315
>>318
ありがとうございました
2019/12/29(日) 23:11:51.07ID:XnQ2dClW
ああ、別のプログラムを動かしていて、想定外の出力がされていたということか
2019/12/30(月) 00:06:41.49ID:4HDF+aJA
>>322
実行する時に「Javaアプリケーション」でなく「実行の構成」から実行してました
左側でクラスを選択せず実行しなかったので、前に選択してたクラスを実行させてました。
>>316 さんがアドバイスしてくれなかったら永遠に謎めいていました
本当に有難うございます。
エクリプスの操作方法の本も購入して頑張ります。
2019/12/30(月) 00:14:07.46ID:4HDF+aJA
>>317
わざわざ書いて頂きありがとうございます
こういうのもあるんですね。
本当に有難うございます。
325デフォルトの名無しさん
垢版 |
2019/12/30(月) 00:16:12.10ID:GxL7rxBL
Java全く知らない状態から約2週間でbronze合格出来て嬉しい!
シルバーまでは取ってほしいと会社に言われてるので紫本で勉強を始めたのですが
二次元配列とクラス名@ハッシュコードが出力される問題の理解が足りない・・・
何故ハッシュコードが出てくるのか・・・
2019/12/30(月) 01:38:30.44ID:4HDF+aJA
>>325
凄い!2週間で合格!!!
2019/12/30(月) 01:42:01.35ID:4HDF+aJA
>>325
前に他の言語とかの知識はありましたか?
328デフォルトの名無しさん
垢版 |
2019/12/30(月) 12:31:29.28ID:GxL7rxBL
>>327
二ヵ月程Python触ってwin用のguiアプリ作ってみた位です
オブジェクト指向使わずに作ったので今見ると糞コードですが・・・
スッキリわかるjava軽く読みながらコード書いて後は白本と黒本やってれば大丈夫だと思いますよ
2019/12/30(月) 12:59:36.01ID:QHPQM7tO
>>325
配列の要素を順番に探すと時間がかかってしょうがないからだよ
二次元配列を使うぐらいなら RDB を使うのが一般的だとは思うけど
2019/12/30(月) 13:21:39.21ID:yKHaMa8w
>>325
ハッシュコードが出るのはtoStringがオーバーライドされていないからというシンプルな理由
ObjectのtoStringがそのように実装されているから、すげ替えないことには同じ結果になる
どう書くとオーバーライドが成立するのか、しないのか、という話はそこそこ難しいかもしれない
331デフォルトの名無しさん
垢版 |
2019/12/30(月) 14:54:51.70ID:GxL7rxBL
>>330
アドバイスありがとうございます。
実際に書きながら確認していって理解していこうと思います。
2019/12/30(月) 18:24:06.08ID:4HDF+aJA
>>328
有難うございます
私も頑張ります
2019/12/30(月) 22:39:10.96ID:4HDF+aJA
解説してくれ方のお陰で、過去問したら89点取れました。
本当に有難うございます。
<m(__)m>
100点を連続5回取れるよう頑張ります
今後とも宜しくお願いします
2019/12/31(火) 05:48:01.42ID:tPXUyNvp
enum定数というのが出題されました。
「スッキリわかる」には載ってなくググってみましたが
理解力がないのでチンプンカンプンです
おススメの本とかサイトがあればご教示願います
<m(__)m>
2019/12/31(火) 13:36:43.87ID:9+YIWQbo
新しいインスタンスを生成できない

これに尽きるな
336デフォルトの名無しさん
垢版 |
2019/12/31(火) 13:57:18.91ID:yv9yhyfZ
>>334
柴田望洋の『新・明解Java入門 (明解シリーズ)』
僕は望洋さんの本で勉強したなー
2019/12/31(火) 14:15:06.32ID:uegmaB/s
昔読んだ初級本を理由があって探しています
最終まとめお題が「タイピング速度訓練ゲーム」(予約語をタイプして時間を計るもの)である初級本に心当たりのある方はおられますか?
2019/12/31(火) 20:40:43.65ID:tPXUyNvp
>>336
アドバイス有難うございます。
アマゾンで
柴田 望洋 「解きながら学ぶJava 入門編 (日本語) 単行本 ?」
購入しようか迷ってたとこです
2020/01/01(水) 03:30:56.24ID:yEYEASGU
>>336
アマゾンで
柴田 望洋 「解きながら学ぶJava 入門編 (日本語) 単行本 ?」
購入しました。
2020/01/03(金) 02:54:31.41ID:EbvJW/gM
問題集の解説が理解できてません
どなたか解説お願いします<m(__)m>

1 public class Q24 {
2 public static void main(String[] args) {
3 System.out.println(args[0]);
4 }
5 }

解説
コマンドライン引数に関する問題。コマンドライン引数を指定して実行した場合、
コマンドライン引数の数と同じ要素数の配列インスタンスが生成され、指定した文字列で初期化されます。
なお、コマンドライン引数を指定しない場合でも、必ず配列インスタンスは生成されます。
この場合は、要素数0の配列インスタンスが生成されます。
設問のコード3行目では、mainメソッドの仮引数で宣言しているString配列型変数argsの添え字0を指定し、
要素の値をコンソールに出力しています。コマンドライン引数を指定していない場合は、
String配列型変数argsは要素数0の配列インスタンスへの参照を保持します。
3行目で参照している添字0、つまり1つ目の要素は存在しません。
そのためこのプログラムは、コンパイルが成功しても、実行時に例外が発生します
2020/01/03(金) 03:00:04.97ID:RUwUdhzc
>>340
1コマンドライン引数に関する問題。コマンドライン引数を指定して実行した場合、
2コマンドライン引数の数と同じ要素数の配列インスタンスが生成され、指定した文字列で初期化されます。
3なお、コマンドライン引数を指定しない場合でも、必ず配列インスタンスは生成されます。
4この場合は、要素数0の配列インスタンスが生成されます。
5設問のコード3行目では、mainメソッドの仮引数で宣言しているString配列型変数argsの添え字0を指定し、
6要素の値をコンソールに出力しています。コマンドライン引数を指定していない場合は、
7String配列型変数argsは要素数0の配列インスタンスへの参照を保持します。
8 3行目で参照している添字0、つまり1つ目の要素は存在しません。
9そのためこのプログラムは、コンパイルが成功しても、実行時に例外が発生します

各行に番号を振りました。どの番号の行からわからなくなったのでしょうか?
2020/01/03(金) 04:08:56.51ID:EbvJW/gM
>>341
本当に有難うございます。
<m(__)m>
8行目から理解できていません。
「3行目で参照している添字0、つまり1つ目の要素は存在しません。」
これは、初期化されていないからエラーになるという意味なのでしょうか
以下のコードだと0が表示される事は理解できてます。
1 public static void main(String[] args) {
2 int [] score = new int [5];
3 System.out.println(score[0]);
  }
2020/01/03(金) 15:22:26.21ID:E3T+CFjv
CとC++を一通り教科書一冊やったところで、Javaにも手を出してみようと思うんだけど
1年くらい前にKotlinって言語が急上昇して、これがJavaの上位互換言語だみたいなことが言われてて、今からJavaやるのはありえない!みたいな意見を目にしたんだけど、実際その通りなの?
JavaもKotlinも全然分からなくて判断のしようがない
344デフォルトの名無しさん
垢版 |
2020/01/03(金) 15:44:39.59ID:O0mCvqHf
>>342
初期化の問題ではありません
配列の要素数の問題です

int [] score = new int [5];
System.out.println(score[0]);

これは要素数5の配列を作って添字0の値を出力するコードです

https://light.dotup.org/uploda/light.dotup.org628898.png

引数に何も指定しなかったら要素数0の配列が作られます
要素数が0のとき添字0は存在しないです
345デフォルトの名無しさん
垢版 |
2020/01/03(金) 17:46:51.19ID:+axZyF+3
>>343
上位互換ではなく寄生(悪い意味ではない)。
2020/01/03(金) 18:49:06.67ID:EAlgMQ2P
mainメソッド内で入力を受け付けて、誤入力があった時に終了させたいのですが、
その際にreturn;を使っていいでしょうか?
2020/01/03(金) 19:32:11.73ID:LNQstWl9
>>346
いいですよ。
でも終了コード(exit status)を指定したかったら
System.exit(int);
使うべし。
あと、そもそも意味が違うので、そのmainメソッドが他のメソッドから呼ばれる場合は
returnとSystem.exit()では動作が違うので注意ですけどね。
2020/01/03(金) 20:54:45.37ID:EbvJW/gM
>>344
有難うございます。
しかし
頭が混乱してきました
もう少しまとめます
349346
垢版 |
2020/01/03(金) 22:49:24.76ID:EAlgMQ2P
>>347
分かりました
ありがとうございました
2020/01/04(土) 02:21:07.91ID:X7t3Qsuc
>>340
Ruby の1-liner で、コマンドライン引数を、2つ渡した場合と、引数なしの場合

配列のサイズが0 の場合は、要素は存在しないため、アクセスできない。
Rubyでは、存在しない要素はnil となり、Java ではエラーになるのか?

ruby -e 'p ARGV.length, ARGV[ 0 ], ARGV[ 1 ]' あ a
#=> 2, "あ", "a"

ruby -e 'p ARGV.length, ARGV[ 0 ], ARGV[ 1 ]'
#=> 0, nil, nil
2020/01/04(土) 02:49:53.41ID:oEJCGEWJ
>>350
One-linerを1-linerと書くのはやめないか?
「漏れ」以外にその書き方するやついないぞ
2020/01/04(土) 11:13:28.17ID:TlPnzOfx
>>350
そのあたりは言語のデザイン(哲学)が違う。
Javaだと存在しない配列要素へのアクセスは例外が生じる。
ex.
System.out.println(new String[]{}[0]);
-> ArrayIndexOutOfBoundsException
2020/01/04(土) 11:43:36.84ID:9MTU5NN5
>>343
今のところKotlinはJavaが分かってる事が前提の言語。Kotlinからもやろうと思えばできるが。
2020/01/11(土) 19:17:40.16ID:KiFAjBY+
Random rand = new Random();
のように、インスタンス化の際に代入を行っている文の意味は分かるのですが、
そうでなく急にnew演算子から始まる、例えば
new Sample("samp"); // Sampleはクラス名
のような文はどう解釈すればよいでしょうか?
変数に格納されていないのですが…
2020/01/11(土) 19:37:45.27ID:qur7jyYe
>>354
作ったら放棄
作る処理だけ動く
356354
垢版 |
2020/01/11(土) 23:39:08.69ID:KiFAjBY+
>>355
ありがとうございます
ブロンズやシルバーの問題集でよく見かけるんですが、
どういう場合にメリットがあるんでしょうか?
2020/01/12(日) 00:28:23.36ID:FbSdnFnB
実用上のメリットはない
コンストラクタの挙動を学ぶための非日常的なコードだよ
英語の教科書を見てThis is a pen.と発言することにメリットはあるのでしょうかと真顔で問うような話だよ
2020/01/12(日) 00:41:02.43ID:FbSdnFnB
一応補足しておくと、コンストラクタを含めてメソッドには副作用がある場合がある
たとえばコンストラクタの中でデータベースの値を更新したりファイル出力を行ったりもできる
そういう副作用だけが必要な場合、こういう奇妙なコードを書いてしまうことはあり得る
359354
垢版 |
2020/01/12(日) 00:49:26.47ID:YGMc249+
>>357-358
そうなんですね
ありがとうございました
360デフォルトの名無しさん
垢版 |
2020/01/13(月) 15:57:25.19ID:UjYrXoaW
>>359
C++の影響。newはもともとメモリの動的確保を意味している。
2020/01/13(月) 17:02:16.87ID:30KNGumF
>>360
C++ ならば new したものは delete する作法を強要するべきで new して放置とかありえないのでは?
362デフォルトの名無しさん
垢版 |
2020/01/13(月) 18:16:10.00ID:PNIqRh18
ハンドルがないのに?
2020/01/13(月) 19:26:12.04ID:KUNSdwO3
噛み合わないコントみたいになってきたな
364デフォルトの名無しさん
垢版 |
2020/01/14(火) 17:31:35.16ID:65PQRowg
>>361
deleteをnewの前に書いとけばいいのでは?
2020/01/14(火) 22:11:59.04ID:n4wC7pc/
きったねーソースだなお前
2020/01/14(火) 23:39:48.82ID:s+tVLezo
汚い以前にだめだろ
2020/01/15(水) 17:40:41.68ID:8ggLLG+3
スッキリわかるJava入門実践編第2版を読んでいて疑問に思ったことがあります。

Comparableインターフェイス
Cloneableインターフェイス

という二つのインターフェイスがあります。

この二つのインターフェイスを実装するときの書き方ですが、
以下のように書くようです:

public class A implements Comparable<A> {

}

public class B implements Cloneable {

}

なぜ、Comparableには<A>という仮型引数を書くのに、Cloneableでは書かないのでしょうか?

Cloneableには実装すべきメソッドが1つもないから仮型引数を書く場所もないからでしょうか?
2020/01/15(水) 22:35:40.84ID:lrragII8
Comparabeが実装すべきメソッドcompareは引数として比較対象のオブジェクトをとる
その比較対象が自分自身と同じ型に限定されることを示すためにAが要る
Cloneableはメソッド自体がひとつもないマーカーインターフェースなので対照の例としては極端すぎる
Runnabeはrunメソッドがあるけど、runメソッドは型引数を必要としないので、Runnableも型引数を必要としない
369デフォルトの名無しさん
垢版 |
2020/01/25(土) 16:39:45.16ID:Z1ilCU6Y
bronze取ってから3週間更に勉強してsilver受かった!
落ちなくて良かった
2020/02/08(土) 14:15:53.01ID:eaM+nAXG
質問です
Javaにおけるダイナミックバインドとはどういうものでしょうか?
Googleで調べてもいまいちよく理解出来ません
どなたかお願いします
2020/02/08(土) 14:57:11.23ID:y1MoL2az
バインディングっていくつか意味あるけど、
ここでの意味は、「メソッド呼び出しと、メソッドの中身の実行文を結びつけること」

継承したクラスでオーバーライドされたメソッド呼び出しは、プログラム実行時に動的に解決される
static や private や final なメソッドの呼び出しは、コンパイル時に静的に解決される

ざっくり目に説明すると、
動的とは、メモリ上で作用する様子
メモリって読み書き早いよね、だから動的って言う言葉使ってるんだと思う

静的とは、ハードディスク上のプログラムファイルの時点ですでに完成されてる様子
HDDって読み書き遅いよね、実行ファイルの時点ですでにメソッドコールとメソッドボディの結びつきはすでに解決してる
実行しなくても、静的に class ファイルを解析することによって、メソッドコールからメソッドボディが辿れる

動的に解決すると、実行時に余計な動作が入るので遅くなる
静的に解決すると、実行時には指定されたアドレスへ移るだけなので動作は早い

どれくらい違うかは、オーバーライドされたメソッドと、オーバーライドされてないメソッドの呼び出しを大量にやってみて比較とかかな?
ノイズなくしてメソッドコールの時間のみを計測するのはなかなか難しそう

聞いたことあるのは、インターフェース使いまくってプログラム組むとメソッドコールの解決で余計に時間かかるよってこと

どれくらい時間が変わってくるのかは俺は知らない
てか、大して変わらんのじゃないかなと勝手に思ってるけど、調べて分かったら教えて
372デフォルトの名無しさん
垢版 |
2020/02/08(土) 15:16:29.63ID:isDMmOQk
Wikipediaの例が分かりやすいと思うけど
https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

よくある
鳴く()メソッド持つ動物クラスを継承した犬クラスと猫クラスで鳴くを実行するとかそういうの
373370
垢版 |
2020/02/08(土) 15:50:57.39ID:eaM+nAXG
>>371
>>372
回答ありがとうございます


オーバーライドされたメソッドの動作内容は、入っている型(左辺の型)ではなく、
実体の型(右辺の型)で決まるという理解でいいですか?
2020/02/08(土) 16:27:08.89ID:dN+51w1C
>>373
横からですけど、そうです。
Javaでは変数の型ではなくて、変数に格納されている実際のオブジェクトの型に基づいて呼び出すメソッドが決定されます。
このようなプログラミング言語の機能をダイナミックバインディング(動的束縛)と呼びます。

一般的にこの手の文脈での「動的に」と言うのは「(プログラムの)実行時に」と捉えれば良いです。
「静的に」と言うのは実行前、プログラムのコンパイル時(や言語によってはリンク時)に解決されるものを指します。
静的に解決されたものは実行時には(一般的には)変わりません。
375370
垢版 |
2020/02/08(土) 18:53:27.58ID:eaM+nAXG
>>374
ありがとうございます
2020/02/11(火) 17:59:29.94ID:L4MHQKAq
>>369
おめでとう!
2020/02/11(火) 18:00:53.76ID:L4MHQKAq
>>344
ブロンズ合格できました。
有難うございます。
次はシルバー頑張ります!
2020/02/18(火) 05:50:07.21ID:ExMaVF7M
合格することに何の意味も価値もない資格に1万3千円も使ったのか
379デフォルトの名無しさん
垢版 |
2020/02/18(火) 08:26:43.80ID:SKupKNV8
応用技術者試験も価値はないですか?
2020/02/18(火) 08:58:58.42ID:ExMaVF7M
ない
2020/02/18(火) 09:21:33.81ID:B1+kI16C
ここに書き込むことにも価値はないし
生きてることにも価値はないし
価値がないと思うことにも価値はない
一切は空である
2020/02/18(火) 09:24:01.78ID:B1+kI16C
楽しかったらええんや
ワイはブロンズ、シルバー、ゴールドとったで
2020/02/18(火) 09:35:55.38ID:/Dg55StS
>>378はそれだけ退屈な人生で楽しみも見出せないらしいな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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