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

締切り済みの質問

クラスの宣言について

Javaの初心者です。
webを探してもも良いサンプルが見つからなかったので、
詳しい方いらっしゃいましたらご教授ください。

以下、私の疑問です

****************************

class AAA{
BBB bbb;
void func(){
bbb = new BBB(); // コメント1
bbb.i = 10; // コメント2
}
}

class BBB{
int i;
}

****************************

お粗末なサンプルで申し訳ありません。
私の認識では、クラスAAAのfuncメソッドでコメント1の行の処理は
必須と思っていますが正しいでしょうか?
それともコメント1の行はなくても、コメント2の行の処理は実行
できるのでしょうか?
この「new」の必要性と理由が分からずにパニックになってます。
どなたかよろしくお願い致します。

投稿日時 - 2010-01-05 22:24:24

QNo.5570572

すぐに回答ほしいです

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

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

回答(3)

ANo.3

#2です。

誤記に気づいたため訂正しておきます。

>理由2:

>bbb = new Object();

↑ここが誤りで
スーパークラスのインスタンスを
サブクラスの変数に参照を渡すことはできません。

サブクラスのインスタンスを
スーパークラスの変数に参照を渡すことができることと
頭がこんがらがっていました。お恥ずかしい。。。

例は誤りですが、理由2の冒頭で述べていることは
間違いではありません。

すなわちクラスBBBの変数bbbは
クラスBBBを継承したクラスのインスタンスが
格納される可能性があるということです。

投稿日時 - 2010-01-08 02:58:16

ANo.2

> コメント1の行の処理は必須と思っていますが正しいでしょうか?

正しいです。

> コメント1の行はなくても、コメント2の行の処理は実行できるのでしょうか?

できません。

> 「new」の必要性と理由

理由1:
コンストラクタが複数存在する場合、
どのコンストラクタを使用すればよいのか
システムが分からないからです。

クラスBBBを次のように書き換えて見ます。

class BBB {

int i;

public BBB() {
}

public BBB(int j){
i = j;
}

}

この場合、どちらでBBBのインスタンスを生成したいのか
システムには分かりません。
予め決めた方で自動作成するようにしておけば
良いような気もするかもしれませんが
そうすると、自動作成したインスタンスが使われなかった場合に
メモリを余計に消費することになってしまいます。


理由2:
「変数bbb」が参照するインスタンスは
必ずしも「クラスBBB」のインスタンスとは限らないからです。
例えば

bbb = new Object();

としても問題はありません。
※もちろん今回の場合は次の行(bbb.i = 10;)でエラーになりますが‥。


番外:
上記で示したような理由が聞きたいわけではなくて
「なぜnewキーワードが必要なのか?(newなんて無くてもいいのでは?)」
という問いかけならば理由は簡単で
プライベートメソッドと同名のクラスが存在する場合に困るからです。

投稿日時 - 2010-01-06 19:20:40

ANo.1

BBB bbb;
は、オブジェクトの入れ物を定義しているだけです。
ですから、中身はからっぽなので、コメント1で中身(BBBのオブジェクト)を入れてあげるわけです。
でないと、コメント2はエラーになります。
たぶんコンパイル時にエラーになってコンパイルできないと思います。

投稿日時 - 2010-01-06 00:56:02

あなたにオススメの質問