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

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

ただいまの
回答率

88.34%

別クラスの変数 配列型のクラス変数を使うには

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,546

下記クラスの変数 width heightを同一パッケージ 別クラスで使用したいです。
Blockクラスの変数をMainActivityで使いたいです。
配列型にした場合、その変数を使うにはどうしたらいいでしょうか?
下記だとNullになってしまいます。

Mainでこのように使いたい。

Block[] block;
block = new Block[8];
for (int i; i<8 ; i++){
block[i] = new Block(view_w/NUM_BLOCK + (block[i].width*2+ margin)*i, view_h/10)
`
`
`
}


block[i].width
block[i].height
がNullとエラーが出てしまう。

Block

public class Block {

    float x; // ブロックのx座標
    float y; // ブロックのy座標
    int width =40;
    int height=10; // ブロックの幅、高さ
    int margin = 5; //ブロックの間のマージン
    final int NUM_BLOCK = 8;

    //コンストラクタ
    public Block (int _x,int _y){
        this.x = (float)_x;
        this.y = (float)_y;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

初期値であれ、インスタンス変数はインスタンスを作った後にしか参照できません。(インスタンスを作った時に初めてセットされるから・・)
しかし、クラス変数であれば、インスタンスなしでも参照できます。すべてのインスタンスで、高さと幅が一緒でもよいなら、クラス変数のままでもいいのですが、たぶんよくないので、初期値をクラス変数から取得するようにすると下記のようなコードになります。

public class Block {
    public final static int WIDTH = 40;
    public final static int HEIGHT = 10;
    float x; // ブロックのx座標
    float y; // ブロックのy座標
    int width = Block.WIDTH;
    int height= Block.HEIGHT; // ブロックの幅、高さ
    int margin = 5; //ブロックの間のマージン
    final int NUM_BLOCK = 8;

    //コンストラクタ
    public Block (int _x,int _y){
        this.x = (float)_x;
        this.y = (float)_y;
    }
}

呼び出し側はこんな感じです。

Block[] block;
block = new Block[8];
for (int i; i<8 ; i++){
block[i] = new Block(view_w/NUM_BLOCK + (Block.WIDTH*2+ margin)*i, view_h/10)
`
`
`
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/23 14:17

    >>初期値であれ、インスタンス変数はインスタンスを作った後にしか参照できません。(インスタンスを作った時に初めてセットされるから・・)

    なるほど。初期化されてないインスタンス変数(非static変数)にアクセスしていたからNullだったということですかね。

    少し話がそれるのですが、クラス変数 を下記のように非staticにするのはNGですか?(恥ずかしながらstaticの意味が細かく理解できておりません。。。)

    public final static int WIDTH = 40;
    public final static int HEIGHT = 10;

    これらをstaticじゃなく、こう
    public final int WIDTH = 40;
    public final int HEIGHT = 10;

    それともクラス変数というのはstaticであるべきものなんでしょうか?




    キャンセル

  • 2016/05/23 15:27

    インスタンス化とは、メモリ上に領域を確保して、コンストラクタを含む初期化をしてはじめてアクセスできます。エラーは、変数前に存在しないインスタンスを指定されたので、エラーとなったというわけです。

    あと、かいつまんで説明すると、インスタンス変数にstaticを付けたのがクラス変数です。クラス変数はインスタンスなしでアクセスできるのでエラーにはならないというわけです。

    int width = Block.WIDTH;が無駄だと感じるならBlockクラス内では、WIDTHを直接呼び出すといいと思います。

    キャンセル

  • 2016/05/24 13:53

    PCの仕組みを理解してなかったのでとてもタメになります。
    いままでざっくり理解していたインスタンス・変数についての理解が進みました!

    キャンセル

0

問題は次の部分です

block[i] = new Block(view_w/NUM_BLOCK + (block[i].width*2+ margin)*i, view_h/10)

コンストラクタ括弧の中にあるblock[i]はまだ作成されていません。

block[i].width 
block[i].height 

がnullではなく

block[i]自体が現在nullなのだと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/23 14:17

    まだ初期化されていないのですね。

    キャンセル

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

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

関連した質問

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