質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

17902閲覧

別クラスからのgetter呼び出しについて

corazon

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/09/23 03:16

編集2016/09/23 03:46

privateで宣言した変数とそれの getter setterを作成したクラスがあり、
別のクラスからgetterを呼び出して実行した際に、値が入らずnullになってしまいます。

試しに同じクラス内で、getterを呼び出したときは正しく値が取得できているみたいです。

public class A { private File document; public void hoge(){ File file = getDocument(); //ここには変数が正しく設定される File file = document; //1行上と同じ結果 } public File getDocument() { return document; } public void setDocument(File document) { this.document = document; } }
public class B { public void execute(){ A a = new A(); File file = a.getDocument(); //ここでは値が設定されずnullになる } }

正直、正しく理解してないと思うので説明もおかしいかもしれません。。
どなたかご教授頂けたら幸いです。。

・・・
追記:失礼しました。ご指摘頂いた箇所につきまして、編集しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moonphase

2016/09/23 03:23

コードは ``` で囲ってください。
moonphase

2016/09/23 03:24

あと、同じクラス内で値が取得されている場合のコードも記載してください。
guest

回答3

0

ベストアンサー

クラスAのコンストラクタで、documentの値の初期化は行っていますか?
クラスBのexecute()の内容が提示されているものだけで、クラスAのコンストラクタでも初期化を行っていないのなら、setDocument()で値の設定を行っていないのでnullになるのは正常な動作です。

クラスBのexecute()内では、クラスAのインスタンスを新たに生成しています。
このインスタンスはexecute()を実行する際に初めて生まれた実体です。
たとえクラスBの外側で一度クラスAのインスタンス(仮にa2)を生成していても、それとは別の実体になるので、documentの値は初期化時のままです。

Java

1 2public void main(){ 3 4File documentFile = new File(); 5A a2 = new A(); 6a2.setDocument(documentFile); 7//a2が指すインスタンスに、documentFileを設定 8 9B b = new B(); 10b.execute(); 11//exexute()の中でAのインスタンス a を生成するが、 12//これは上のa2とは別の存在なので、documentFileを持ってはいない 13 14} 15

投稿2016/09/23 03:49

編集2016/09/23 03:54
KaedeKazane

総合スコア408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

corazon

2016/09/23 07:48

そうですね・・・。 コンストラクタは作ってないと思います。 新しく生成されたインスタンス内でセッターが行われてないから=nullということですよね。 クラスBで新しいインスタンスを生成せずにクラスAの変数documentを他クラスから直接使用できるようにすることもできますよね。 そちらの線で試行錯誤してみようかなぁ。 ご回答ありがとうございます。大変参考になりました。
KaedeKazane

2016/09/23 08:45

>クラスBで新しいインスタンスを生成せずにクラスAの変数documentを他クラスから直接使用できるようにすることもできますよね。 直接使用というと語弊があるかもしれません。 変数documentはクラスA(のインスタンス)に属している変数なので、操作は基本的にクラスAのインスタンスを介して行われます。 どちらかと言えば、「既に変数documentに値を持っているAのインスタンスから情報をもらう」、という考え方です(例の場合は a2 から)。 クラス間での値の受け渡しや相互利用は、オブジェクト指向の理解が曖昧だと混乱するかもしれません。 この辺りに不安があれば、いちど通して解説している参考書等を読むことをおすすめします。
guest

0

うまく行ってる方の呼び出し元では、A#setDocumentを呼んでいると思いますが・・・
あと、うまく行ってる方はコンパイルエラーになりませんか?変数が重複定義されています。

File file = getDocument(); //ここには変数が正しく設定される File file = document; //1行上と同じ結果

投稿2016/09/23 03:52

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

corazon

2016/09/23 04:03

あ、失礼しました。 変数は変えてます。 たしかにこれでやるとコンパイルエラーになります。
guest

0

setDocumentで値を設定してないからnullになっているだけでは?

投稿2016/09/23 03:25

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問