1 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 19:48:24 ] プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作板をご利用ください。pc10.2ch.net/hp/ 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/ これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、 wikiからのリンクをおたどりください。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド111【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1200151522/ /* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。 質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */ また、当スレで質問をするかたは、回答をもらえたときに、 wikiの更新をして頂ければ、忝のう存じます。 次スレは>>980 あたりで。
413 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 16:01:35 ] ほんと、SUNにはもっと普及率を上げるための努力をしてもらいたい。 まずはインストールをもっと簡単にして。
414 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 16:50:00 ] >>1 のリンク死んでるな。というかサーバが停止してるようだが。
415 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:55:48 ] >>412 もっともです。テンプレっぽいのに追加で。 **** 開発環境が必要の場合は **** >>5 **** 実行環境だけが必要の場合は **** ■ Java ソフトウェアのダウンロード ttp://www.java.com/ja/
416 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:59:58 ] ム板なんだし JRE の落とし方はどうでも良くない? かえって混乱すると思う。
417 名前:369 mailto:sage [2008/02/17(日) 18:54:29 ] なるほど!何とか理解できました。>374 さん thx
418 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 18:59:59 ] >>416 ところがEclipseを使うのにJDKは不要だ罠 新人研修等ではじめからEclipseでスタートする場合、 JDKを入れたことがないという人も出てきそうなご時世だね。
419 名前:デフォルトの名無しさん [2008/02/17(日) 20:16:41 ] Arrays.sortを使って数値の配列をソートしたんですが これってソート後の配列の添え字情報とかも取得できないんですか?? たとえば ソート前 a[0]= 2 a[1]= 1 a[2]= 3 ↓ ソート ソート後 a[1]= 1 a[0]= 2 a[2]= 3 の[1],[0],[2]の情報を取得したいですー!何か方法ありませんかー!
420 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 20:25:55 ] その添え字情報を何に使うんだ? ただ単に安定なソートがしたい、ってだけなら、 List<Integer> lst = Arrays.asList(2, 1, 3); Collections.sort(lst); でOKじゃない?
421 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 20:35:50 ] class Hoge { public int ソート前のインデックス; public int 値; } こういうラッパーをかぶせてからソートすればいいんじゃね
422 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:09:07 ] >>419 一番高速なのは、quicksortのコードを自分でいじって実装することかな。 値をスワップするところで、添え字もスワップすればいい
423 名前:419 [2008/02/17(日) 21:09:52 ] >>420 ,421 返答ありがとうございます hoge[0] = 3423 hoge[1] = 4123 hoge[2] = 4142 a[0]= 2 a[1]= 1 a[2]= 3 みたいにhogeにID、aに値を保存していて、それぞれ添え字で=を確認してたんです (つまり添え字が0ならID;3423→2みたいにです) あとaには同じ値がたくさんはいっているのでソート後に値で確認もできないんです。。。 もしかして他にいい保存方法あったりしますかね^^;
424 名前:デフォルトの名無しさん [2008/02/17(日) 21:10:48 ] >>422 やっぱ自分で実装するのが一番早いですかね?。。
425 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:16:03 ] クラス使えよ class IDAndValue { int id; int value; } ソートはComparatorを自分で実装すればいいだけ
426 名前:デフォルトの名無しさん [2008/02/17(日) 21:21:10 ] >>425 ありがとうございます やってみます!
427 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:27:25 ] Comparableでもいいよ
428 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:31:34 ] ファイルを後ろから読み込むにはどうすればいいのでしょうか? BufferedReaderのreadLineのように一行ずつ読み込めるものがあると良いのですが、、、
429 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:45:34 ] そんなに大きくないならListに全部読み込んで、後ろから取り出せば?
430 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:45:43 ] 多分だけど、どうしてそれがしたいかを説明すると よりハッピーになると思う
431 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:05:38 ] >>378 >>361 のページに↓のようにいつ統計を採ったのかを書いてある Millward Brown survey, conducted December 2007. See Methodology Section for details on the Millward Brown study.
432 名前:デフォルトの名無しさん [2008/02/17(日) 23:24:14 ] public ShortTimer t; t.start(); これでタイマーが開始しましたが、再びここで t.start(); すると実行時エラーになります。 そこで t が t.start(); されているかを知る方法を教えてください。
433 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:01:19 ] >>432 >>2 Good Luck!
434 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:07:55 ] 428です。 後ろに行くほど新しい情報が書いてあるログファイルなので後ろから読み込めたらいいなと。 容量はそれほど大きくもないのですが、、、
435 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:22:54 ] >>434 それは tail コマンドと同じ機能っぽい印象を受けました。 そして、あまりに便利なコマンドだから、かっこいいことをしてるハズだ と、そう思って検索してみました。すると… 勘違いしていました。tail.c ttp://programamemo2.blogspot.com/2008/02/tailc.html バッファサイズ決めて、(最初はファイル長を割って余った分だけ)ファイルから読み込んで 改行文字数を数えて、必要数たまったら、そのバイトから最後まで出力っぽい感じ。 ファイルが更新された時の処理も、そのブログ記事にあるとおりで、なんともはや…
436 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:36:16 ] んなもん tail の動き見てりゃ 1 秒ごとに監視してるだけくらい想像付くべ。 ファイルのケツから数kB〜数十kB ごとに読み込んで行数カウント、必要行数に 達したらそこから開始位置まで出力、達しなければその前のブロックを評価が定番。
437 名前:デフォルトの名無しさん [2008/02/18(月) 08:34:15 ] class Test { int sum(int[] date){ int r=0; int i; for(i=0; i<date.length; i++) r += date[i]; return r; } } public class sample34{ public static void main(String[] args) { Test test =new Test(); int[] date1 = new int[]{1,2,3,4,5}; int result; result=test.sum(date1); System.out.println(result); } } これで15が返ってくる理由教えてください。 私の考えはsum(int[] date)ここに{1,2,3,4,5}を入れるわけですよね? でdate.lengthとなっているから、その個数5だと思うんですけど すいません意味不明で・・・
438 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:54:32 ] 配列のインデックスは0から始まる
439 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:21:12 ] >>437 配列型の変数 date の length は int型で、この場合の値は 5 です。よって L5: i が 5 未満の場合、L6 へ進む。そうでなければL7へ進む。 L6: r と date[i] を加算し、r にその結果を入れる。(i に 1 加える。L5へ進む。) L7: r を返す。 // 何をしてるかと言えば、配列の各要素の値を加算した値を返してるだけ。 よって、Test のインスタンスメソッド sum(int[]) に date1 を入れて実行すると 15 が返される。 // 各要素の値、1 から 5 までを加算した値 後は手元の本などで for文の仕組みを調べ直してください。 蛇足。制御文 if, else, for, while, do-while の "{ }" を省略した場合、 直後の1文が制御対象になりますが、見易さや事故防止等の為、 省略しないことをお勧めします。
440 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:26:03 ] data.length Σ data[i] i=0
441 名前:デフォルトの名無しさん [2008/02/18(月) 09:36:09 ] ありがとうございます。分かりました!!! これからも勉強頑張っていきます!
442 名前:デフォルトの名無しさん [2008/02/18(月) 13:40:38 ] TreeMapでデータをソートしたのですが Entryで得たvalueとkeyをStringにキャストしてInteger.parseIntをつかってから int型にしてint型変数に格納しようとするとkeyだけキャストできないというエラーが出てしまいます 原因がわかりませんー・・・
443 名前:デフォルトの名無しさん [2008/02/18(月) 14:01:46 ] OSのタイムゾーン設定では日本時間なのに JavaのデフォルトタイムゾーンがGMTになっています。 デフォルトのタイムゾーンってどこをいじれば変更できるのでしょうか? 環境はJava1.6.0_04 Windows 2003 です。
444 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:06:03 ] >>442 コードを見せてみれ エラーメッセージも正確に
445 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:07:15 ] >>442 キャストできないエラーというのは、「Stringにキャストして」の部分なのでしょうか? 1.5以降ならジェネリクスをお勧めします。 原因としては TreeMap に格納する際に何型を使ったのか、が怪しいところです。
446 名前:442 [2008/02/18(月) 14:14:34 ] public class Sort { public Sortdata sort(Difference dif){ int i = 0; String change_sm = null; String change_play = null; Sortdata data = new Sortdata(); NumericComparator c = new NumericComparator(); TreeMap map = new TreeMap(c); while(i < dif.number){ change_sm = Integer.toString(dif.sm[i]); map.put(new Integer(dif.replay[i]), change_sm); i++; } Set s = map.entrySet(); i = 0; Iterator it=s.iterator(); while(it.hasNext()){ Map.Entry e = (Map.Entry) it.next(); change_sm = (String) e.getValue(); change_play =(String) e.getKey(); //getKeyだけキャストがおかしいというエラーがでる data.sm[i] = Integer.parseInt(change_sm); data.replay[i] = Integer.parseInt(change_play); System.out.println(data.sm[i]+":"+data.replay[i]); i++; } return data; } class NumericComparator implements Comparator { public int compare(Object o1, Object o2) { int result=((Integer)o1).compareTo((Integer)o2); if(result==0) result=1; return result; } } }
447 名前:442 [2008/02/18(月) 14:16:22 ] すいません初心者でコピペで作ったようなプログラムなのでどこを載せればいいのかわかりませんでしたTT エラーは Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Sort.sort(Sort.java:34) 行は書き込むときに編集してしまったので違うかもです change_play =(String) e.getKey(); //getKeyだけキャストがおかしいというエラーがでる とりあえず↑を指してます
448 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:21:41 ] そらだめだよ。 Integerで格納したんだから、Stringにはキャスト出来ない。
449 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:24:24 ] >>446 Mapにputするときはkeyの部分をInteger型で入れている。 Integer型なのにString型へキャストしようとするからエラーになる。
450 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:31:02 ] >>446 重ねてJ2SE1.5(5.0)以降ならジェネリクスをお勧めします。 ついでに autoboxing も機能するので更に見やすくなります。 > map.put(new Integer(dif.replay[i]), change_sm); key が Integer, value が String。そりゃ key でキャストエラーになります。 以下蛇足。 ・変数は使う直前で宣言すること。 ・元が int型なら Integer だけにしておけば良いのに。 ・初期化、比較、更新があるなら while ではなく for を使うように。 ・ついでに初期化部で int i = 0; で宣言すること。(添え字の使いまわしは厳禁)
451 名前:デフォルトの名無しさん [2008/02/18(月) 14:36:27 ] みなさんありがとうございます! ジェネリスクも試してみようと思います><
452 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:37:10 ] >>443 set | find "TZ" 結果はカラ?
453 名前:443 mailto:sage [2008/02/18(月) 14:45:46 ] >>452 レスありがとうございます。 TZ=JST とでます。
454 名前:デフォルトの名無しさん [2008/02/18(月) 15:37:48 ] ネイティブインターフェイスの使い方を教えてください
455 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:42:34 ] >ネイティブインターフェイス JNIのこと?
456 名前:デフォルトの名無しさん [2008/02/18(月) 15:55:04 ] はい
457 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:59:29 ] >>454 これでも読んどけ java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jni/spec/jniTOC.html
458 名前:デフォルトの名無しさん [2008/02/18(月) 16:05:55 ] dllの作り方教えてください
459 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:10:42 ] それはJavaじゃないよ
460 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:11:22 ] わからない問題があったので教えてください public class Test extends Thread{ private int i, j; public synchronized void run(){ for(int count = 0; count < 2; count++){ i++; j++; System.out.print("i=" + i + " : j=" + j + " "); } } public static void main(String[] args){ new Test().start(); new Test().start(); } } A. i=1:j=1 i=1:j=1 i=2:j=2 i=2:j=2 B. i=1:j=1 i=2:j=2 i=1:j=1 i=2:j=2 C. iとjの値は出力されるが表示順は一意ではない Testクラスは二つでき、runメソッドはそれぞれで動くため AにもBにもなりえる(実際は何回やってもBになるが)と思ってCにしたんですけど答えはBでした Aにはならないんでしょうか? 解説には「run()メソッドをsynchronized指定しているためrun()メソッド実行中は 他に制御が移ることなく処理されます」とあります
461 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:20:05 ] 答はCであってます。 printの後ろに、 try { Thread.sleep(1000); } catch (InterruptedException e) {} を追加して実行してみてください。
462 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:29:21 ] たぶんスレッドでの(i=1:j=1 i=2:j=2)の組の出力は保証されるということなのだろうけど、 どっちのスレッドかわからんよな、これ。 Aは間違い。でも、結果的に出力は必ずBになるなw
463 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:31:40 ] えー、保証すらされないだろ
464 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:33:05 ] >>461-462 ありがとうございます 安心しました
465 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:51:26 ] フルパスからファイル名を取り出す関数とかあれば 教えてください。 WinAPIのGetFullPathName()のようなやつがあれば・・・
466 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:53:02 ] File#getName()
467 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:54:52 ] >>466 快速的回答謝謝。
468 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:58:18 ] wikiのリンク切れてる・・・ だれか原因わかる人います?
469 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 17:05:24 ] リンク切れてるっつーか、ホスティングしてる wikiroom が 最近落ちまくり & ほったらかし & メール送っても無応答状態らしい。
470 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 17:07:32 ] >>469 レスサンクス! まじか…javacの設定方法探そうと思ったのに…
471 名前:デフォルトの名無しさん [2008/02/18(月) 18:15:45 ] lass Test { int m; int n; Test(int i,int j) { m=i; n=j; } Test(Test testC) { m= testC.m; n= testC.n; } int sum(int i,int j){ return m + n + i + j; } } public class sample38{ public static void main(String[] args); Test test = new Test(10, 5); test.m++; test.n++; Test test2 = new Test(test); System.out.println(test2.sum(2, 3)); } } このプログラムの中の Test(Test testC) { m= testC.m; n= testC.n; がある意味がよくわかりません。テキストを読んでいてもよく分からないので教えてください。
472 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:20:34 ] いわゆるコピーコンストラクタってやつ
473 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:25:06 ] コンストラクタのオーバーロードじゃね
474 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:27:44 ] Java 的には clone() だな。
475 名前:デフォルトの名無しさん [2008/02/18(月) 18:33:51 ] JNIはどうすんの
476 名前:デフォルトの名無しさん [2008/02/18(月) 18:35:42 ] >>471 です。処理はどんな手順で進んでいくのですか?
477 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:58:35 ] どこまでわかるのか書け
478 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:08:06 ] オブジェクトはフィールド、メソッド、クラス、を持つとよく聞きますが、実際にオブジェクトを生成する際、フィールド以外の物も新たに作るのでしょうか? それとも状態を持つのはフィールドだけなのでメモリにはフィールドのみを生成するのでしょうか?
479 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:13:44 ] フィールドのみと考えていい
480 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:13:48 ] クラスとメソッドはほぼ一体。最初にクラスを参照したときにメモリ上に現れ static 宣言 されたフィールドとメソッドを持つ。非 static フィールドはインスタンスごとに作成される。
481 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:16:33 ] >>479 ,>>480 素早く分かりやすい回答ありがとうございました。 ずっと気になっていたことだったので本当にすっきりしました。
482 名前:デフォルトの名無しさん [2008/02/18(月) 19:23:08 ] >>477 Test test = new Test(10,5); これを上の Test(int i,int j) { m=i; n=j; に入れて、つぎにmとnに1を足すまでは分かる。 Test(Test testC) { m= testC.m; n= testC.n; これどんな処理してるん?
483 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:28:09 ] testCに渡された既存のTestオブジェクトの中身を 新しく作ろうとしてるTestオブジェクトにコピーしてる
484 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:35:35 ] Javaのコントロールパネルの出し方教えてくれ どこにもなくて困ってる
485 名前:デフォルトの名無しさん [2008/02/18(月) 19:36:35 ] test
486 名前:デフォルトの名無しさん [2008/02/18(月) 19:37:48 ] どういうときにコピーコンストラクタは使うの?
487 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:09:37 ] オブジェクトをコピーしたいとき
488 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:14:13 ] 必要なクラスやライブラリが増えるとクラスパスの設定が面倒になりますが、 自分が書いたソースのクラスファイルを格納してるフォルダに全て突っ込んじゃえばいいと思うんですが、 この考え方は間違ってますか? 例えばDBのJDBCドライバを使うにはCLASSPASSに追加するかtomcatのcommon/binに入れたりするけど 前者の場合、無関係なプログラムにも影響を及ぼすし、後者の場合はコンテナを変えたらまた作業が増える。 自分が作ってるサーブレットのクラスファイルを保存してる場所にJDBCドライバを入れちゃえば全て解決な気がする。
489 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:23:03 ] Javaのアルゴリズム本はどれがオススメですか?
490 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:36:42 ] >488 間違ってる クラスが増えれば増えるほどクラスパスの設定の方が、クラスの競合とかの考慮より楽になる そんなことよりIDE使っているなら面倒な作業にはならんだろ
491 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:41:45 ] プリミティブ型も実はクラスある? 判別のために例外的に形だけあるってことかな int.classやらがあって驚いたわ。
492 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:47:16 ] Integer.TYPE
493 名前:デフォルトの名無しさん [2008/02/18(月) 23:14:44 ] bolean b; b=true; ?ここを教えてください。 (b==false)が新になる。 bolean b; b=false; ?ここを教えてください。 (b==true)が新になる。
494 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:17:06 ] b=!b;
495 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:24:17 ] boolean
496 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:06:22 ] >>491 プリミティブ型はあくまでプリミティブ型で、そのクラスといったものはない。 あるのは、プリミティブ型を表すClassクラスのインスタンスで、各ラッパークラスで定義されている。 例えば、リフレクションAPIでメソッドの引数の型を指定する時などに使ったりする。
497 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:18:57 ] 初心者用スレとはいえ質が低過ぎる 答える気すら起きん
498 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 08:17:12 ] 画像ファイルを手動で振り分ける簡単なソフトを書いた。 表示して、設定してあるフォルダに振り分けるだけの簡単なソフトだ。 とりあえず、予定の作業は出来るようになった。 だが、アニメーションGIFの再生がおかしいことに気づいた。 「透過色」というのが上手く扱えていないようだ。 Toolkit.getDefaultToolkit().getImage("hoge.gif");で入手したImageを JPanelから導出したクラスのpaint(Graphics g)でdrawImageにかけているだけなのだが、 何か足りないようだ。 足りない部分は簡単に補える? それとも、意外に面倒?
499 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 08:29:49 ] ペイントコンポーネンツ
500 名前:デフォルトの名無しさん [2008/02/19(火) 12:26:35 ] JSFの使い方を教えてください
501 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:44:08 ] >>500 ja.wikipedia.org/wiki/F-35_ (%E6%88%A6%E9%97%98%E6%A9%9F)
502 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 15:50:00 ] すみませんが、質問です。 クラス継承についてですが、親クラス、子クラスに共通して、同名のパブリッ クなインスタンス変数があり、その初期値は親と子で違うとします。 子クラスのインスタンスを作り、それを親クラスの型の変数に代入した場合、 その変数のインスタンス変数には、親の価が入っています。 public class Parent { public String hoge = "親"; } public class Child extends Parent { public String hoge = "子"; } Parent x = new Child(); System.out.println(x.hoge); // => 親 System.out.println((new Child()).hoge); // => 子 要するに、パブリックなインスタンス変数は、子によってオーバライドできな いのです。メソッドと違って。 どうしてこれは、こういう言語仕様になっているのでしょうか? メソッドのようにオーバライドできてもいいと私は思うのですが。
503 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:18:57 ] どうしてだろう・・・ Parent[] xArray = { new Child01(), new Child02(), new Child03()} for( Parent x : xArray ) System.out.println(x.hoge); みたいに同じ変数名にアクセスして子独自の値が取れたら便利そうだよね。
504 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:21:48 ] 実装は面倒だし(というか汚くなる)、効率の問題もある。 何より、変数をそんなに便利(に見える)にしてしまったら、 マルチスレッドとか大変になる。 オブジェクト指向の原則も何もあったもんじゃなくなるだろうが。
505 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:24:14 ] >>502 子の方に新しいhogeを定義しなきゃいいんじゃ? public class Parent { public String hoge = "親"; } public class Child extends Parent { public Child(){ hoge ="子"; } } Parent x = new Child(); System.out.println(x.hoge); // => 子
506 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:24:37 ] フィールドの隠蔽は普通に出来てるんだから面倒も効率も関係ないだろ。
507 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:25:24 ] Javaはフィールドは静的解決だからだろ 以上
508 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:28:02 ] >>502 言語規定には、「フィールドアクセスのために動的に表検索する必要がないので Javaは素直な実装でも効率が良い。遅延束縛と上書きはインスタンスメソッドが 使用されるときだけJavaで利用可能となる。」とある。 ttp://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#37055
509 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:29:50 ] 付いていけん 馬鹿にも分かるように誰か説明してくれよ
510 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:31:04 ] フィールドは静的に(つまりコンパイル時に)解決できるから効率いいよね、ってこと。 >>506 は何か勘違いしているから無視してOK
511 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:32:28 ] スレッドとか関係ねーじゃん。
512 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:34:33 ] フィールドアクセスにはsynchronizedで制限かけられないだろーが
513 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:36:19 ] つまり静的解決にすれば効率いいけど柔軟性に欠ける 動的にすれば柔軟性は上がるが実行時の効率が落ちる そこでバランス取ってメソッドだけ動的にしたってこと?