こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

クラスメソッドのみのクラスのオブジェクト生成は不可??

あるテキストの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つ記述できないんではありませんでしたか?

投稿日時 - 2004-04-11 16:02:36

QNo.828644

困ってます

質問者が選んだベストアンサー

> (1)も正解のような気がするのですが・・・
> 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。
> どうもいまいち理解できません。

「Draw d = new Draw().line(10,10,20,30);」はDrawクラスのオブジェクトを生成して
lineメソッドを呼び出し、その戻り値を変数 d に代入しているわけですが、
lineメソッドの戻り値がvoidなのでエラーになります。

「new Draw().line(10,10,20,30);」はDrawクラスのオブジェクトを生成して
lineメソッドを呼び出しているだけなので問題ありません。

> クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない
> ということなのでしょうか?

オブジェクトが生成できないのではありません。

Draw d = new Draw(); // オブジェクト生成
d.line(10,10,20,30); // lineメソッド呼び出し

> それからちなみに、public classって2つ記述できないんではありませんでしたか?

javaではpublic宣言したクラス名とファイル名は一致していなければならないので、
1つのソースファイルにpublic classを複数記述することはできません。

この問題の場合、Draw.javaとTestDraw.javaに分けて記述します。

投稿日時 - 2004-04-11 19:56:16

お礼

お早い回答ありがとうございます。

Drawであるdにvoidは代入できないということですね。

互換性の無い型、というやつでしょうか。

>javaではpublic宣言したクラス名とファイル名は一致していなければならないので、 1つのソースファイルにpublic classを複数記述することはできません。 この問題の場合、Draw.javaとTestDraw.javaに分けて記述します。


そうですよね!
問題文にはDrawクラスをこのように起動した、としか書いておらず、ちょっと説明不足のようなきがしました。

それと、別にpublicクラスでなくても良いような(たんにclassでもよいのでは?)気がしたのですが、いかがでしょうか?
(どちらのクラスとも)

投稿日時 - 2004-04-11 21:16:03

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

UKY

> それからちなみに、public classって2つ記述できないんではありませんでしたか?

Java言語仕様では、ソースコードがファイルとして保存される場合、publicクラスの名前と同じ名前のファイル名にしなければならないというような制限を設けてもよいということになっているだけですので、絶対にpublicなクラスを二つ以上記述できないというわけではないです。

ただほとんどの環境ではソースコードはファイルとして保存されるので、このような制限に従ってコンパイラが動作するのが当たり前ということになっています。

// まあ、こんなこと知らなくてもぜんぜん問題ないんですけどね。(^^;
// ちなみに、ファイルとして以外の方法でソースコードを保存する方法があるのかというと、私もよくわかっていません。

投稿日時 - 2004-04-11 20:59:18

お礼

いつもありがとうございます。

でもpublic2つ記述してしまうとコンパイルエラーですよね・・・

言語仕様ではOKと言うことですね・・・

参考になりました。ありがとうございました

投稿日時 - 2004-04-12 22:18:20

あなたにオススメの質問