コンストラクタ内で定義したインスタンスの呼び出し

このQ&Aのポイント
  • コンストラクタ内で定義したインスタンスをコンストラクタ外でも使用する方法について教えてください。
  • コンストラクタ内で定義したインスタンスを外部で利用するための方法を教えてください。
  • コンストラクタ内で定義したインスタンスを他のメソッドで使用する方法について教えてください。
回答を見る
  • ベストアンサー

コンストラクタ内で定義したインスタンスの呼び出し。

以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンス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; }

  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答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; } }

armadillo26
質問者

お礼

さっそくの詳細な回答ありがとうございます。 ehogeがローカルにならないように、 コンストラクタの外で、 Hoge ehoge;とするべきだったんですね。 納得! そのほかにもいろいろなテクニックをありがとうございます。 (1)クラス名は大文字 (2)フィールドはprivateにして直接アクセスさせない (3)フィールドへのアクセス用にsetter,getterを用意 等大変勉強になります。 ところで、フィールドを直接アクセスさせないのはなんででしょう? 読み込みの時に間違えて書き込む恐れがあるからでしょうか? 常識レベルなのかもしれませんが、もし差支えなければコメント願います。

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

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

armadillo26
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

関連するQ&A

  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • クラスインスタンスとクラス型変数の配列

    C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。 最初にC++のサンプルを書かせていただきます。 ----- C++ ----- class Hoge {  /* 実装省略 */ } int main( void ) {  Hoge *hoge = new Hoge ;  Hoge *hoge = new Hoge[10] ; } --------------- これをJAVAで実装した場合、以下のようになると思います。 ----- JAVA ----- class Hoge {  /* 実装省略 */ } class Test {  public static void main( String[] args )  {   Hoge hoge = new Hoge() ; /* 1 */   Hoge[] hoge = new Hoge[10] ; /* 2 */  } } --------------- JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。 そうすると、 int[] a = new int[10] ; と、 Hoge[] hoge = new Hoge[10] ; のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。 私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラス名はどうするのですか?

    package ex7; public class Sample { public final static int VALUE = 100; } package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } 上記のプログラムのクラス名は何をつければいいですか・・・? 同じくプログラム名は何と付ければいいですか・・・? ご多忙中恐れいります・・・。 ご回答の程宜しくお願い申し上げます。 回答者 これが、素人さんには分かりにくいんですね。 mkdir ex7 で、ex7 というディレクトリを作製して、 その中に、 Sample.java を public class Sample { public final static int VALUE = 100; } で、 Main.java を package ex7; import static ex7.Sample.VALUE; public class Main { private final static int VALUE = 0; public static void main(String[] args) { System.out.println(VALUE); } } で作製して、 ex7 の中から出て、 javac ex7/Sample.java javac ex7/Main.java でコンパイルします。 質問者 度々すいません・・・。 ファイル名は何にすればいいですか・・・? ご回答がなかなか来ません。

    • ベストアンサー
    • Java
  • 初歩的な メソッドの引数について

    参考書のサンプルなんですが、 Carクラスのメソッドの引数のところで num = n と代入しているのですが、 これを直接void setNum(int num)としたほうがらくだと思うのですがなにか意味があるのでしょうか? class Sample4{ public static void main(String args[]){ Car car1 = new Car(); car1.setNum(33); } } class Car{ int num; void setNum(int n){ num = n; System.out.println("台数" + num); } }

    • ベストアンサー
    • Java
  • コンストラクタについて

    これも試験問題らしくて自分でやってみましたのであってるかどうか自信なくて どなたかみてみていただけたらと思います.よろしくお願いします。 下のソースファイルをコンストラクタを用いたものに修正しなさい class Sconst{ int x,y,z; void print(){ System.out.println(x); System.out.println(y); System.out.println(z); } } class ExConstTest{ public static void main (String[] args ){ Sconst sc=new Sconst(); sc.x=10; sc.y=30; sc.z=5; } } ------------------------------------------------------------- class Sconst{ int x,y,z; Sconst(){ x=10; y=30; z=5; } } class ExConstTest{ public static void main (String[] args ){ Sconst a1; Sconst a2; Sconst a3; a1=new Sconst(); a2=new Sconst(); a3=new Sconst(); System.out.println(a1.x); System.out.println(a2.x); System.out.println(a3.x); } }

    • ベストアンサー
    • Java
  • コンストラクタ

    恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{    Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?

    • ベストアンサー
    • Java
  • ガーベッジコレクションについて

    ガーベッジコレクションについて勉強してるんですが、定義は理解できたんですが、以下のプログラムの意味が全く理解できません。どこからどこにいってるのかがさっぱりです。簡単にでもいいんで、このプログラムの流れを教えていただけませんか? 特にgetObject(); System.gc();の意味を教えてもらえるとありがたいです。 コンストラクタ、インスタンスなどは理解しています。 class Garbage01{ static int num = 0; public Garbage01(){ num++; } public void finalize(){ num--; } } public class Garbage01Use{ public static void main(String[] args){ Garbage01 g = null; for(int i = 0 ; i < 10; i++){ g = new Garbage01(); } System.out.println(Garbage01.num); getObject(); System.gc(); System.out.println(Garbage01.num); } private static void getObject(){ for(int i = 0 ; i < 100000000 ; i++){    new Object(); } } }

    • ベストアンサー
    • Java
  • 問題が解けません(インスタンスメソッド)

    こんにちは。 課題をやっているのですが、問題が解けません。 問題内容です。 以下のクラス図で示したRectangleクラスを作成し、実行結果と同じに なるようにメソッドを作成する。 クラス図 Rectangle -width:ing -height:int ----------- Rectangle() Rectangle(w:int,h:int) getArea():int ------------- 問題文 getArea()メソッドでは面積の計算をする(高さ×幅) コンストラクタRectangle()ではwidthとheightに初期値0を設定。 main()メソッドでは標準入力より幅、高さを整数として受け取り コンストラクタの引数とする。 実行結果 >10 >20 インスタンスr1の面積は200 >123 >45 インスタンスr2の面積は5535 -------------------------- 途中経過 import java.io.*; class Rectangle{ public static int sum=0; private int width; private int height; public Rectangle(){ width=0; height=0; sum++; } public void Rectangle(int w, int h){ width=w; height=h; } public void getArea(){ int num; num=width*height; System.out.println("r" + sum + "インスタンスの面積は" + num); } } class Ex54{ public static void main(String args[]){ BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); String wid = input.readLine(); String hei = input.readLine(); Rectangle rectangle1 = new Rectangle(); rectangle1.Rectangle(wid, hei); } } 「現在の問題点」 UML図の通り記述できているか自信がありません。 rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。 r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。 どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    入社1年目のプログラミング経験0のSEです! Javaのクラスとインスタンスについてぜんぜん理解できません! 下のソースをどうしたらいいのかわからないです。 import java.io.*; class SumAndAvgMain{ public static void main(String argv[]){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in),1); try{ //3教科の得点を入力しintに変換 //SumAndAvgクラスのインスタンスを作成 //合計点及び平均点を出力する。 }catch(IOException e){ System.out.println("例外発生"+e); } } } class SunAudAvg{ public static void main(String args[]){ //各教科の得点用のフィールド int kokugo; int suugaku; int eigo; //SumAndAvgクラスのコンストラクタ SumAndAvg(int kokugo,int suugaku,int eigo){ //フィールドに国語の点数を代入 //フィールドに数学の点数を代入 //フィールドに英語の点数を代入 } //3教科の合計点を求める int getGoukei(){ } //3教科の平均点を求める double getHeikin(){ } }

  • インスタンスの情報表示について

    Java初心者です。 例えば次のようなソースがあって、double型の変数numの情報を表示するためにtoStringをオーバーライドするとすると、どのようにすればStringを返せるのでしょうか。 public class Test { private double[] num; public Test(double a, double b, double c) { num = new double[3]; this.num[0]=a; this.num[1]=b; this.num[2]=c; } public toString() { // return "インスタンスは: "+ } public static void main(String args[]) { Test a = new Test(4.3, 5.6, 12.7); System.out.println(a.toString()); } }

専門家に質問してみよう