クラス、オブジェクト、インスタンス、メソッドに
ついて教えていただけないでしょうか?

今現在の自分の認識では、乗り物を例にすると、
「乗り物」という大枠がクラス。それを、たとえば
飛行機なり電車なり船なり、より具体的にした
ものがインスタンス=オブジェクト。
その具体化したものの挙動、動作(走るとか飛ぶとか)
がメソッド、という理解です。

ただ、これだとオブジェクトとインスタンスを
同じものとして見てしまっているので、この2つの
違いを明確に説明しろと言われると困ってしまいます。

インスタンスとオブジェクトの違いを明確にした上で
うまく伝えられる方法があれば、ご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

最初は「オブジェクト=インスタンス」で良いと思います。



ただ、いろいろと細かい話が出てきていますので、私の理解している範囲でアドバイスしたいと思います。

〔オブジェクト〕
設計段階で使う用語です。
クラスオブジェクトとインスタンスオブジェクトの2種類あり、通常単にオブジェクトと言えばインスタンスオブジェクトのことを指すようですが、クラスオブジェクトのことを指すこともあるので注意が必要です。

〔クラス〕
実装段階で使う用語です。
クラスオブジェクトの実装が「クラス」です。
クラスオブジェクトとクラスは完全に一致します。

〔インスタンス〕
実装段階で使う用語です。
インスタンスオブジェクトの実装が「インスタンス」です。
インスタンスオブジェクトとインスタンスは、必ずしも一致しません。
たとえば、C++ であるクラスのインスタンスを new して、ポインタ変数に代入した場合を考えてみます。
インスタンスオブジェクトに相当するのは、そのポインタ変数そのものですよね。
しかし、インスタンスはポインタ変数が指している先、つまりメモリ領域に確保された実体そのものです。

と、まあ、細かいことを言えば、こんな話になりますが、ここまでこだわって話をすることは、まずないでしょう。

設計レベルでは「オブジェクト」、実装レベルでは「インスタンス」と使い分けておけば、とりあえず間違いはないでしょうし、両者を混同したところで話が通じないことはないと思います。

# 私なんか、最初「インスタンスはオブジェクトのちょっとかっこいい
# 呼び方だ(?)」などと思っていましたし。。。
# いや、なんとなく響きがかっこよく聞こえたもので。。。

とりあえずは、こんな感じでいかがでしょうか。
    • good
    • 2

せっかく抽象的なものの考え方をしているわけだから、数学を使えばいいんじゃないかなあ、ってふと思ったんですけど。



まず始めに「違い」についてですが、手短に言えば、以下のようになりますね。

「オブジェクトもクラスもインスタンスもみんな同じもの。じゃあ、厳密にはどう違うのかというと、『クラス』というのは、抽象的な概念を表すオブジェクトのことで、『インスタンス』というのは具体的な実体を表すオブジェクトのこと。」

集合で言えば、「オブジェクト」の中に、「クラス」と「インスタンス」が入っている、といった感じですね。だから、別の表現を使えば、十分条件ではあるけれども、必要条件ではない、という風になると思います。

今度は「明確な説明」についてですが、以下、中学数学で習う図形を元に、オブジェクト指向の概念を解説していきます。

平行四辺形や二等辺三角形もまた、全てオブジェクト。じゃあ、「平行四辺形」オブジェクトというのは、どういう風に定義されているのかというと、「平行四辺形」クラスの中に、「辺」フィールドや「角度」フィールド、はたまた「等しい」メソッドや「平行である」メソッドなどを用いて、決められているわけですね。(ここまでが、プログラム設計。)
そのクラスにより、例えば、初期値を[a=c=2,b=d=3]として「平行四辺形E」インスタンスが新たに作られたり、初期値[A=C=60°,B=D=120°]とする「平行四辺形F」インスタンスが新規に作成されたりするわけですね。(この部分が、プログラミング。)

昨日も、Javaカテゴリ内で、「抽象クラスってなに?」みたいな質問があったのですが、先程、覗いてみると、もう閉め切っていたので、以下にそっちの方も書き記しておきます。

以上の考え方を利用すれば、抽象クラスやインターフェイスなども簡単ですね。例えば、「長方形」クラスや「ひし形」クラスが必要な場合、先に「四角形」抽象クラスを作成しておけば、後はそれを継承するサブクラスをそれぞれ作成することで、「再利用化」を実現できますね。
もちろん、そんなややこしいことをすれば、クラスが増えるだけだし、大きな「長方形」クラスや、長々とした「ひし形」クラスでもいいじゃないか、と思う人がいるかもしれません。ただ、この後にまた、「台形」クラスが必要になったとしましょう。そしたら、抽象クラスがない場合は、また一から冗長的なプログラムを作成していかなくてはなりません。それが、抽象クラスがある場合は、同様にして、それに関するサブクラスを作成するだけでいいわけですね。それと同時に、このように共通とするものを抜き出して「抽象化」しておけば、コーディング時だけでなく、品質面や後々の保守・運用時にも信頼性が高まる事につながります。

>それにしても、オブジェクト指向の解説って、設計レベルのみの解説や実装レベルのみの解説は見かけますが、両者をつなぐ解説ってあまり見ないような気がします。
お勧めとしては、やはりUMLやデザインパターンでしょうか。これらは、オブジェクト指向を元にした技術なので、必然的にオブジェクト指向的なものの考え方も身に付きますから。
    • good
    • 5

No7 ency です。



メソッドについてですが、案外オブジェクト指向で一番やっかいなものかもしれません。

「オブジェクトに送信したメッセージの応答がメソッド」ということになるでしょうか。。。

…何がなにやら、わからないですよね。

メッセージは「オブジェクトに対して要求する処理」のことです。

メソッドは「要求された処理の実現方法」のことです。
# 「応答」というのはそういう意味です。

…いまいちピンときませんか?

設計レベルでは、上記の話だけで事足りると思いますが、いざ実装となったときにどうするの?という話になりますよね。

実装レベルでは、使用する言語の仕様に依存するようです。
C++ や Java に限って言えば、「メッセージを送信する=メソッドがコールされる」という理解で良いと思います。
C++ と Java では、メッセージ送信とメソッドコールは完全に一致します。

hoge.message();

というのは、hoge に対して message() というメッセージを送信する場合の書式になります。

では、このメッセージ処理の実現方法、つまりメソッドはどのように実装すればよいのかといえば…ふつうに以下のように実装しますよね。

# hoge のクラスは Hoge とします。

void Hoge::message( void )
{
/* 何かの処理 */
}

この Hoge::message() の実装を「メソッド」と呼ぶわけです。

C++ や Java の場合、メッセージ送信の処理自体が、メソッドをコールする処理になっています。

ちなみに、C++ ではメッセージとかメソッドとかいう用語は使わずに「メンバ関数」と呼んでいますよね。
ま、より言語実装に近い呼び方になっている、というくらいにとらえておけば良いと思います。

ま、オブジェクトとインスタンスの話といっしょで、ここまで突っ込んで話をすることは、まずないと思います。

う~ん、あまりわかりやすくないかも。。。
余計に混乱させてしまっただけだったりして (?)

それにしても、オブジェクト指向の解説って、設計レベルのみの解説や実装レベルのみの解説は見かけますが、両者をつなぐ解説ってあまり見ないような気がします。

だから、「犬」に「鳴け」というメッセージを送ったら「ワン」という応答が返ってきた、などという分かったような分からないような説明が横行することに(以下略)。
    • good
    • 2

私の経験でいわせて頂くと


クラスその他の概念は概念から入ると失敗します。
私はこれで1年くらいを無為に過ごしました。

結局のところCなりJAVAなりのプログラムを実際に動かして、
あとで概念のつじつまを合わせていく方がいいようです。

なお、概念としてはデザインパターン関係の本が優れていると
多くの人が指摘しています。
    • good
    • 0

●クラス


 ある「もの」がどのようなものであるのかを説明した説明書。

●インスタンス
 「クラス」という説明書に基づいて実体化されたもの
 だからインスタンスは、元にしたクラスの性質を持っている。

 質問文の例でいうと、「ナンバーxxxの電車」のように「これ」と指でさせるもの。


●オブジェクト
 私の感じ方では、場面によってクラスの意味だったり、インスタンスの意味だったりしています。

 私見ですが理由は、

 昔、UMLが出来る前、様々な方法論でそれぞれが勝手に用語を定義していました。
 「オブジェクト」もその1つで、方法論によっては「クラス」の意味だったり「インスタンス」の意味だったりしていました。

 その名残なのではないかと思っています。
    • good
    • 0

#1の方も書いていますが「飛行機」や「電車」はクラスですね。

「乗り物」クラスを基本クラスとするとサブクラスや派生クラスとも呼びます。また「乗り物」クラスは抽象クラスでもあります。余談ですが。

さてオブジェクトとインスタンスの違いですが
オブジェクト…クラスに属する実体
インスタンス…メモリ上にデータを与えたオブジェクト
と分ける事が多いようです。
つまり「インスタンス」は抽象的な単語「オブジェクト」をプログラムと言う世界を強く意識した言い方かなぁと自分では認識しています。経験則ですので外しているかも知れませんが、オブジェクト指向にだけ特化した本では「インスタンス」と言う単語をあまり見かけませんし、プログラミング言語の本では「インスタンス」の方を頻繁に見かけます。
    • good
    • 0

クラスとインスタンスを考えるときには、「インスタンスは複数存在する(できる)」という意識が大切です。



例えば、世界に犬が一匹しかいないとしたら、クラス(犬という種族)と、「ぽちという名前の犬」の違いを説明するのは、かなり大変でしょう。それが、「犬の性質」なのか、「ぽちの性質」なのか区別に困りますから。
※逆に言えば、インスタンスが複数出てこないと、オブジェクト指向の、目だった効果というのもあまり目には見えないものです。

インスタンスは、複数あるものです。
「たま」や「みけ」や。
ですから、クラスとインスタンスを考えるときには、複数あるものがインスタンス、それの共通した部分をくくりだすのがクラスという意識で眺めてみてください。
※普通は、「クラス」という鋳型から、「インスタンス」という具体的なものを生成するという説明をしますが。

メソッドは、インスタンスの行動様式を決めるものです。
これも、通常は、「クラスに属するインスタンスの共通した行動様式」を決めるという理解です。
ただし、(複数ある)インスタンスは、それぞれ個性を持っていますから、同じクラスに属していても、同じ行動をするとは限りません。

あと、オブジェクト指向だと、「メッセージ」という概念もあります。
メソッドとは、「メッセージによって起動される行動」です。

class 犬 { };

犬 pochi();

pochi.hoeru();

というのの、hoeru(); は、ポチへのメッセージです。
C++では、それに対して、hoeru() という関数を実行するので、メッセージとメソッドの区別が明確でないこともありますが。

あるところで読んだ例。

女性クラスの、「奥さん」インスタンスに、「キスをする」というメッセージを送ると、良い雰囲気になる。

女性クラスの、「隣のお姉さん」インスタンスに、「キスをする」というメッセージを送ると、殴られる。
    • good
    • 0

がると申します。


えっと。変にたとえ話をするとかえって話がゆがみますので、たとえ話抜きでプログラムチックに。
C/C++カテゴリなので、C++の流儀で記述をしてみます。

まずクラスとは「型の定義」です。また、クラス内にある各々の関数をメソッドと呼びます。

具体的には、例えば
class foo {
public:
bool set_XX(const string& s) { data_ = s; }
string get_XX(void) { return data_; }

private:
string data_;
};

なんて感じの時に、fooがクラス名で、set_XXyやget_XXがメソッドになります。
またこの定義全体を指してクラスと呼びます。

次に。
実際にこれらを用いるときは、メモリ資源を用いて実態を作ってやる必要があります。
foo f;
foo* f = new foo();
こんな感じでしょうか。これらによって確保された「メモリ上にあるもの」を、インスタンスとかオブジェクトとか呼びます。
どちらかというとインスタンスのほうがより「正しい」言い方ですが。

で、
> ただ、これだとオブジェクトとインスタンスを
> 同じものとして見てしまっているので、この2つの
> 違いを明確に説明しろと言われると困ってしまいます。
の部分ですが。

インスタンスは「実体」です。これは概念に対して実際に使うことが出来るもの、というニュアンスがあります。
一方で、オブジェクトとは元々「対象物」を指し示します。なので、プログラム中というよりは設計中によく飛び交う単語ですね。ちなみにインスタンスはプログラム中によく飛び交う単語です。

そうですねぇ。例えば会員系のサイトの設計をしていたとします。
設計的に「会員オブジェクト」というのが必要であることはすぐにご理解いただけるかと思います。これは「会員」という対象物を指している概念です。設計中は「会員オブジェクト」に対する挙動などが設計されていくことになるかと思います。
一方で、プログラミングに入りますと。まず「会員クラス」の定義があり、それに対してコード中で「会員クラスのインスタンス」を生成(new)、そのインスタンスに対してメソッドを発行したりなんだり…といった事をすることでコーディングが突き進んでいくかと思います。

オブジェクトってのはかなりモヤついた概念なのですが。
こんな感じで少しは理解の一助になりますでしょうか?
    • good
    • 0

乗り物と飛行機、電車という関係は、クラス、サブクラスの説明によくつかわれます。


(意図によってはクラスとインスタンスの関係にもなるかもしれませんが)
クラスとインスタンスの説明としては
クラス:犬に対して、ポチ、シロなどがインスタンスというのがよいかと思います。
理想の世界の犬というものがあり、
犬は食べたり、走ったりする。これがメソッド。
メソッドはクラスで定義しますよね。
それを現実世界に具現化したものがインスタンス、ポチ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。

「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。

あるサイトに、「クラス関数」=「メンバ関数」と書かれていました。
「メンバ関数」=「メソッド」だと思っているのですが、
そうすると、「クラス関数」=「メンバ関数」=「メソッド」という認識で間違いないでしょうか?

Aベストアンサー

Java や C++ の感覚でいうと下記の様になりますでしょうか。

・「メンバ関数」=「メソッド」
  クラスに定義されている関数(プロシージャ)全般。

・「クラス関数」=「クラスメソッド」=「静的メソッド」
  クラスに定義されている関数の内、静的(static)なもの。インスタンス化せずにアクセスできる。
  http://jp2.php.net/manual/ja/language.oop5.static.php

・「インスタンス関数」=「インスタンスメソッド」
  クラスに定義されている関数の内、静的(static)でないもの。インスタンス(オブジェクト)を通してアクセスする。


この分類によれば、「メンバ関数」には「クラス関数」と「インスタンス関数」の2種類が有ることになります。


文脈によっては「クラス内の関数」という意味で「メンバ関数」全般のことを「クラス関数」という場合も有るかも知れません。

参考URL:http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89_%28%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%A6%29

Java や C++ の感覚でいうと下記の様になりますでしょうか。

・「メンバ関数」=「メソッド」
  クラスに定義されている関数(プロシージャ)全般。

・「クラス関数」=「クラスメソッド」=「静的メソッド」
  クラスに定義されている関数の内、静的(static)なもの。インスタンス化せずにアクセスできる。
  http://jp2.php.net/manual/ja/language.oop5.static.php

・「インスタンス関数」=「インスタンスメソッド」
  クラスに定義されている関数の内、静的(static)でないもの。インスタンス(オブジ...続きを読む

Q関数とメソッドの違い

初歩的な質問なのですが、
関数とメソッドの違いが分からず悩んでいます。
書籍や人によって、
関数とメソッドは同じ物として書いている物もあれば、
メソッドはクラスに関連付いた関数としていたり、
クラスでもpublic関数だけとか、
引数のある物がメソッド、
逆に無い物がメソッド等々…で、
どれが正しいのか良く分からないのです。

関数とメソッドの違いを教えていただけますよう、
お願いいたします。

Aベストアンサー

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、

>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)

> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。

> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。


オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。

オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!


と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qfloat型とdouble型の変数の違いを教えてほしいです

float型とdouble型の変数の違いを教えてほしいです
2Dゲームを作っててdoubleの変数を使ってたんですが使ってはだめだと先輩に言われたんです。
理由を聞いたら、先生が「doubleは使わないほうがいい」と言われたらしくてちゃんとした理由がわかりませんでした。
それを知って何をするということではないんですが、気になって調べても出てこなかったので質問させてください。
まだゲーム作りを始めたばっかりでぜんぜん詳しくないですが教えてくれたら助かります。

Aベストアンサー

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。
32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。
Cのmath.hで使える標準関数はdouble型のものがほとんどです。三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。sinもcosもdouble型です。内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。

そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。
聞けるのなら、その先生に理由を聞いてください。真意がわからないうちは、鵜呑みしないことです。

doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。
また、一般的には、桁が多いとその分計算時間がかかります。
ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。

ですが、実際には「一概に言えない、処理系依存」です。

以前は全てCPUで計算していたので、精度=計算量でした。
しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング