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 あたりで。
756 名前:デフォルトの名無しさん [2008/02/24(日) 23:40:36 ] Javaの勉強始めました。 アクセス就職子protectedについて理解が足りないので教えてください。 protectedつけることで、 『自分のクラス内のメソッド 又は 継承されたサブクラス内のメソッドからしかアクセスできない』 そのように直感的に感じたのですが、 間違っているようで。 public class Purotekuto { public static void main(String[] args) { Test21 hogehoge = new Test21(); System.out.println( "値を出力:" + hogehoge.protectedInteger ); }} public class Test21 { protected int protectedInteger; Test21() { this.protectedInteger = 0; } public void setValue( int value ) { this.protectedInteger = value; } public int getValue( int value ) { return this.protectedInteger; }} このコードでは、main()から、クラスTest21のメンバ、protectedIntegerにアクセスできずに、 エラーか何かになると思ったのですが、普通に動きました。 自分の考えの何がまずいのでしょうか。。。
757 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 23:45:28 ] >754 super.clone() を使うかどうかは状況次第じゃね? というか、普通はsuper.clone()は使えない方が多いと思う。 帰ってくるのはParentクラスのインスタンスだから、結局は値をコピーしなければならなくなるから。
758 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 23:46:09 ] >>754 何のための継承、何のためのオーバーライド。 何がスマートじゃないんだ。感覚的に言われてもな。 ちなみに、cloneを使うなら、Cloneable を implements すること。 // 詳しくは Clonable, Object.clone 参照。 >>756 同じパッケージからもアクセスできるから。以上。
759 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 23:47:23 ] >756 もう1つ条件があって、「同一パッケージ内からのアクセス」もOK
760 名前:756 [2008/02/25(月) 00:01:54 ] 758,759 ありがとうございます。 指摘を受けて調べました。 パッケージ化しないことには、ソースはばらばらのパッケージ的な扱いと、勝手に勘違いしていました。 デフォルトのパッケージ、という扱いになるのですね。 勉強になりました。
761 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 00:09:47 ] と言うかデフォルトパッケージの使用は避けてくれ。
762 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 00:11:27 ] >>757-758 ありがとうございます。 ちょっと理解できてきました。
763 名前:756,760 mailto:sage [2008/02/25(月) 00:18:14 ] >761 というと、必ず特定のパッケージに入れることを明示することが望ましいということでしょうか。 自分今回痛い目にあったので、761の指示に従って付いてまいりますが。
764 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 00:48:09 ] >>763 デフォルトパッケージ以外のパッケージに属するクラスから 一切呼び出しが出来ない。(JDK 1.4 以降) プログラミングの一般論としても 何らかの名前空間に所属させるのは 良い習慣だと思う。
765 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 01:00:16 ] >>754 普通はコピーコンストラクタを作る Cloneable は Java の失敗作とジョシュアっちが言ってました
766 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 04:11:37 ] これからjavaを学ぼうと考えています。 JAVAのSDK沢山種類があるようですが、 どれを使用すれば良いでしょうか?
767 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 04:28:17 ] >>766 多分新しいのを使っとけばいいんじゃないだろうか
768 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 04:54:25 ] 使う方のソースはそれで良いけど宣言する方のソースはアノテーション必要でしょ。
769 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 04:55:33 ] ↑誤爆
770 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 07:44:10 ] SE(スタンダードエディション)でおk
771 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 08:40:00 ] >>733 \→\\ それと、カレントドライブの変更まではcdで出来ないけど、 その辺は大丈夫かな?
772 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 09:14:34 ] Timestamp型の変数から"yyyy/MM/dd"といった形の文字列で 値を取り出すにはどうしたらよいでしょうか?
773 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 09:34:57 ] String s = new SimpleDateFormat("yyyy/MM/dd").format(timestamp);
774 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 09:37:02 ] >>772 SimpleDateFormat("yyyy/MM/dd")でformatすれば?
775 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 09:44:18 ] 質問です。 シングルトンを多数作りたいんですが、 private static Singleton instance = new Singleton(); public Singleton getInstance(){return instance;} private Singleton(){} といったおきまりパターンを各クラスに書かないと行けませんが面倒です AbstractSingletonを継承したらgetInstance()で各シングルトンのインスタンスが取れるようになる みたいな事ができれば便利ですけど、staticフィールドなのでそれもママなりません。 なんか旨い方法はありませんか?
776 名前:デフォルトの名無しさん [2008/02/25(月) 09:49:44 ] ド素人質問ですみません;; テキストフィールドに入力された文字列を ボタンが押されたときに変数com_defに入力する プログラムを作りたいのですが、 下のようにやるとローカル変数 i は内部クラスからアクセスされます。final で宣言される必要があります。 とエラーが出ます。 対処法を教えてください。よろしくお願いします。 text[i] = new JTextField("",2); button1[i] = new JButton("変更"); button1[i].addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int com_def = Integer.parseInt(text[i].getText()); System.out.println(""+com_def); } });
777 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 10:01:15 ] >>773 , 774 ありがとうございます。 できました。
778 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 10:11:39 ] >>775 eclipse ならテンプレートを使って、少し楽が出来る。下のほうに例がある。 ttp://www.eclipsewiki.net/eclipse/index.php?%A5%C6%A5%F3%A5%D7%A5%EC%A1%BC%A5%C8 >>776 メソッドとその内部クラスとで共用で使う変数は、メソッド内 final として、コンパイルを通す。 他にも方法はあると思うけど、それ以上なら、クラス内クラスにしてちゃんと定義しましょ。
779 名前:デフォルトの名無しさん [2008/02/25(月) 16:41:22 ] String s = "ab" + \r + "cd" + \n + "ef"; 正しく直してください。
780 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 16:43:38 ] String s = "ab\rcd\nef"; 直しました。
781 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 16:43:54 ] String s = "ab\rcd\nef";
782 名前:781 mailto:sage [2008/02/25(月) 16:44:30 ] かぶった...orz
783 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 16:46:12 ] 780,781 ありがとうございます。
784 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 16:47:23 ] qa3808666 かぶってる...
785 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:24:32 ] それはかぶってるんじゃなくてマルチポストだろう…
786 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:47:04 ] tomcatのjsp-examplesにあるFORM認証のサンプルについて質問です。 まず操作を1->5の順で行った結果を書きます。 1.hostname:port/jsp-examples/security/protected/index.jsp にアクセスするとFORM認証機能が働きlogin.jspが表示される。 2.login.jsp -> Username/Passwordを間違えて入力->error.jspが表示される。 3.error.jsp -> "try again"をクリック -> login.jspが表示される。 4.login.jsp -> Username/Passwordを正しく入力 -> login.jspが再表示される。 5.login.jsp -> Username/Passwordを正しく入力 -> HTTPステータス 404 - /jsp-examples/security/protected/j_security_check 4でUsername/Passwordを正しく入力しているので1のindex.jspに飛ぶことを期待したのですが、login.jspが再表示されました。 login.jspの出力内容がブラウザに表示された時に、ソースを表示してみると □2のlogin.jsp <form method="POST" action='j_security_check;jsessionid=74394043647C95BAC48CC67ECDFFEFB7' > □4のlogin.jsp <form method="POST" action='j_security_check' > 比較してみると、4のソースではセッションIDが付加されていない為に、本来の遷移先のURLを見失ってしまっている、ということでしょうか? jspソースファイルを見ると、login.jspもerror.jspもresponse.encodeURL()の結果をセットしていました。 login.jspのリクエスト箇所 <form method="POST" action='<%= response.encodeURL("j_security_check") %>' > error.jspからlogin.jspを表示するリンク箇所 <a href='<%= response.encodeURL("login.jsp") %>'>again</a>. 今のままだとerror.jspからブラウザの戻るボタンで前画面(login.jsp)に戻らないと、認証後に期待したURLへ遷移してくれません。 error.jspにあるアンカータグでlogin.jspに戻った時も同じ動きにさせたいのですが、どのように修正すれば対応できるでしょうか?
787 名前:786 mailto:sage [2008/02/25(月) 17:51:39 ] 携帯のブラウザでも見るので「JavaScriptは使わない」という前提でお願いします。
788 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:37:01 ] 自作のある圧縮アーカイブの解凍ストリームを作ろうと思っています。 その圧縮形式はライブラリを持っており、InflaterInputStreamを利用すると比較的に楽に実現できると考えたのですが、 read()やread(byte[],int,int)など、いずれにせよユーザーが決めるバッファのサイズで解凍を行う必要があるため、今回のような解凍する側で単一バイト読み込み時に出力されるデータを決めるライブラリを持った圧縮形式ではどのように行うべきなのか分かりません。 解凍したデータもバッファリングして、ユーザーのサイズに合わせて出力すれば実現はできると思うのですが、何か他にいい方法はないものかと思い質問しました。 Inflaterのソースも読んでみたのですが、肝心の部分はnativeメソッドになっており結局どのような実装なのか分かりませんでした。良い方法がございましたら教えてください。
789 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:24:42 ] >>788 >解凍したデータもバッファリングして、ユーザーのサイズに合わせて出力すれば実現はできると思うのですが それしかないのでは・・・ 1バイトだけ返すread()を実装すればあとはデフォルトの実装があるので、 class MyInputStream extends InputStream { private byte[] buf; private int pos, size; public int read() throws IOException { if (pos == size) { // 解凍データをbufに詰めてsizeをセット pos = 0; } return buf[pos++]; } } これだけでも一応動くよ InflaterInputStreamをどう利用しようとしてるのかよくわからんが、あれはzlibストリーム専用
790 名前:789 mailto:sage [2008/02/25(月) 19:27:03 ] ×return buf[pos++]; ○return buf[pos++] & 255; でした・・・
791 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:59:08 ] >>775 邪道かもしれんが。 なんか旨い方法、ということなら。 Enum の中に書く定数は1つ1つがシングルトンだ。 全定数に共通のメソッドも振る舞いが異なるメソッドも実装できるぞ。
792 名前:ちんこ ◆GbXlaaQNk. mailto:sage [2008/02/25(月) 21:04:53 ] Javaにはプリミティブと参照が混在しています。 Listなどを使う時には参照型しか使えないのですが、 いっそすべてのintをIntegerに書き換えた方がいいでしょうか? プリミティブ型の扱いをみなさんどうしていますか? おれはRubyからJavaに来たので数字が参照型じゃないというのに すごく違和感を感じます。ましてや混在しているというのは非常事態です。 今すごく悩んでいます。 みなさんがどうしているかを知りたいです。
793 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:09:13 ] >>789 ネットに繋がらなくて返事が遅くなってしまいました。 聞いていた立場で申し訳ないです。 Inflaterを利用しようと思ったのは、形式に共通点が多く、いくつかをオーバーライドすればできそうな気がしたためです。 確かに本来の用途から外れますので使用すべきではありませんね。 やはりバッファかますことにします。 親切にどうもありがとうございました。
794 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:10:35 ] >>792 せっかくプリミティブ型があるのにわざわざオブジェクトにする必要はないと思います。 コストの問題ももちろんですが、何より扱いにくいです。
795 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:18:04 ] >>792 Integer って、オブジェクトだとは言っても、中のデータを書き換えられないから不便だよ。 List などには int を入れても auto boxing されるんだから、int のままでいいんじゃないかなあ。 みなさんがどうしているか、に関しては、「気にしていない」だと思う。
796 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:18:13 ] >>792 そういう言語だから受け入れるしかない Rubyは理想を重視した分遅くなってるし C#はプリミティブ型の扱いを変えて両立させてるけどその分複雑になってたりする
797 名前:デフォルトの名無しさん [2008/02/25(月) 21:42:46 ] Strint[] a = {"A","B"}; aの要素数を1にするtruncateみたいなものはありませんか?
798 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:54:32 ] 配列じゃなくてリストじゃ駄目なん?
799 名前:デフォルトの名無しさん [2008/02/25(月) 22:01:35 ] >>798 Strint[] a; という配列でやりたいです。 Strint[] a = {"A","B"}; ここで処理して"A"が不要だと分かって、 a = {"B"}; とすればよいのでしょうか? 以前のaはa = {"B"};する直前にガベコされるのでしょうか? それとも内部でtruncateみたいなことされて、aのアドレスは変わらないのでしょうか?
800 名前:ちんこ ◆GbXlaaQNk. mailto:sage [2008/02/25(月) 22:04:44 ] >>795 配列のautoBoxingがないです。 例えば void methodA(int a) にInteger型を放り込んだらこれはBoxingされますが、 void methodB(int[] a) にInteger[]型を放り込むのはエラーになります。 配列からListを作る時にも参照型が強制されるので不利かと思いました。 (例えばArrayList<int>はエラーになる) >>796 JRubyもダメでしょうか?(速度に関して)
801 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:05:33 ] >>799 a = {"B"}; でよい。{"A","B"}はGCまかせ。 ちなみにGCは、不要になったら即実行される訳じゃないよ。
802 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:09:09 ] >>801 ありがとうございます。ガベコに任せます。
803 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:09:22 ] >>801 それ、初期代入でしかできないんじゃね?
804 名前:デフォルトの名無しさん [2008/02/25(月) 22:12:12 ] >>803 そうでした。 Strint[] a; という配列でやりたいです。 Strint[] a = {"A","B"}; ここで処理して"A"が不要だと分かって、 Strint[] aTemp = {"B"}; のように、もう1つ変数が必要ですか?
805 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:16:45 ] aTempの要素数はどうするの? ArrayListを作って必要な要素だけ追加していって後で配列に変換したほうが早い 配列でやるにしてもどうせ同じようなことを自分でやることになる
806 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:17:13 ] String[] a = {"A", "B"}; a = new String[1]; a[0] = "B"; でよくね?
807 名前:798, 803, 806 mailto:sage [2008/02/25(月) 22:18:52 ] >>805 んだなぁ。 ArrayList<String> a = new ArrayList<String>(); a.add("A"); a.add("B"); a.remove(0); とかでいいと思った。
808 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:25:09 ] >>806 そうできるんですね。ありがとうございます。 >>807 STLってまだよく分からないんです。でもありがとうございました。
809 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:27:18 ] STLw それはおいといて,>>806 でいいんだったら String[] a = { "B" }; と全く変わらないよ
810 名前:798, 803, 806 mailto:sage [2008/02/25(月) 22:28:13 ] STLはC++のライブラリのことじゃねーの?w ちなみに配列への変換は String[] array = a.toArray(new String[a.size()]); でいいと思う
811 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:51:19 ] >>807 配列モドキとコレクション List<String> list = Arrays.asList("A", "B"); System.out.println(list); list = ArrayList<String>(list); // 編集可能化 list.remove(0); System.out.println(list);
812 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:57:41 ] >>808 おまいは勘違いしてる。Javaの配列はサイズを変更(Cで言うところのrealloc)出来ない。 配列限定で長さを変えるには、新しい別の配列を作ってコピーするしかない。 今まで挙がってた例は全て新しい別の配列を作っているだけ。 長さが変わる場合、通常はArrayList等のList系のコレクションを使い、 どうしても配列が必要な場面でだけtoArray()で変換する。
813 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:07:52 ] >>800 配列は既にオブジェクト(変数には参照が収められる)だから、auto Boxing はいらないし、 List にも add できる。 int[] を要求している所に Integer[] を放り込むとエラーになるのは型が違うから。 放り込めることを期待するのは int に対応するのが Integer、int[] に対応するのが Integer[] という感覚があるからだろうが、 この4つの中で、int だけがプリミティブ、Integer だけが値変更が不便なので、 Integer は int をオブジェクトにするためだけにある特別な存在で、 対称性はあまり無い、と考えた方がいい。
814 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:30:24 ] >812 変更不可なgetterで結構toArray使わんか?
815 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:32:42 ] 一件教えてください。 main()の中で記述していた処理を、 ほかのファイルの関数に移動したいのですが、どのようにすればよいかわからず、教えてほしいです。 (サブルーチンで処理をするような考え方で。) c言語で言えば、 main(){ 一連の処理のまとまり1 一連の処理のまとまり2 } となっていたものを main(){ func1(渡す必要のある変数) 一連の処理のまとまり2 } func1(引数){ 一連の処理のまとまり1の代替 必要があればreturn文 } といった感じ(型とか細かいことは別として。)に分割したいのですが。 今の自分の知識では、クラスを作って、メソッドを作って、 メソッドをインスタンス化して、 仮にインスタンスが設定された変数の名前がaaaとしたら、 aaa.メソッド(引数) とするくらいしか、頭が回りません。 メソッドを利用したいだけで、インスタンス化が必要なのか疑問で、やりかたがあるような気がしまして。 よろしくお願いします。
816 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:39:52 ] >>815 別クラスにする必要がないのなら、別クラスにしなくていいんじゃない? mainのほかにクラスメソッド書けばよい。 他からも使いたいけど、インスタンスを作る意味がないのなら、ユーティリティクラスという手もある。 java.lang.Mathみたいなクラス。メソッドは全て、クラスメソッドとして定義する。
817 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:45:00 ] >>815 >メソッドを利用したいだけで、インスタンス化が必要なのか オブジェクト指向の世界では必要だという前提なんだよ 原則としてすべてのメソッドはどっかのクラスに属していて、インスタンスを介して使用する事が基本 逆に言えばクラスに属するけど、インスタンスを介さないmainメソッドの方が特殊 慣れるまで、メリットを感じるまでは解らんと思うが、最初はそういう世界と思うしかない
818 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:47:04 ] >>815 メソッドはいくら分割してもメソッドだ。 その例だとオブジェクトになるのは (渡す必要のある変数) ってやつだけだな。 main() で 渡す必要のある変数の型 obj = new 渡す必要のある変数の型(); して、 obj.func1()
819 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:47:46 ] >>809 Strint[] a = {"A","B"}; ここで処理して"A"が不要だと分かって、 Strint[] a = {"B"}; ↑aが2重定義になるので>>806 の方法にしました。
820 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:49:18 ] >>815 // メインクラス(Main.java) public class Main { public static void main(String[] args){ Sample.func(); } } // サブルーチンクラス(Sample.java) public class Sample { public static void func(){ // ↑staticでメソッドを宣言すれば<クラス名>.<メソッド名>でアクセスできる。 System.out.println("Hello, world!"); } }
821 名前:815 mailto:sage [2008/02/25(月) 23:49:35 ] 815です。 レスありがとうございます、816,817。 >クラスメソッド(816) クラスメソッドの概念を知りませんでした。ありがとうございます。 >オブジェクト指向の世界では必要だという前提なんだよ(817) その考えを理解できるように努力していきます。 指摘ありがとうございます。
822 名前:815 mailto:sage [2008/02/25(月) 23:51:52 ] >820 レスポンス記述している最中に更新されたようで、失礼しました。 816のおっしゃる、クラスメソッドの具体例ですね。 わかりやすい説明ありがとうございます。
823 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:51:53 ] >>815 >ほかのファイルの関数に移動したい >サブルーチンで処理をするような考え方で >メソッドを利用したいだけで インスタンス化したくないなら当然インスタンス化は不要だ。
824 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:58:44 ] >>815 他の方が指摘してらっしゃるように、 メソッドは、必ずしもオブジェクトに関連付ける必要はありません。 蛇足。Javaでは「他のファイルに記述する」という概念はありません。 あくまでも、クラスを分けるかどうか、です。 それゆえか、クラス内クラスである内部クラスが4種類あります。
825 名前:ちんこ ◆GbXlaaQNk. mailto:sage [2008/02/26(火) 00:30:07 ] JRubyやってみようと思う。
826 名前:815 mailto:sage [2008/02/26(火) 00:32:49 ] 815です。 821内の『>818』は『>820』の間違いですね。失礼しました。 >818 今コーディングして確認しました。 クラスメソッドを直接呼び出すか、 通常に、通常のメソッドをインスタンス化して呼び出すかですね。 >823 >インスタンス化したくないなら当然インスタンス化は不要だ。 いま確認とりたいと思いコーディングしてみたのですが、 ほかの方が示された用にstaticにするほかに方法あるのでしょうか。 staticなメソッドにするか、インスタンス化するか以外で試せませんでした。 staticにすることをおっしゃっているのでしょうか。(私の821,822のように時間差?) >824 内部クラス。理解できるよう精進します。Tipありがとうございます。 自分の質問に対して、 816の考え方、817の考え方、の二種類の意見を持つ方に分かれるように感じました。 オブジェクト化するべきとの考えと、ユーティリティメソッドでいいのではという考えと、です。 このどちらを選ぶかは、個人やGrの考え方次第ということなのでしょうか? それとも、オブジェクト指向的には後者の方が、望ましいが、面倒な手続きは好まれないので、前者が使われるということなのでしょうか。
827 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:42:12 ] >>826 おおざっぱには、 ・データが主体ならオブジェクトにする。 ・ロジックが主体ならクラスメソッドにする。 くらいで良いのではないかと思ってる。(無論例外は山ほどある)
828 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:50:08 ] こんばんわ。 eclipse使いはじめたのですが、eclipseに指摘されるエラーの意味がわからないので教えてください。 たとえば、まさに820のコードを、 eclipseでひとつのファイルに記述すると、 クラスSampleを別のファイルに書けといわれます。 Javaのルールなのでしょうか。 どういった原因なのか教えてください。 eclipse特有で指摘されるものなのでしょうか?
829 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:51:19 ] >>826 何を作っているのかによる。 なんらかの概念(伝票・取引みたいな業務概念や、ファイル・ウィンドウのようなシステム概念)の、 特定のひとつに対する操作であれば、インスタンスメソッドとすることが望ましい。 逆に、概念に属する全ての対象に対する操作や、そもそもその対象を作り出す操作などはクラスメソッドになる。 ただし、実際にはクラスという概念とは関連づかない操作もあり、 Javaの場合は全てのメソッドがクラスに定義されなければならないため、便宜的にクラスメソッドとする。
830 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:52:53 ] >>828 Javaのルール。 publicのクラスはファイル名=クラス名としなければならない。 なので、自動的にひとつのファイルにはpublicクラスは一つまでしか定義できない。
831 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:58:39 ] >>828 830 の通り、Javaの仕様です。 public を外すか、クラス内クラスにするか、 一応、一つのファイルに複数のクラスを記述する方法はあります。
832 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 01:03:07 ] 828です。 830氏、831氏、すばやい回答ありがとうございます。 勉強になりました。 publicがキーワードでしたか。
833 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 01:21:48 ] アクセス修飾子について説明もらえませんか。 アクセス修飾子には、public, protected, privateがあり、 アクセス制御の範囲としては、上記3つのほかに、修飾なしを含めた4つがあるようです。 で、最後の修飾なしなのですが、 実際に仕事でのプログラミングや、アプリケーションの作成で、使用されるのでしょうか。 範囲が修飾ありの3つと異なるのですが、何も記述しないというのが、どうにも好きになれないみたいな。 基本的に、何らかの修飾をしましょうということは無いですか?
834 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 01:31:30 ] >>833 たしかに気持ち悪いが、そう決まってる以上、そういうもんだと思うしかない。 使う場面はときどきあるよ。 トップレベルクラスは、publicにしたくなければ、他に選択肢もないし・・・
835 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 01:40:22 ] >>833 クラスは良くパッケージデフォルトにするなぁ。 パッケージをコンポーネントと見立てて、publicがインタフェースでパッケージデフォルトが実装の詳細。 メソッドやフィールドではあまり使ったことないや。
836 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 01:55:23 ] はじめて手に入れたIDEがeclipseで今までCとWinSDKをエディタで何とかしようと苦労してたのが嘘みたいに GUIなアプリケーションがさくさく書けてJavaマンセーな状態なのですが、 そろそろ他の言語ってかC++で同等の事ができるようになりたいと思い始めてます。 そんなぼくにお勧めのC++用のIDEを教えてくれませんか? eclipseみたいにCtrl+spaceなどでガンガン補完できるようなやつで、 リファクタリングが強力なやつがよいです。 (若干スレ違い?)
837 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:09:29 ] >>836 全くスレ違い CDT
838 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:46:20 ] >>833 派生先からだけ見えて欲しい時は多数あるけど パッケージ内からだけ見えて欲しい時がないので デフォルトスコープを使う機会がない。 継承・実装の階層とパッケージ階層とは全く別個のものなのに 1系統の修飾子で片付けようとしたのに無理がある。 パッケージ階層は無視するか2系統用意して組み合わせ可能にしたら良かったのに。 C#(.NET?) だと名前空間は無視するかわりに、 アセンブリ境界に対して internal で制限するかどうかを選べる。
839 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 03:20:53 ] >>833 そこそこ可視性があるが、言語的に最後の砦であるパッケージの境界でカプセル化してセーフ というのがパッケージプライベートなので、とりあえず書いてみる的に使うのは、ちょうどよいのかと。 そして、とりあえず書いてみるレベルだったら、 何も修飾子を書かなくてもええじゃないか、のような乗りかと。 なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。
840 名前:833 mailto:sage [2008/02/26(火) 03:45:25 ] 833です。 返信にただいた内容を元に、学習します。 >839 >なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。 この点について、初心者向けの説明をいただけませんか。 時間かけると理解が進む資料の場所もみつかるのでしょうが。
841 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 07:01:30 ] >>819 a = new String[]{"B"};
842 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 08:12:42 ] >言語的に最後の砦であるパッケージの境界でカプセル化 JDK7になったらスーパーパッケージが出来るんだけどねぇ。 JDK7は本当に完成するんだろうか。
843 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 10:47:38 ] >>841 ありがとうございます。それにしました。
844 名前:デフォルトの名無しさん [2008/02/26(火) 17:19:58 ] 出力を行うときに何でoutputstreamwriterを使わなければいけないのですか? テキストでこの章に入るまではこれを使わなくても出力できていたわけ ですから。
845 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:22:42 ] 好きなものを使えばいいんじゃない?
846 名前:デフォルトの名無しさん [2008/02/26(火) 17:25:51 ] ストリームの意味が分からん
847 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:24:48 ] >>846 ベルトコンベアみたいなものを思い浮かべろ そこに物(データ)を置くと、それはどこかに流れていく それが出力ストリームのイメージ (streamは流れという意味) どこに流れていくかは、それがどんなストリームかによる 例えば FileOutputStream だったら、ファイルに書き込まれる System.out だったら、標準出力に行く ソケットだったらネットワーク上に送信されていく 出力先が何であるにせよ、そこにデータを書き込むというのは同じ そういった、何かしらのデータの書き込み口というものを抽象化したのが、出力ストリーム >>844 別にOutputStreamWriterを使わなければならないことはない 出力を行う方法は他にもいくつかあるが、 そのテキストでは単にそのうちのひとつを紹介してるだけだろう
848 名前:デフォルトの名無しさん [2008/02/26(火) 18:42:43 ] >>847 分かりやすいな説明ありがと!!!
849 名前:デフォルトの名無しさん [2008/02/26(火) 18:51:52 ] 一通りテキスト終わったら、トレーニング用のテキスト売ってるんだけど それ買ってやったほうがいいかな? てか、なんかJAVAの勉強しても何か実感わかないな〜 やっぱ実際にもの作らんとそういうのは分からないものなのか?
850 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:59:39 ] >>849 どんなテキストか知らないけど ウィンドウ開いたりボタン押したり絵を出したりといったGUIをやると 実感をわかせるのに効果的だと思う
851 名前:デフォルトの名無しさん [2008/02/26(火) 19:07:46 ] ほうほう
852 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 19:13:33 ] >>849 何か自分で作ってみたいものはないの? 目標を決めるといいかもよ
853 名前:デフォルトの名無しさん [2008/02/26(火) 20:41:10 ] 今高校3年生だから、専門学校へ行ったときの予習をしてるんだ。 javaでどんなの作れる?とりあえず簡単なものを作ってみたい。
854 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 20:42:27 ] どんなものでも
855 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 20:44:02 ] そんなことよりもう一年勉強した方が
856 名前:ibj [2008/02/26(火) 20:55:19 ] 以下のソースコードで alice1 == alice2:true alice1 == alice3:false Chapter5.Employee[name = null, salary = 75000.0, hireDay = Tue Dec 15 00:00:00 JST 1987] Exception in thread "main" java.lang.NullPointerException at Chapter5.Employee.equals(Employee.java:48) at Chapter5.EqualsTest.main(EqualsTest.java:17) と ぬるぽが出てしまいます。 2時間ほど考えたのですが原因がわかりません・・・。super(name)の部分で どうにかなっていると思うのですがロジック的に正しいと思うのですが・・・。 教えていただけたら幸いです。