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

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

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

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

Q&A

解決済

4回答

5925閲覧

javaのstaticメソッドから同じクラス内のインスタンス変数の参照方法について

take_take

総合スコア21

Java

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

0グッド

0クリップ

投稿2017/03/04 14:59

###前提・実現したいこと
なぜ同じクラス内のインスタンスメソッドはインスタンス変数をそのまま
参照できるのに対し、staticメソッドからインスタンス変数を参照する場合
にはインスタンスを生成しなければならないのでしょうか。
宜しくお願い致します。

###発生している問題・エラーメッセージ
staticでない変数xをstaticコンテキスト内から参照することはできません

###該当のソースコード
class Sample1 {
public static void main(String[] args) {
Sample2 instanceA = new Sample2();
System.out.println(Sample2.getVal1());
System.out.println(Sample2.getVal2());
}
}

class Sample2 {
int instanceVal = 100;

public int getVal() { return instanceVal; } **public static int getVal2() { return instanceVal; }**

}

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答4

0

例えばの話として、テレビを思い浮かべてください。
「テレビのチャンネルを変える」と言った場合、操作の対象となるテレビがないと「チャンネルを変える」という操作はできませんよね?「音量を変える」という操作も、対象のテレビがないと話になりませんよね?このように、操作の対象があって起動されるメソッドが非staticメソッド(=インスタンスメソッド)です。
一方、「何のチャンネルがあるかを調べる」場合、(地域が一緒なら)どのテレビだろうと、極端な話テレビがなくても、新聞などで知ることができますよね。このように、特定の対象を必要としないメソッドがstaticメソッドです。
「特定の対象を必要としない」ため、staticメソッドは対象となるインスタンスがないものとして起動します。対象のテレビを必要としないという仕事なのに、「対象のテレビの操作をしろ」とは言えないわけです。

投稿2017/03/04 16:45

swordone

総合スコア20651

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

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

take_take

2017/03/04 16:52

例がとても分かりやすかったです。ご回答有難うございます!
guest

0

ベストアンサー

非staticフィールド(=インスタンス変数)は文字通り「特定のインスタンスの中に存在するフィールド」ですので「どのインスタンスか」を特定しなければ「そのフィールド(インスタンス変数)がどこにあるかがわからないので」アクセスできません。

非staticメソッドは特定のインスタンスに対してしか起動できないものであり、かつ起動された際にはどのインスタンスに対して起動されたかをthisを通じて明示的(または暗黙的に)アクセスできます。非staticフィールドはメソッドの起動対象であるthisを介してアクセスできます。

一方staticメソッドは特定のインスタンスを仮定せずに起動するものであり、起動の際には起動対象のインスタンスを表すthisは使えないものです。ゆえにstaticメソッドからは非staticフィールド(=インスタンス変数)はアクセスできません。

投稿2017/03/04 16:30

編集2017/03/04 16:33
KSwordOfHaste

総合スコア18394

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

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

take_take

2017/03/04 16:36

理解出来ました!有難うございます!
guest

0

staticメソッドからどのインスタンスの変数にアクセスしたいのかコンパイラが判別できないためです。

クラス「Sample2」は1つしか作成することができませんが、インスタンスはクラス「Sample2」をもとに「instanceA」、「instanceB」、「instanceC」のように複数作成することができます。
今回はたまたま1インスタンス「instanceA」しか作成されていないので理解しにくいと思いますが、上記の通り「インスタンスは1クラスから複数作成することができる」というところがポイントとなります。
また、インスタンス変数やインスタンスメソッドは、各インスタンスごとに存在します。
一方、static変数やstaticメソッドは、各インスタンスには存在せず、クラスをいくらインスタンス化してもクラスに1つしか存在しません。

上記を踏まえた上で、
例えば「Sample2」から複数のインスタンス「instanceA」、「instanceB」、「instanceC」を作成した場合、「instanceAのinstanceValとgetVal()」、「instanceBのinstanceValとgetVal()」、「instanceCのinstanceValとgetVal()」といった感じで変数とメソッドが各インスタンスにセットで割り当てられます。
各インスタンスメソッドからはセットになっているインスタンス変数をそのまま参照できます。
一方、クラス「Sample2」に1つしかない(各インスタンスには存在しない)staticメソッド「getVal2」からは、どのインスタンスの変数を参照したいのかわからないためエラーとなります。

投稿2017/03/04 16:54

xenbeat

総合スコア4258

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

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

take_take

2017/03/04 17:01

ご回答有難うございます。複数のインスタンスを作成してもう一度確認してみます!
guest

0

java

1class Sample{ 2 Private int i; 3 public Sample(int value){ 4 this.i = value; 5 } 6 7 public getValue(){ 8 return i; 9 } 10 11 public static Test(Sample c){ 12 Sample a = new Sample(1); 13 System.out.println(a.GetValue()); // 1 が表示される 14 15 Sample b = new Sample(2); 16 System.out.println(b.GetValue()); // 2 が表示される 17 18 System.out.println(a.GetValue()); // やっぱり 1 が表示される(bによって上書きされない) 19 20 System.out.println(this.i); // static メソッドは a でも b でも無いのでエラー 21 } 22}

インスタンスが別ならインスタンス変数も別という点を思い出してください。(多分、以前に学習しているハズ)

staticメソッドはインスタンスを必要としません。逆を言うとインスタンスを指定せずに実行されるので、どのインスタンス変数を参照して良いのか判らずにエラーとなります。

上記のコードで示したとおり、同じクラスのインスタンスは1つとは限らないのです。したがって、変数を使うためにはいずれかのインスタンスが必要となります。

投稿2017/03/04 16:52

iwamoto_takaaki

総合スコア2883

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

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

take_take

2017/03/04 17:00

ご回答有難うございます。ソースコードも載せて頂いたので分かりやすく感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問