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

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

ただいまの
回答率

90.50%

  • Java

    13798questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,123

take_take

score 15

前提・実現したいこと

なぜ同じクラス内のインスタンスメソッドはインスタンス変数をそのまま
参照できるのに対し、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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/05 01:36

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/05 01:52

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

    キャンセル

0

class Sample{
    Private int i;
    public Sample(int value){
        this.i = value;
    }

    public getValue(){
        return i;
    }

    public static Test(Sample c){
       Sample a = new Sample(1);
       System.out.println(a.GetValue()); // 1 が表示される

       Sample b = new Sample(2);
       System.out.println(b.GetValue()); // 2 が表示される

       System.out.println(a.GetValue()); // やっぱり 1 が表示される(bによって上書きされない)

       System.out.println(this.i); // static メソッドは a でも b でも無いのでエラー
    }
}

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/05 02:00

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

    キャンセル

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/05 02:01

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13798questions

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