今日と明日でJAVAを軽く覚えたい
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/08/10(金) 17:28:44・ポリモーフィズム ・クラスとインスタンス
・パッケージ ・継承
・カプセル化 . ・コンストラクタ
・オーバロード ・オーバライド
・インタフェース
実際にプログラミングしながら覚えて行きたいです。暇な人はご教授お願いします
00021 ◆J7d5GFTy3.
2007/08/10(金) 17:30:32プログラム経験はC言語を少々。少々っていうよりも中々かな。
オブジェクト指向の概念は少し分かってるようで実はあまり分かってないです。
とりあえず何か課題下さい。
00031 ◆J7d5GFTy3.
2007/08/10(金) 17:35:56HelloWorldです。
ここらへんは昨日ちょっと手をつけたので割とすらりと・・・
class MyJava {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
0004デフォルトの名無しさん
2007/08/10(金) 17:40:20C言語も中々わからないのか
Cの
関数ポインタ
共用体
マクロ
は理解してるのか?
クソスレたてるな
00051 ◆J7d5GFTy3.
2007/08/10(金) 17:44:10ポインタは理解してます。関数ポインタ?ってのは初耳です。
ただ、JAVAにはポインタの概念はないとか聞きましたが。
マクロは理解してます。共用体も初耳です。
とりあえず院試が近くて、オブジェクト指向の問題が出るのですが、
今日明日でそれを解く事が出来るレベルまで行きたいと思ってます。
00061 ◆J7d5GFTy3.
2007/08/10(金) 17:47:13書いてあるソースを書いて今実行してます。
//myJava.java
class MyJava {
public static void main(String[] args) {
Person nakamura = new Person();
nakamura.myNameis();
nakamura.name = "中居君";
nakamura.myNameis();
}
}
//Person.java
class Person {
String name;
Person() {
name = "木村拓哉";
}
void myNameis() {
System.out.println(this.name);
}
}
00074
2007/08/10(金) 17:50:47関数ポインタも共用体も初耳ですかそうですか
0008デフォルトの名無しさん
2007/08/10(金) 17:52:59Javaユーザをなめきってるな。
00091 ◆J7d5GFTy3.
2007/08/10(金) 17:56:17#defineとかのですよね・・・?
C言語は結構基本的なところを理解してない可能性が高いです。
今まで作ったものは、マインスイーパーとかチャットとか・・・です。
とりあえずJAVAをコンパイルする時に、コマンドプロンプト立ち上げて、ディレクトリ移動して、
うんたらかんたらするのが面倒なので、ダブルクリックでJAVAをコンパイル&実行してくれるプログラムを
Cで作りました。そんな事してたら、JAVAの勉強する時間がなくなりました。まぁ状況説明はそんなところです。
00108
2007/08/10(金) 17:57:271がどの程度のスピードでJavaを覚えるか楽しみにしてるぜw
ま、Javaを覚えるのにそれほどCの知識は必要ないっしょ。
関数とポインタがわかればいいんじゃね?俺もCは詳しくねぇからな。
00111 ◆J7d5GFTy3.
2007/08/10(金) 17:57:36とりあえず、今は、です。
今年の卒論で、JAVA使ってプログラムを実装しなくてはいけないので、
深い理解は院試後にじっくりやります。とりあえず今は院試で点を取るだけの知識を最優先してます。
00121 ◆J7d5GFTy3.
2007/08/10(金) 18:01:14ありがとです、頑張ります。
>>6で、staticについて
java クラス名 だけで実行できる
とノートに書かれているのですが、これはどういう事でしょうか・・・
00131 ◆J7d5GFTy3.
2007/08/10(金) 18:10:58エラー箇所は nakamura.myNameis(); の行です。
staticをつけずに、このプログラムを実行するには
nakamura.myNameis();の部分をどう書き換えないといけないんですか?
0014デフォルトの名無しさん
2007/08/10(金) 18:17:41person.myNameis();
まず本でも何でも一通り読め
0015デフォルトの名無しさん
2007/08/10(金) 18:25:1200161 ◆J7d5GFTy3.
2007/08/10(金) 18:39:46なるほど、つまりインスタンス化(?)しなくて使えるって事ですよね?
そのまま実行してみたら、初期化されてない可能性があるとかでエラーになったのですが・・・。
初期化はインスタンス化の時にするものだと思ったのですが、これだと絶対にエラーになっちゃいませんか?
00178
2007/08/10(金) 19:02:48試してないけど、どう考えてもエラーになるだろうね。
personをインスタンス化してないので、myNameis()は使えるわけねーと思う。
単にnewの書き忘れだと思うが。
ていうか、>>13の「staticをつけずに、このプログラムを実行するには」
っつーことの意味がよくわかんねーんだがw
main()からstaticを取ったらってこと?
んなことしたら動かなくなると思うんだが…。
00188
2007/08/10(金) 19:08:17ttp://www.javaroad.jp/java_basic1.htm
こことか読んでpublicやstaticの意味をしっかり理解しておいたほうがいいよ。
ま、簡単に言うと、staticがついている変数やメソッドはインスタンス化しなくても使える、
staticがついてない変数やメソッドはインスタンス化しないと使えないっつーことだね。
0019デフォルトの名無しさん
2007/08/10(金) 19:17:35クラス名.main(String[])
を呼び出すことになってる
また、その main(String[]) の戻り値は void でなければならない
結果的に java.exe から起動する場合
public static void main(String[]) は必ず必要になる
つーか >>6 のファイル名は
myJava.java でなく MyJava.java とすべき
Windows環境では javac.exe に渡す引数さえ大文字小文字が合ってれば
コンパイル通っちまうけどな
00201 ◆J7d5GFTy3.
2007/08/10(金) 19:24:59今から>>18に目を通したいと思います。
基礎も何も、友達から借りた授業のノートをすらっと見ただけの状態です。
まぁ、昨日少しだけ軽くプログラミングやってみたんですけどね・・・
まだイマイチ基礎も概念も入ってないような・・・
>>19
分かりやすい説明ありがとうございます。
ファイル名は直しておきます。
00211 ◆J7d5GFTy3.
2007/08/10(金) 19:54:47ただ、どういう場面で効力を発揮するのかはまだよく分かりませんが。
Personをstaticにすると、インスタンス化しないで
Person.myNameis()を実行できました。
main()関数は絶対にstaticでなければいけないというのも理解できました。
今はインスタンスとオブジェクトの違いがイマイチよくわからずに混乱しているのですが。
00221 ◆J7d5GFTy3.
2007/08/10(金) 19:57:16JAVAやってるとAction Scriptと似てるなぁと思うのですが、実際はほとんど同じものと考えてもいいのでしょうか?
FLASHで言うシンボルというのが、JAVAではクラス。
FLASHで言うインスタンスというのが、JAVAではオブジェクト、になるんですかね。
FLASHとJAVA両方分かる人いれば教えてください。
00231 ◆J7d5GFTy3.
2007/08/10(金) 20:14:30俺のコンパイルするプログラムそういうのに対応してないから、ずっとコンパイルエラーに悩まされて時間食ってしまった・・・。
パッケージ名はメアドを逆順に並べたものを使うって書いてあるのですが、
実際にパッケージって使われてるんですか?プログラム配布する時以外は特に関係ないですよね?
パッケージの用途ってプログラムを配布する時に、クラス名を重複させないようにするためだけ、って事で理解してもいいのでしょうか?
00241 ◆J7d5GFTy3.
2007/08/10(金) 20:15:19虚しくなってくるね。でも俺はやるぜ!今日明日で理解するんdな!
00251 ◆J7d5GFTy3.
2007/08/10(金) 20:37:21他にも、同じ役割を持つクラス・インタフェースを1つのパッケージにまとめることにより、
そのクラス・インタフェースの持つ意味がわかりやすくするとか、パッケージを使用することにより、
クラス・メンバ変数・メソッド・コンストラクタにアクセス制限をつけることができるとか、あるらしいですね。
はぁ・・・寂しい
0026デフォルトの名無しさん
2007/08/10(金) 20:44:58>FLASHで言うシンボルというのが、JAVAではクラス。
そう
>FLASHで言うインスタンスというのが、JAVAではオブジェクト、になるんですかね。
Javaでもインスタンス
>パッケージの用途ってプログラムを配布する時に、クラス名を重複させないようにするためだけ、って事で理解してもいいのでしょうか?
そう
0027デフォルトの名無しさん
2007/08/10(金) 21:03:53ゆくゆくはiアプリを作りたいって思ってる
お互い頑張ろうぜ!
00281 ◆J7d5GFTy3.
2007/08/10(金) 21:15:34なるなる。そう考えるとちょっと理解の助けになるかも。。。
>>27
頑張ろうぜ!
てか、はだしの元が気になるw
宇和ああああああああああああああああああああああああああ
00291 ◆J7d5GFTy3.
2007/08/10(金) 21:18:0500301 ◆J7d5GFTy3.
2007/08/10(金) 21:34:3900311 ◆J7d5GFTy3.
2007/08/10(金) 21:47:4400321 ◆J7d5GFTy3.
2007/08/10(金) 22:09:100033デフォルトの名無しさん
2007/08/10(金) 22:20:54//myJava.java
class MyJava { //メインのクラス。取りあえず、ここから
//全てが始まる
public static void main(String[] args) {//ココはC言語でいう
//メイン関数だ。理屈抜きで覚えてくれ
Person nakamura = new Person();
//Personクラスのnakamuraってインスタンスを作る。まあ、人間(クラス)
の中村さん(インスタンス)を作るって考えてくれ
nakamura.myNameis();
//nakamuraインスタンスが関数myNameis()を使う
//中村さん(インスタンス)が名前(関数)を言ってる
nakamura.name = "中居君";
//中居君をPersonクラスのnameって構造体に記憶させる(書き換える)
nakamura.myNameis();
//書き換えた名前をいう。
}
}
0034デフォルトの名無しさん
2007/08/10(金) 22:34:18MyJavaのフィールドならまだ話は
分かるけど、
一つのファイルならば、MyJava extends Personとして
継承させなければならない。
とりあえずフィールドってことで考えてみる
//Person.java
class Person {//このカギカッコの中に先ほど書いた
//インスタンスが呼び出すものがあり,それぞれ、(
インスタンス名.何々)で呼び出せる
String name;
名前をおく
Person() {//これは、コンストラクタといってクラスを呼び出したとたん
//実行されるものだ
//要するにMyNameisの関数を最初に使う前にすでに
//木村拓哉は代入されている
name = "木村拓哉";
}
void myNameis() {
System.out.println(this.name);
//これはようするにこの関数を呼んだときの名前を書けって感じ
//名前は、木村拓哉→中居くんと変化する
}
}
0035デフォルトの名無しさん
2007/08/10(金) 22:42:280036デフォルトの名無しさん
2007/08/10(金) 22:48:43それを実体化した物がインスタンス
オブジェクトとインスタンスの違いは
「インスタンス」と言うと「何かのクラスを実体化したオブジェクト」という感じ?
オブジェクトは総称で、何かのクラスを実体化したオブジェクトがインスタンス?
上手く説明出来んが、そんな感じ
実体化のことを「インスタンス化」なんて表現する文章も見る
「インスタンス」という言葉に「何かのクラスを実体化した物」
ってイメージがあるからこその表現だな
0037デフォルトの名無しさん
2007/08/10(金) 22:55:33バッチファイルで出来るうえ一分で書けるぞそれ・・・。
0038デフォルトの名無しさん
2007/08/10(金) 23:01:14無理言うな!
0039デフォルトの名無しさん
2007/08/10(金) 23:02:05パッケージに関してはおおよそその解釈で合ってる。
コンパイルの仕方は多分解ってなさそうだが。
まぁ、ローカルでテストしてるだけなら package 文自体あんまり使う必要はないぞ。
色々なソースから汎用で使うクラス作るなら覚えた方が良いが
配布するにしても単体で完結するような物なら必ずしもパッケージ作る必要ないし。
「パッケージ名はメアドを逆順に並べた物を使う」
って言うのは、別にメアドじゃないといけない訳じゃなくて
パッケージ名が重複するとマズいから
世界中のJavaプログラマが一人一人別の物を使うならそれで良いんだわ
WWW上でメルアドは重複しないんだから
それを元にするのが確実だろうってことで推奨されてる
別に、自分のPCの中でテスト用パッケージ作るだけなら
好きな文字列を使えば良いが、配布とかするようなら
推奨される通りの名前を設定した方が後々楽だろうな
00401 ◆J7d5GFTy3.
2007/08/10(金) 23:28:35詳しくありがとうございます。
myNameis()のprintlnの中身の this.name は name にしないとエラーになります。
staticでインスタンス化せずに使うと this.name がエラーになるのですが、
thisはインスタンス化して初めて this として指定できるというかなんというか・・・なんですかね。
プログラミング言語以前に日本語が出来てない俺を許して下さい;;
00411 ◆J7d5GFTy3.
2007/08/10(金) 23:33:23オブジェクトとインスタンスの違いはイマイチまだ理解できませんね・・・;;
自然と分かるようになってくるのかな・・・
>>37
趣味ですw
>>39
なるほど。なんかスッキリしましたw
パッケージを使わなきゃいけないというか、使うと便利になるみたいな
イメージを押されてるような感じがしてモンモンしてたのが晴れました。
00421 ◆J7d5GFTy3.
2007/08/10(金) 23:38:39はだしのゲンを見終わってから、色々といじってて、少しだけ理解が深まったような気がします。
クラスとインスタンス、パッケージ、コンストラクタまでなんとなく分かりました。
本当はもっと色々プログラミングして、ゆっくり学びたいのですが、それは院試後ということで。
明日は>>1の残りを・・・
暇があれば明日は覚えた事を軽くまとめたいと思います。
0043デフォルトの名無しさん
2007/08/11(土) 00:04:45thisって難しいですよね。僕も習ったときは分かりませんでした。
thisは「このインスタンスの名前」って
感じに解釈しています。
例えばnakamuraインスタンスが、MyNameisを呼び出していますが、
MyNameisはこのインスタンス(nakamuraのインスタンス)の名前を呼び出す
ちなみにこの時点の名前は、上記の通り。
まあ、俺もjavaは2回のときに授業でやっただけで、前期のthisやクラスの基本が
分からず
後期のGUIでつまずいて、
あまり分かってないのが現状です。最近、分かってきたのは時間の経過のおかげです。
2日でやろうというその挑戦。頑張ってください。
0044デフォルトの名無しさん
2007/08/11(土) 01:03:35. = の
this.name = 自分の名前
クラス = データと関数の集まり
メソッド = 関数
ポリモーフィズム=poly-morph-ism = たくさん-形態 = 子クラスの個性はいろいろあるなあ
overload = 同じ名前の似た関数がある
override = 子クラスが同じ名前の同じ関数の定義を上書きする
interface = 関数の出入り口と名前を決められている
継承 = exntends = inherit = derieve = 親からパクる
パッケージ = そのクラスの住所
コンストラクタ = 自分の産声
カプセル化 = 自分のもっている変数をみだりに見せないこと
インスタンス = オブジェクトと同じ意味だと思っていい
0045デフォルトの名無しさん
2007/08/11(土) 01:41:370046デフォルトの名無しさん
2007/08/11(土) 01:45:06他のメソッドに引数として渡したり出来るところが便利なところ。
そうすることで、メソッド側は渡されたオブジェクトに対して操作したり
渡されたオブジェクトのメソッドを呼び出したり出来る。
0047デフォルトの名無しさん
2007/08/11(土) 12:02:26インスタンスは、クラスから生成されたことを強くする意識するものではあるけど、
(instanciate っていう動詞があるぐらいだし)
オブジェクトと同一だと最初は思っていていい。
OOの何が難しいって用語だよ。大量の意味不明な用語。
0048デフォルトの名無しさん
2007/08/11(土) 12:10:38新人には電化製品クラスとか実際の物で例えると伝わりやすい
0049デフォルトの名無しさん
2007/08/11(土) 12:11:040050デフォルトの名無しさん
2007/08/11(土) 12:24:22俺はそれで逆に勘違いして覚えてしまって後で苦労した。
物ではない文字列クラスやコレクションクラスなんかが中々理解出来なくてね。
0051デフォルトの名無しさん
2007/08/12(日) 00:03:450052デフォルトの名無しさん
2007/08/12(日) 00:50:16したら良いかアドバイスが集まる気がするぞ。
0053デフォルトの名無しさん
2007/08/12(日) 01:21:04初日から短時間で割とすんなりクラスやらインスタンスやらを理解してたが、
俺が知ってる人間でそんなに早く吸収してったやつはいない。
1 の質問も、OOやってないという割りに的を得てて何か妙な感じがしたんだが。
・・というわけで、俺は 1 に釣られたような気がするがどうだろう。
(1 の頭が良い、俺がバカ、俺にまともな友達が居ない・・・等等の
可能性があるが、あえて意見を聞きたい。)
00548
2007/08/12(日) 02:59:27んなこたぁ気にしなくてもいいんじゃないの?
俺はどちらかというと1の質問に対する周りの反応に注目していたけどね。
俺もJava初心者だからよw
いまんところ1が嘘ついてるとは思えないね(ただし、釣りかもしれないという疑惑が消えることはない)。
まぁ、>>28の書き込みをみて、少し怪しい(=2ちゃんねる経験者っぽい)と思ったが、
はだしのゲンがどうのとか言ってるわけだから悪い奴ではないのだろう。
性格の悪い奴はそもそも感動するドラマは見ない
(感情移入ができないので見てもつまらない)わけだからな。
どうでもいいけど「的を得る→的を射る」な。
わかってて言ってんならいいけどよ。
友達ならここで作ろうぜw
0055デフォルトの名無しさん
2007/08/12(日) 04:00:24当を射る の検索結果 約 1,020 件中 1 - 10 件目 (0.38 秒)
まあまず当を得る自体あんまつかわねーけども惨敗だな
0056デフォルトの名無しさん
2007/08/12(日) 04:53:44何度もプログラム組んでると分かってくるよ
実際プログラム組まざるを得ない状況で1度習得してしまえば
>>1に書いてあるようなオブジェクト指向の概念て全然難しくないんだよね
むしろわけ分からん例え話とかが習得を難しくさせる
0057デフォルトの名無しさん
2007/08/12(日) 05:13:3200588
2007/08/12(日) 06:45:12それはともかくとして、
ま、オブジェクト指向プログラミングは、やってればそのうちわかるっしょ。
わかんないなら、自分にとっては必要のないことなんだよ。
ちなみに俺はオブジェクト指向プログラミングなのか、ほぼ理解してるぜ。
そいつがオブジェクト指向なんたらを理解しているかどうかは、
「インスタンス化」という言葉が何を意味しているのかを説明させてみればすぐにわかる。
実体化がどうのとかいう奴らはオブジェクトなんたらを理解してない可能性が非常に高い。
そもそも、実体化という言葉にはなんの意味もない。
実体化しないと使えないっつんならクラス変数やクラスメソッドはなんなんだよと言いたくなるね。
つまりインスタンス化というのは…以下省略。
00598
2007/08/12(日) 06:52:48> ちなみに俺はオブジェクト指向プログラミングなのか、ほぼ理解してるぜ。
なんすかこれ。
ま、これはこれでいいや。
0060デフォルトの名無しさん
2007/08/12(日) 08:55:320062デフォルトの名無しさん
2007/08/12(日) 13:14:34じゃあ、インスタンス化って何?略さずに教えてくれよw
0063デフォルトの名無しさん
2007/08/12(日) 13:35:40それに>>58で言ってるクラス変数云々は的外れじゃないか?
Javaに限って言えばクラス変数なんてクラスロード時に初期化するに決まっているんだから。
なんか全体的に意地悪で不親切な印象を受ける。質問の意図が不明瞭。
相手を罵倒したいだけじゃないの?
0064デフォルトの名無しさん
2007/08/12(日) 13:39:48インスタンスってのはクラスの実体、オブジェクトってのは(任意の主体から操作することができる)客体の総称
Object o = new Object();
このコードを持っているクラスが主体とすると、oって変数に入るもの(上の例ではObjectのインスタンス)が客体
逆に言えばJavaではObject型の変数に突っ込めるものは全てオブジェクト
またクラスはメタクラス(Class.class)のインスタンスであり、オブジェクト(操作可能な客体)である
JavaではObject型の変数に対して、インスタンスの他にクラスもつっこめるよな?
Object o = String.class;
これがクラスもオブジェクトってことを表現している
がしかし、これを覚えて一体なんの役に立つんだ?
0065デフォルトの名無しさん
2007/08/12(日) 13:54:07× instanciate
○ instantiate
0066デフォルトの名無しさん
2007/08/12(日) 14:11:41とりあえず、オブジェクトとインスタンスは同じだと考えていい。
javaでプログラミングするうえでは、この理解で問題は無い。
あと、javaの言語仕様を説明することが
オブジェクト指向の説明だと勘違いしてる奴は結構多いから気をつけろ。
0067デフォルトの名無しさん
2007/08/12(日) 15:18:2300681 ◆J7d5GFTy3.
2007/08/12(日) 15:25:45土曜日は急遽友達の家で勉強合宿(?)みたいなのがあって、
このスレに来る事が出来ませんでした。その間たくさんのレスありがとうございます。
書き込みが遅くなって申し訳ないです。
とりあえず>>53あたりで釣り?的な疑いがありましたが、釣りじゃないです
あと決して頭がいいわけじゃないです。HTML, JavaScript, Perl, C, Action Script(FLASH)などの言語を
広く浅く経験してきたのと、このスレのレスを読みながらも関連した情報を後ろでググってるのと・・・
釣りじゃない証明なんて誰にも出来ないので、これ以上は何もいいませんが、
ちゃんと院試も受けますし、オブジェクト指向言語を学びたいとも思ってます。
0069デフォルトの名無しさん
2007/08/12(日) 15:26:36オブジェクトとインスタンスの違いって、表現してる分野自体違うので重要ではないと思う
特にJavaではオブジェクトと言ってインスタンスを指すこともあればクラスを指すこともあるし。
オブジェクトは概念上の物体を指すときに使う。
醤油買ってきて、なんて時の「醤油」は具体的なものは表現していないけど、
現実に他と区別することができる存在
前述の通り実際のモノやその概念を指すこともある
インスタンスは具象化された物体を指すときに使う。
ちょっとそこの醤油取って、というときは確実にそこに存在する「醤油」という実体(インスタンス)を対象にしている
クラスはオブジェクトの概念自体を示すもの。
醤油はこんな原材料でこんな風に製造されていて、こんな風味を塩味をもたらす、というもの。
何か勘違いあれば指摘にょろ
00701 ◆J7d5GFTy3.
2007/08/12(日) 15:30:15とりあえずは大体同じものとして考えるようにします。
FLASHで上手く例えてくれれば微妙なニュアンスの違いがわかるかもです。
あと>>44はフムフム・・・と思いました!
00711 ◆J7d5GFTy3.
2007/08/12(日) 15:31:58大体分かったような分かってないような・・・そんな感じです。
概念はなんとなくですが理解できるのですが何が素晴らしいのかが
イマイチ理解出来てない状態です。昔から理論とか知識より実践して
体で覚えてきたせいもあるかもしれないです。
いくつか不明な点があるのですが、まず一番初めに聞きたいのが、
抽象クラスは何の意味があるのでしょうか?
オーバーライドを前提としたメソッドという印象を受けるのですが、
サブクラスで絶対に上書きされるのなら、わざわざ抽象クラスで宣言しなくても、
各サブクラスの方で普通にそのメソッドを作ればいいように思うのですが・・・
0072デフォルトの名無しさん
2007/08/12(日) 15:33:3300741 ◆J7d5GFTy3.
2007/08/12(日) 15:51:01Personクラスの中にselfIntroduction()という抽象メソッドがあって、
Personクラスを継承した、SoccerPlayerクラスとBaseballPlayerクラスがあるとします。
SoccerPlayerクラスのselfIntroductionメソッドでは『私はサッカー選手です』と
BaseballPlayerクラスのselfIntroductionメソッドでは『私は野球選手です』と出力するように設定します。
この例だと、
nakamura.selfIntroduction()
nakata.selfIntroduction()
のように使うと思うんですが、この場合、別に抽象メソッドつくらなくても
SoccerPlayerクラスとBaseballPlayerクラスでそれぞれselfIntroductionメソッドをつくればいいような・・・
って感じなのですが・・・、多分俺理解してないです。具体的にどのような使い方の時に
抽象メソッド!ってなるんでしょうか・・・この例だと意味ないですよね?
例えば
ttp://www.javaroad.jp/java_class13.htm
の例1のプログラムを見ても、やはりイマイチ抽象メソッドを利用する意義がみいだせないです。
各サブクラスでcalculate()を実装すればそれで終わりのような気がしてなりません;;
0075デフォルトの名無しさん
2007/08/12(日) 15:58:53例えば java.util.Collection っていうインタフェイスがある。
これは add とか remove とか iterator といったメソッドを持っているが、
具体的な実装は何もなく、実際に使うときは ArrayList や LinkedList や HashSet といった具象クラスを使うんだけど、
使う側にしてみれば ArrayList 用とか LinkedList 用とか大量にあるコレクションクラスそれぞれに、
いちいち別々に作ってはいられん。
Collection というふうに抽象化しとけば、何のコレクションだか知らないが
とりあえず add や remove や iterator のできる対象として統一的に扱える。
0076デフォルトの名無しさん
2007/08/12(日) 15:59:27例えば、コレクションの中の特定の要素の数を数えるメソッド。
int countElement(Collection c, Object e)
{
int result = 0;
Iterator it = c.iterator();
while (it.hasNext()) {
Object o = it.next();
if (o.equals(e)) {
result++;
}
}
return result;
}
使用例:
ArrayList arrayList = (...略...) ;
int n = countElement(arrayList, "A");
System.out.println(n); // → 2
この countElement には、ここでは ArrayList を渡したけれども、LinkedList とか TreeSet とかコレクションならなんでも渡せる。
数十個あるコレクションの具象クラスごとに countElement を別々に作るなんて誰もやりたくないし、
仮にそうしたとして、新しいコレクションクラスには対応できない。
0077デフォルトの名無しさん
2007/08/12(日) 16:01:242 とか忘れて。 行数制限で例をいろいろいじってたら消し忘れた
0078デフォルトの名無しさん
2007/08/12(日) 16:16:15でも ArrayList は先頭〜途中への挿入や削除が遅いから、後で性能上の理由から LinkedList に変えたくなるかもしれない。
ArrayList とハードコーディングされているプログラムは、これに対応するのはかなり面倒い。
Collection や、せめて List として抽象的に扱っているプログラムなら、具象クラスが LinkedList に変わろうがまったく問題ない。
ArrayList にも LinkedList にも満足できなければ、自作の MyList を作ることになるだろうが、その場合でも Collection や List として抽象的に扱っているプログラムにならそのまま適用できる。
0079デフォルトの名無しさん
2007/08/12(日) 16:23:39インタフェイスは完全に単なるインタフェイス (コネクタの形状とか入出力仕様みたいな意味の) であって、実装はまったくない。
抽象クラスは、一部は抽象化されているが、いくらかデフォルトの実装がある。
008053
2007/08/12(日) 16:24:49とりあえずそれは正しい。
例えば名前を返すメソッドを持つフルーツクラスを考える。
class Fruit { public String getName() { ... } }
こいつを継承して リンゴクラス、バナナクラス、... を作るとしよう。
ポリモーフィズムがわかるなら、
getName() を Fruit クラスに書かなくちゃいけないのは分かるはず。
さて。じゃぁなんで抽象メソッドってものがあるかというと、
Fruit クラスは "リンゴ" とか "バナナ" とか固有の名前を決められないから。
抽象クラスはそれだけでは存在しえない場合に利用する。
しかしあらゆる Fruit に共通の処理をするプログラムは書くことができる。
abstract class Fuit { public String getName(); }
class Foo {
// リンゴにもバナナにも依存しないが、Fruit の名前を表示するメソッド
public void printName( Fruit f ) {
System.out.println( f.getName() );
}
}
また、abstract により Fruit の new を禁止するため、
名前の無い Fruit が作られる心配が無い。
00811 ◆J7d5GFTy3.
2007/08/12(日) 17:30:34少し頭の中がつながってきたので、質問させて下さい。
もしかしてこの話ってポリモーフィズムが非常に深く関係してますか?
>>80の例で言うと、FruitクラスにgetName()という抽象メソッドがなかった場合を考えると、
例えFruitクラスを継承したAppleクラス内でgetName()メソッドを定義していたとしても、
>>80のprintName()メソッド内でf.getName()は実行できない・・・ですよね?
そういう事なら抽象メソッドというのはオーバーライドとポリモーフィズムを上手く利用した
仕組みになってるんだなぁと理解出来そうな気もするのですが。
00821 ◆J7d5GFTy3.
2007/08/12(日) 17:35:07動物クラスがあって、それを継承した脊椎動物クラスがあって、それを継承した肉食動物クラスがあって、
それを継承したライオンクラスがあって。ライオンクラスをnewでインスタンス化するのは分かりますが、
脊椎動物クラスをnewしたら出来上がったインスタンスは一体なんなんだ・・・的な感じ?で理解する事にします。
概念というよりも、もう少し実装レベルというか実際にプログラミングするレベルでの話になるのですが、
クラスが継承によって木構造を形成している場合、葉に該当するクラス以外は基本的に抽象クラスに設計するのが
一般的なのでしょうか?
00831 ◆J7d5GFTy3.
2007/08/12(日) 17:45:34サブクラスで定義し忘れしないようにする場合とかに抽象クラス、抽象メソッドの概念を利用すると
説明してあるところが多かったのですが、それだとイマイチ、設計の段階でしっかり決めとけばいいじゃん。
って思うわけで。まぁ今までやってきた手続き型の言語と違ってオーバーロードの概念とかがあるせいで、
注意してもどこかでミスが出る可能性は十分にあるんだとは思いますけど。
あと少しで理解出来そうな・・・気・・が・・・あqwせdrftgyふじこlp
院試まで@8日。
手をつけてない教科が3教科。これは・・・ヤバイ!!
院試後スレが残ってたら、とりあえず何か作ってうpを繰り返しながら成長して行きたいです。
0084デフォルトの名無しさん
2007/08/12(日) 17:59:37はい。
> >>80のprintName()メソッド内でf.getName()は実行できない・・・ですよね?
そうなります。
>一般的なのでしょうか?
だいたいは。
親クラスで標準的なデフォルト動作を実装しておき、そのままでも使えるが、サブクラスで特定目的にカスタマイズして機能を特化する、というようなものもありえます。
>院試まで@8日。
がんばってください。
0086デフォルトの名無しさん
2007/08/12(日) 18:08:18あ、勘違いしてた。thx
0087デフォルトの名無しさん
2007/08/12(日) 18:13:34public void threeTimes(){ for(int i = 0; i < 3; i++) this.sayHello(); }
abstract void sayHello();
}
0088デフォルトの名無しさん
2007/08/12(日) 20:56:57実は、インタプリタのOO言語だとそういう実装の方が多数派。
メソッド呼出しの時、オブジェクトにその名前のメソッドが定義されてたら
それを呼出し、無ければ例外やエラーを出すみたいな、な。
だが Java や C++ みたいなコンパイラ言語
特に型を明示するタイプの言語では
実行時にメソッドの名前を探すなんてしたくない。
あくまでコンパイル時にどこへ飛ぶか決めておきたい。
その辺柔軟にコンパイルしてくれる言語もあるかも知れんが
少なくともJavaはそうじゃない。
たがらコンパイル時点で、変数の型には
そのメソッドを定義しておく。
0090デフォルトの名無しさん
2007/08/13(月) 02:08:220091デフォルトの名無しさん
2007/08/13(月) 14:41:36こういう時に抽象クラス、ポリモルフィズムを使う。
class Person {
bool 歌唱力(){
if(this.name.equals("木村拓哉" ){
return true;
}else if(this.name.equals("中居君"){
return false;
}
}
}
というのはだめで、
class Person {
abstract bool 歌唱力();
}
class 木村拓哉 extends Person {
bool 歌唱力(){ return true; }
}
class 中居君 extends Person {
bool 歌唱力(){ return false;}
}
0092デフォルトの名無しさん
2007/08/14(火) 02:40:00ttp://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0
0093デフォルトの名無しさん
2007/08/15(水) 04:18:280094デフォルトの名無しさん
2007/08/15(水) 08:10:260095デフォルトの名無しさん
2007/08/18(土) 05:38:000096デフォルトの名無しさん
2007/08/18(土) 08:05:17詳しい説明をどうぞ。
0097デフォルトの名無しさん
2007/08/18(土) 09:02:55抽象クラスもインタフェースも
用途がほとんどないよな
0098デフォルトの名無しさん
2007/08/18(土) 10:08:550099デフォルトの名無しさん
2007/08/18(土) 10:12:13抽象クラスは、それがインスタンス化されるべきクラスではない事が分かってる時に作る。どういう時かというと、例えば抽象メソッドを作りたいとき。
抽象メソッドというのは、メソッドの定義するが、その動作責務はサブクラスに委ねたいときに作る。
説明としてはこんな感じかな?
0100デフォルトの名無しさん
2007/08/18(土) 11:43:00親クラスをインスタンス化可能にしておいてデフォルトの動作を記述しておいた方が
良い場合があるってこと?
0101デフォルトの名無しさん
2007/08/18(土) 17:24:06ポリモフィズムってのは今のところ見たことないけど
0102デフォルトの名無しさん
2007/08/18(土) 19:10:050103デフォルトの名無しさん
2007/08/18(土) 20:13:10それなら英語のまんまのPolymorphismでいいんでないの。
0104デフォルトの名無しさん
2007/08/18(土) 20:37:52中途半端だから浮いてるように思えて
0105デフォルトの名無しさん
2007/08/18(土) 21:08:22010699
2007/08/18(土) 22:42:57>抽象クラスは、それがインスタンス化されるべきクラスではない事が分かってる時
[訂正]
抽象クラスは、それがインスタンス化されるべきでないクラスだと分かってる時
かな
0107デフォルトの名無しさん
2007/08/19(日) 04:50:51俺も最初は多態性で覚えた
0108デフォルトの名無しさん
2007/08/19(日) 18:26:14でもポリモーフィズムで覚えてる
ふしぎ!
0109デフォルトの名無しさん
2007/08/19(日) 23:40:110110デフォルトの名無しさん
2007/08/20(月) 00:38:05「今日と明日」はもう終わったんじゃ・・・
0111デフォルトの名無しさん
2007/08/20(月) 04:52:44よって永遠に続く。
0112デフォルトの名無しさん
2007/08/20(月) 06:10:380113デフォルトの名無しさん
2007/08/20(月) 07:43:230114デフォルトの名無しさん
2007/08/20(月) 07:48:120115デフォルトの名無しさん
2007/08/20(月) 11:55:280116デフォルトの名無しさん
2007/08/20(月) 14:19:2601171 ◆AK1iMcKuCs
2007/08/21(火) 04:59:17スレを留守にしすぎて忘れてしまったせいでトリップ変わりました・・・
院試もいよいよ今日となりました。
@4時間30分後には試験を受けてます。
とりあえずスレを全部読み直して、ノート見直して、試験に臨もうと思います。
試験と面接が終わったら、一応報告しに戻ってきます。
01181 ◆AK1iMcKuCs
2007/08/21(火) 05:03:06多分、今日の科目も難易度が非常に上がってると思うので、
オブジェクト指向の勉強に費やした時間を考えると、ちょっと不安です・・・
とりあえず、頑張ってきます!ではー
0119デフォルトの名無しさん
2007/08/21(火) 08:02:0001201 ◆AK1iMcKuCs
2007/08/21(火) 15:35:19いやいやwww
明日問題が公開されるので、そしたら出た問題をここに載せようと思います。
このスレで丁寧に説明してくださったみなさんのおかげで無事問題を解く事が出来ました。
ありがとうございます。
ちょっとこれから何かプログラミングして遊びます〜。
何かこんなの作ってみたら理解できるかもよ?って感じのお勧めプログラムでもあったら教えてください。
喜んで取り組んでみたいと思います。
0121デフォルトの名無しさん
2007/08/21(火) 16:30:49何してるのかわからない小難しい計算プログラムなんかより、みんな楽しめていいと思うのだけれど
0122デフォルトの名無しさん
2007/08/21(火) 19:26:260123デフォルトの名無しさん
2007/08/21(火) 19:56:450124デフォルトの名無しさん
2007/08/22(水) 01:28:340125デフォルトの名無しさん
2007/08/22(水) 14:14:280126デフォルトの名無しさん
2007/08/23(木) 01:15:00■ このスレッドは過去ログ倉庫に格納されています