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

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

ただいまの
回答率

88.91%

staticでない変数 をstaticコンテキストから参照することはできませんと出ます。

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 25K+

atfamic

score 12

package tetris;

import tetris.frame.*;
import tetris.event.*;
import tetris.block.*;
import javax.swing.*;

public class Index{
  public GameFrame gameFrame;
  public FallBlock fallBlock;
  public static void main(String[] args){
    this.gameFrame=new GameFrame("Javaによるテトリス制作");
    gameFrame.reset();
    gameFrame.setBlock();
    this.fallBlock=new FallBlock();
  }
}

このプログラムをコンパイルしようとするとgameFrameのコンパイルの時に「static出ない変数gameFrameをstaticコンテキストから参照することを出来ません」と表示されます。

このエラーを回避するにはgameFrameをstaticで宣言するしかないのでしょうか??何か回避方法があればお教えください!!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

エラーメッセージの通り、非staticフィールドはstaticメソッド上で使用できません。これはstaticの意味を知っているならば自明のはずです。以下大雑把な区別です。

非staticフィールド、メソッド:オブジェクトの数だけ個別に用意されるもの
staticフィールド、メソッド:(特定のオブジェクトに属さず)クラスで一つしか存在しないもの

「回避するには」と仰られておりますが、そもそも何をしたいのか整理することをお勧めします。「非staticフィールドはstaticメソッド上で使用したい」ということ自体起こりえないはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/08 22:03

    回答有難うございます。

    私はこのプログラム中において、gameFieldという変数を用意しその変数を各種プログラムから呼び出すという構成にしたく、さらにstaticを用いて実行時からメモリを確保して生成するのではなくstaticメソッド上で必要になったらインスタンスを順次生成するようにしたいのです。。(メモリ消費を抑えたくて、、、)

    また、staticというものの私の認識は、「プログラム作動時にメモリ上にそのメンバを生成する」というものなのですがこの認識は正しいのでしょうか??

    実はこのエラーには前から悩まされており、できればその原因をしっかりと理解して対処できるようになりたいのです。。

    迷惑おかけいたしますがもしよろしければ回答の方お願いいたします。。

    キャンセル

  • 2017/05/08 22:15

    はい。その認識は正しいです。したがって、staticメンバは、オブジェクトの数が0であっても2以上でであってもが必ず1つです。(メンバ1つにごとに)一方非staticメンバはオブジェクトの数だけ用意されます。

    したがって、仮に「staticメンバから非staticメンバをアクセスする」ことを考えた場合、どれにアクセスすれば良いか確定しないですし、そもそも存在しない可能性もあります。(オブジェクトの数は2以上かもしれないですし、0かもしれない)このため、「staticメンバから非staticメンバをアクセスする」ことは不可能です。

    キャンセル

  • 2017/05/09 13:08

    回答有難うございます。

    なるほど。ということはつまりstaticなメソッドに属しているgameFieldインスタンスがstaticでなければならないのですね。。。
    しかしそうなるとgameFieldに属しているメンバの属性はどのようになるのでしょうか??やはりstaticなメンバとして定義しなくてはならないのでしょうか??

    キャンセル

+1

mainメソッドを持つクラス Index は通常インスタンス化されないので、インスタンスフィールド gameFrame、fallBlock を持つ意味はありません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

staticメンバはインスタンスに紐づくメンバ、
非staticメンバはインスタンスに紐づかないメンバです。
mainメソッドはstaticメソッドなのでインスタンスに紐づきません。
したがって、「このインスタンス」という意味のthisが指すものが存在しません。

解消するには、おっしゃる通りメンバすべてをstaticにするか、
mainメソッド内でIndexインスタンスを生成し、そのインスタンスのメンバに対して操作をする必要があります。

public class Index{
  public GameFrame gameFrame;
  public FallBlock fallBlock;
  public static void main(String[] args){
    Index index = new Index();
    index.gameFrame=new GameFrame("Javaによるテトリス制作");
    index.gameFrame.reset();
    index.gameFrame.setBlock();
    index.fallBlock=new FallBlock();
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/09 13:03

    回答有難うございます。

    示された方法で確かに動作いたしました!
    さらにお聞きしたいのですが、mainメソッド内で仮にIndexインスタンスindexを生成した場合、そのスコープはmainメソッド内だけに限定されるのでしょうか?それとも、他のクラスからのアクセスが可能なのでしょうか?

    もし可能であるのならばその方法を教えていただけると幸いです。

    キャンセル

  • 2017/05/09 22:03

    どうやって「他のクラスから」アクセスするのでしょう?

    キャンセル

  • 2017/05/10 14:35

    例えば引数としてmainメソッドからインスタンスを引数として渡すとかですかね?

    どうにかしてindexインスタンスを他のクラスでも共有できるようにしたいのですが、javaにはグローバル変数やそれに当たるものが見当たらなくて、、、

    引数としてインスタンスを渡すという方法も一度試しては見たのですが途中から収集がつかなくなってきてもっと効率よくインスタンスを共有できないかと思いまして、、、

    キャンセル

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

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

関連した質問

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