以下のようなソースを書いてみたのですが、
コンストラクタで定義したインスタンス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;
}
No.1ベストアンサー
- 回答日時:
まず
>コンストラクタで定義したインスタンス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;
}
}
さっそくの詳細な回答ありがとうございます。
ehogeがローカルにならないように、
コンストラクタの外で、
Hoge ehoge;とするべきだったんですね。
納得!
そのほかにもいろいろなテクニックをありがとうございます。
(1)クラス名は大文字
(2)フィールドはprivateにして直接アクセスさせない
(3)フィールドへのアクセス用にsetter,getterを用意
等大変勉強になります。
ところで、フィールドを直接アクセスさせないのはなんででしょう?
読み込みの時に間違えて書き込む恐れがあるからでしょうか?
常識レベルなのかもしれませんが、もし差支えなければコメント願います。
No.3
- 回答日時:
>ところで、フィールドを直接アクセスさせないのはなんででしょう?
情報の隠蔽化というものです。オブジェクト指向プログラミングでの重要な概念のひとつです。
たとえば、フィールドaには1から5までの値が設定されていないと正しく処理ができないとして
どこからでも自由にアクセス出来るようになっていると好きな値を設定することが出来てしまいます。
そこで、メソッドを通してでしか値を設定できないようにしておけば、
そこで値のチェックをすることができるので想定外の状態になることが防げます。
もちろん好き勝手に変更されてもいいような値なら直接アクセスできてもいいと思います。
上記はほんの一例なので、
「java カプセル化」とか「オブジェクト指向 カプセル化」で
検索するとためになるぺージが沢山ありますのでそちらを読んでみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java final 1 2022/06/10 22:49
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
Javaコンストラクタthisとsuper...
-
JTableのイベント取得方法
-
範囲外の数値を代入したらエラ...
-
内部クラスのインスタンスを外...
-
dllエクスポート時のdeclspec(d...
-
内部クラスのスコープについて。
-
アップキャスト、ダウンキャス...
-
無名パッケージからのインポート
-
プログラムの変数名にするとど...
-
dynamic_castの必要性
-
二つの変数の値を入れ替えるメ...
-
import と extends について
-
private変数を設定(Java)
-
eclipse3.0 元に戻す最大回数...
-
Tomcatのpropertiesファイルの...
-
VisualC++でクラスのヘッダーフ...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報