僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。

public class A
......main.....

class B extends Frame{
  public B(String stitle){
   super(stitle);
 }
}

super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、

class Car
{
  private int num;
  private double gas;

  public Car()
  {
   System.out.println(車を作成しました。)
  }
}

class C
{
....main...
  {
   Car car1=new Car();
  }
}

この場合の実行結果というのは、
「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。

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

A 回答 (2件)

最初に、へんなことを回答していたらすみません。

(先に謝っておこう・・・(^^ゞ)
まず、前者のクラスAですがAクラスのなかでBクラスという子供のクラスを作成しています。
おそらくAクラス内ちょっと手を加えた(継承した)FrameBクラス
を使用したかったのでしょう。そこにはありませんがAクラスの
コンストラクタが本当はあるはすです。
後者のCarクラスはCarクラスのコンストラクタが記述してありますね。
迷ってしまったのは前者にAクラスのコンストラクタがなかったからじゃないかなと思いますが間違っていますか?

また「実行処理するのための定義」というお話がありますが、コンストラクタ内はそう考えるよりも
「クラス自身がとりあえず最初にしておくことを書く」
と考えたほうがいいと思います。本来ユーザ(PGを作る人)
はコンストラクタ内をそれほど意識する必要がないからです。

例えばFrame( String title )を考えてみましょう。
Frame frame = new Frame( "たいとる君" );
としたら新しく作られるframeのタイトルは「たいとる君」になります。
ここでの「とりあえずしておくこと」は「とりあえずタイトルをつけておこう」と言うことになります。
ユーザはどうやってタイトルが「たいとる君」にセットされるのかは
深く知る必要がなく「このコンストラクタを実行すれば勝手にタイトルがセットされるのだ
ということさえ知っておけばいいのです。

ちなみにコンストラクタ内の定義などを知りたい場合はJBuilderなんかを使うとクラス内に
何が書いてあるのか見えちゃったりすると思いました。
(もっといい方法があるかも&うそだったすいません)

この回答への補足

たいとる君、分かりやすい例ですね。(笑)
なるほど、実行処理するための定義はそれほど気にしなくてもよかったんですね。でも、やっぱり気になる。(笑)

xinmanさんのおかげでFrameクラスのコンストラクタの定義が具体的にどのように記述されているのかがわかりました。そして実際にコンストラクタを使う際にはそれほどコンストラクタを意識しなくても良いのだということがct27さんのご説明でわかりました。たぶん理解できたは思いますが、また同じ所でつまずいてしまったら再び似たような質問をさせていただくことと思います。その時はどうぞよろしくお願いします。

補足日時:2001/02/26 20:40
    • good
    • 0

質問拝見させていただきました。


現役のJavaプログラマです。
早速Frameクラスの定義を見てみたのですが
コンストラクタの部分だけ抜粋すると
public class Frame extends Window implements MenuContainer {
public Frame() {
this("");
}
public Frame(String title) {
this.title = title;
visible = false;
setLayout(new BorderLayout());
weakThis = new WeakReference(this);
addToFrameList();
}
}
このように記述されていました。
これって、”実行処理するための定義”だと思うんですけどfumi11さんはどう思われます?
わからないところがあれば補足してください。

ちなみに私の使用している開発環境はVAJ3.5を使用しています。

この回答への補足

JavaSoft社のHPを見てみると、Frameクラスのコンストラクタの詳細は次のように書かれていました。

Frame()
初期状態で可視ではない Frame の新しいインスタンスを生成します。

Frame(GraphicsConfiguration gc)
スクリーンデバイスの指定した GraphicsConfiguration がある Frame を作成します。

Frame(String title)
指定されたタイトルで、初期状態で可視ではない新しい Frame オブジェクトを構築します。

Frame(String title, GraphicsConfiguration gc)
指定されたタイトルと GraphicsConfiguration で、最初は不可視である新しい Frame オブジェクトを構築します。


これを見て僕は思ったんですけども、Frame()の説明として「初期状態で可視ではない Frame の新しいインスタンスを生成します。」とは書いてあるものの、具体的な中身というか、実行処理するための定義がされてないではないか!!と思ったわけです。

でもxinmanさんのおかげで、Frameクラスのコンストラクタの定義がきちんとあることがわかりました。そこでお聞きしたいのですが、僕が使っているSDK1.3ではコンストラクタの定義をどうやって調べればいいのでしょうか?僕が調べたJavaSoft社のHPでは、先ほど述べたようなことしか書かれていなくてコンストラクタの定義らしい定義が見つからないのですが・・・。

補足日時:2001/02/26 18:41
    • good
    • 0

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

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

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Qpublic class Power {

public class Power {
static long pow(int a, int b){
if (b<=0)
return 1;
else
return a*pow(a,b-1);
}
public static void main(String args[]){
System.out.println(pow(1,3));
}
}

run:
1
BUILD SUCCESSFUL (total time: 0 seconds)

簡単な問題ですが。。。
僕の予想では答えは2でした

1 * (1, 2)
1 * 1 * 2
じゃないんですか?

Aベストアンサー

いえ、

pow(1,3)
= 1 * pow(1,2)
= 1 * 1 * pow(1,1)
= 1 * 1 * 1 * pow(1,0)
= 1 * 1 * 1 * 1 = 1です。

#ちなみに…例えば
pow(3,2)
= 3 * pow(3,1)
= 3 * 3 * pow(3,0)
= 3 * 3 * 1
= 9
となります(上記が1の4乗として計算されているんじゃなくて(1の3乗) * 1だという印象をつけたかったので例を出した)

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Qコンストラクタと静的メソッドを簡単に定義する

立て続けに質問することをお許し下さい。。

以下のようなPersonクラスがあるとします。
/**** Person クラス(全角スペース表記) ****/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<HTML>
 <HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
  <META HTTP-EQUIV="Content-Script-Type" CONTENT="javascript">
  <TITLE>教えて!gao</TITLE>
  <SCRIPT TYPE="text/javascript">
   function Person(name, age, sex, color) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    this.color = color;
   }
   Person.prototype = {
    name:null,
    age:null,
    sex:null,
    color:null
   };
   Person.YELLOW = "黄色人種";
   Person.BLACK = "黒色人種";
   Person.WHITE = "白色人種";

   function test() {
    var person = new Person("ggaogg", 23, "male", Person.YELLOW);
    var resultBlock = document.getElementById("resultBlock");
    for (property in person) {
     resultBlock.appendChild(document.createTextNode(property + " = " + person[property]));
     resultBlock.appendChild(document.createElement("BR"));
    }
   }
  </SCRIPT>
 </HEAD>
 <BODY ONLOAD="test()">
  <DIV ID="resultBlock"></DIV>
 </BODY>
</HTML>
/********************************************************/
これの実行結果は、以下の通りです。
name = ggaogg
age = 23
sex = male
color = 黄色人種

しかし、静的変数を、毎回「Person.」を付けて記述するのは面倒で、すべて{}でひとくくりになっていたほうが可読性も増すと思い、以下のようにできると思いましたが、そうしたところ
new Person("ggaogg", 23, "male", Person.YELLOW);
の部分がコンストラクタではないというようなエラーとなってしまいます。(Web等でこの書き方はあまり見かけないが自分は気に入っている)
/************ 変更した部分 ******************/
Person = {
YELLOW : "黄色人種",
BLACK : "黒色人種",
WHITE : "白色人種"
};
/********************************************/

多分、初めに行ったコンストラクタの定義とこの{}の定義とが競合しているためだと思うのですが、何かよい書き方ありませんでしょうか。

立て続けに質問することをお許し下さい。。

以下のようなPersonクラスがあるとします。
/**** Person クラス(全角スペース表記) ****/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<HTML>
 <HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
  <META HTTP-EQUIV="Content-Script-Type" CONTENT="javascript">
  <TITLE>教えて!gao</TITLE>
  <SCRIPT TYPE="text/javascript">
   function Person(name,...続きを読む

Aベストアンサー

あ、質問がなんとなくわかりましたが、説明が難しい。

/* 書換え前 */
Person.YELLOW = "黄色人種";
Person.BLACK = "黒色人種";
Person.WHITE = "白色人種";

の部分だけを

/* 書換え後 */
Person = {
YELLOW : "黄色人種",
BLACK : "黒色人種",
WHITE : "白色人種"
};

と単に簡略化したいと言う事でしょうか?

書換え後の方法でPersonに後から追加してるつもりなら、
この書き方では『追加』にならずに新たな Person 変数(オブジェクト)を定義してるだけ。
同じ名前を持つ コンストラクタ function Person(){} がこの時点で消滅します。
また、prototypeで追加の形をとれば、それらはコンストラクタとして呼ばれた時に全てを生成してしまいます。

そもそも書換え前の時点でも Personをコンストラクタとして用意しながら、
オブジェクトとして別利用(間借りしてるような物)してるので、それ自体が目的とする意図ともしかしたらずれてるかもしれないと思います。

コンストラクタとなる function Person の中で #2の方法などで
this.colorを定義する時に 引数colorの値に応じて動的に定義させるか、

colorに渡す引数を別の場所でオブジェクトとして定義しておきたいなら、
col = {
YELLOW : "黄色人種",
BLACK : "黒色人種",
WHITE : "白色人種"
};

var person = new Person("ggaogg", 23, "male", col.YELLOW);
の様に Personではなく、別の名前にすれば普通に成り立ちます。

ちょっと考えすぎて迷路に入ってませんか? ^^;

あ、質問がなんとなくわかりましたが、説明が難しい。

/* 書換え前 */
Person.YELLOW = "黄色人種";
Person.BLACK = "黒色人種";
Person.WHITE = "白色人種";

の部分だけを

/* 書換え後 */
Person = {
YELLOW : "黄色人種",
BLACK : "黒色人種",
WHITE : "白色人種"
};

と単に簡略化したいと言う事でしょうか?

書換え後の方法でPersonに後から追加してるつもりなら、
この書き方では『追加』にならずに新たな Person 変数(オブジェクト)を定義してるだけ。
同じ名前を持つ コンストラク...続きを読む

Qコンストラクタの問題がわかりません。

自分で考えたり、調べたりしながら自分なりの答えを作ってみたのですが、どうも間違っているようです。
あとどこを修正すればいのか教えてください。
よろしくお願いします。

Vendingクラスを,飲み物の値段を表現するクラス変数priceを使うように書き直しなさい。
また、メソッドpushの返り値をbooleanにして、
買うことができたらtrue,出来なかったらfalse
を返すようにしなさい。

import java.io.*;

class testV{
public static void main(String arg[]){
BufferedReader input=
new BufferedReader(new InputStreamReader(System.in));

Vending v=new Vending();

String line;
try{
System.out.print("投入する金額を入力(マイナスなら終了)");
while((line=input.readLine())!=null){
int mon=Integer.parseInt(line);
if (mon < 0) {
break;
}
System.out.println("==>"+mon);
v.enter(mon);
v.push();
System.out.print("投入する金額を入力(マイナスなら終了)");
}
}catch(IOException e){
}
}
}

自分で考えたり、調べたりしながら自分なりの答えを作ってみたのですが、どうも間違っているようです。
あとどこを修正すればいのか教えてください。
よろしくお願いします。

Vendingクラスを,飲み物の値段を表現するクラス変数priceを使うように書き直しなさい。
また、メソッドpushの返り値をbooleanにして、
買うことができたらtrue,出来なかったらfalse
を返すようにしなさい。

import java.io.*;

class testV{
public static void main(String arg[]){
BufferedReader input=
...続きを読む

Aベストアンサー

では,次のようになると思います.

public class Vending {
static int price = (飲み物の値段);

(中略)

public void enter(int money) {
(お金の投入時の処理)
}

public boolean push() {
if(買える) { // この判定にpriceを使用
(買ったときの処理)
return true;
} else {
(買えないときの処理)
return false;
}
}
}


人気Q&Aランキング

おすすめ情報