プロが教えるわが家の防犯対策術!

以下のようなソースを書いてみたのですが、
コンストラクタで定義したインスタンスehogeを
set_vのところで使おうとすると”ehogeを解決できません”
というエラーが出てしまいます。
初歩的な質問ですが、
ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか?

public class sample {
void sample(){
hoge ehoge=new hoge();
}
public static void main(String[] args) {
}
void set_v(){
int num=ehoge.value();
}
}
class hoge{
int value=1;
}

A 回答 (3件)

まず


>コンストラクタで定義したインスタンスehogeを
提示のソースにはコンストラクタがありませんが・・
>void sample(){
これはコンストラクタではありません。戻り値のないただのメソッドです。
コンストラクタとするなら
sample() {
としなければいけません。
で、上記の修正をしたとしても
>sample(){
>hoge ehoge=new hoge();
>}
これではehogeはローカル変数ですね。
コンストラクタの処理が終了したら消滅してしまいます。
インスタンスから使用したいのであればフィールドとして宣言しなければいけません。
で、上記の修正をしてとしても
>void set_v(){
>int num=ehoge.value();
>}
hogeクラスのvalueはメソッドではありませんね。
ここは
int num = ehoge.value;
としなければいけません。

最終的には
public class sample {
hoge ehoge;
sample() {
ehoge = new hoge();
}

public static void main(String[] args) {
}

void set_v() {
int num = ehoge.value;
}
}

class hoge {
int value = 1;
}
となります。
しかし、基本的には下記のように記述するのが望ましいかと思います。
public class Sample { //クラス名は大文字
private Hoge ehoge; //フィールドはprivateにして直接アクセスさせない
Sample() {
ehoge = new Hoge();
}

public static void main(String[] args) {
}

void set_v() {
int num = ehoge.getValue(); //フィールドへのアクセスはsetter,getterから
}
}

class Hoge { //クラス名は大文字
private int value = 1; //フィールドはprivateにして直接アクセスさせない
public int getValue() { //フィールドへのアクセス用にsetter,getterを用意
return value;
}
}
    • good
    • 0
この回答へのお礼

さっそくの詳細な回答ありがとうございます。

ehogeがローカルにならないように、
コンストラクタの外で、
Hoge ehoge;とするべきだったんですね。
納得!

そのほかにもいろいろなテクニックをありがとうございます。
(1)クラス名は大文字
(2)フィールドはprivateにして直接アクセスさせない
(3)フィールドへのアクセス用にsetter,getterを用意
等大変勉強になります。

ところで、フィールドを直接アクセスさせないのはなんででしょう?
読み込みの時に間違えて書き込む恐れがあるからでしょうか?
常識レベルなのかもしれませんが、もし差支えなければコメント願います。

お礼日時:2011/03/07 16:46

なんでメンバにしないんだろう.

    • good
    • 0

>ところで、フィールドを直接アクセスさせないのはなんででしょう?


情報の隠蔽化というものです。オブジェクト指向プログラミングでの重要な概念のひとつです。
たとえば、フィールドaには1から5までの値が設定されていないと正しく処理ができないとして
どこからでも自由にアクセス出来るようになっていると好きな値を設定することが出来てしまいます。
そこで、メソッドを通してでしか値を設定できないようにしておけば、
そこで値のチェックをすることができるので想定外の状態になることが防げます。
もちろん好き勝手に変更されてもいいような値なら直接アクセスできてもいいと思います。

上記はほんの一例なので、
「java カプセル化」とか「オブジェクト指向 カプセル化」で
検索するとためになるぺージが沢山ありますのでそちらを読んでみてください。
    • good
    • 0
この回答へのお礼

カプセル化の考え方で直接アクセスを防ぐということなのですね。
いろいろ勉強になります。
回答ありがとうございました。

お礼日時:2011/03/07 17:31

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