- ベストアンサー
抽象クラスのオブジェクトを生成できない理由は?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>・抽象メソッドでない普通のメソッドを実装できるのなら、オブジェクトを生成してくれても良いと思うのですが… これは言語仕様の話で、Javaはクラス単位でしか定義できません。 ですから、抽象メソッドの有無でインスタンスの生成を分けるといったことができません。
その他の回答 (3)
- myuki1232
- ベストアンサー率57% (97/170)
質問が間違っています。 オブジェクトを生成できないクラスを抽象クラスというのですから、抽象クラスがオブジェクトを生成できないのは定義通りで、当たり前のことです。 むしろ「なぜ抽象クラスというものがあるのか?」と問うべきです。
お礼
回答ありがとうございました。 >当たり前のことです ・その通りだと思うのですが、言語仕様だとしたら、Javaの仕様書(?)のどこに書いているか等、知りたかったです
- root139
- ベストアンサー率60% (488/809)
> 抽象クラスは、なぜ(オーバーライドしないと)オブジェクトを生成できないのでしょうか? 実装を持たない抽象メソッドの記述が可能という時点で、実装の無いメソッドの実行をどうするのかという問題が出てくると思いますが・・・。 例えば、 public abstract class AbstractHoge { public abstract String methodA(); } という抽象クラスが有って、 AbstractHoge hoge = new AbstractHoge(); // 抽象クラスがインスタンス化可能と仮定 System.out.println(hoge.methodA()); というコードが書けた場合、どの様な動作/出力が正当だと考えますか?
お礼
回答ありがとうございました。 抽象メソッドを含まない抽象クラスなら、オブジェクト生成出来ないのだろうか、と思い、質問してみましたー
- Tacosan
- ベストアンサー率23% (3656/15482)
抽象メソッドを呼び出せないようにするため, ではないかな.
お礼
回答ありがとうございました。 確かにその通りですね
関連するQ&A
- インターフェイスと抽象クラス
なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。
- ベストアンサー
- Java
- 抽象メソッド、抽象クラス
C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。
- 締切済み
- Java
- 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」
「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{ void show(); } class A{ public void show(){ System.out.println("A"); } } class B extends A implements X{ } public class Main{ public static void main(String[] args){ X x=new B(); x.show(); } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16
- ベストアンサー
- Java
- 抽象クラスとインターフェースの使い分け
抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。
- 締切済み
- Java
- 抽象クラスのメリット
抽象クラスを作成して、オーバーライドするならば、 普通のクラスを作成してオーバーライドしても同じ ではないでしょうか。 オーバーライドする事を忘れない、というメリットでは パンチが弱い気がします。 他に抽象クラスを使用する事によってのメリットは ありますでしょうか?
- ベストアンサー
- Java
- オブジェクト指向モデルの抽象化について
下記の設問について質問です。 設問:次の文が正しいか否かを答えよ 「オブジェクト指向モデルでは、抽象化の対象となるオブジェクトの操作をあらかじめ指定しなければいけない」 ~~設問以上~~ まず前提知識として抽象化というのはクラス、メソッドの名前だけを、 中身は何も書かないで予め宣言しておくことという理解でよいでしょうか。 その場合、上記「」内の文で誤っているところとしてはオブジェクト指向モデルでは抽象化は必ずしも必要ないから誤っているという理解でよいでしょうか。
- ベストアンサー
- Java
- インターフェイスと抽象メソッドについてお願いします。
PHPの参考書で「抽象メソッド」と「インターフェイス」それに「実装」という言葉が出てきました。 プログラミングが初めてで全然理解できなく困っています。 ・抽象メソッド ・インターフェイス ・実装 上記の意味とメリットなどを教えてください。それとどのような面で使うのかも教えていただけると嬉しいです。 すみませんが、よろしくお願いします。
- ベストアンサー
- PHP
- 抽象クラスが継承されているかどうか検証したい
Class.forName()にて取得したクラスが、特定の抽象クラスを継承しているかどうかを 検証したいです。 Class.getInterfaces()にて、実装されているインターフェースを取得することが出来ましたが、 Class.getClasses()、Class.getDeclareClasses()のいずれでも、継承されている 抽象クラスを取得することが出来ません。 そもそも抽象クラスはインスタンス化できないからなのかもしれませんが、 ならば、その抽象クラス名称を取得したいです。 方法はありますでしょうか? 無理ならばインターフェースの実装にし、基盤部で動作のカバーを する作りで考え直すつもりです。
- ベストアンサー
- Java
- クラスメソッドのみのクラスのオブジェクト生成は不可??
あるテキストのjavaの問題です。 public class Draw{ static void pixel(int x,int y){ /*座標(x、y)に点を描画*/ } static void line(int x1,int y1,int x2,int y2){ /*座標(x1、y1)~(x2、y2)に線を引く*/ } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){ Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){ Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?
- ベストアンサー
- Java
お礼
回答ありがとうございました。 大変参考になりましたー