• ベストアンサー

Java変数について

こんにちは。Javaの初心者です。 そこそこ基礎知識もついてきたかと思いまして、初めて実用プログラムを組むことにしました。 そこで、今問題にあたってるんですが、 メソッド内にあるローカル変数に入ってる値を、メンバ変数に代入することは出来るのでしょうか? もしできるのでしたら、その方法をご教授してくだされば幸いです。 プログラムの初心者なので、勘違いしてることが多々あるかと思われますが、 ご回答の方、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.5

「メンバ変数からローカル変数にアクセスする」とか「メンバ変数からローカル変数に入ってる値をもらう/取る」という表現と、ANo.4への補足がどう対応するのかさっぱり分かりません。「構文」という単語の使い方も何やら妙ですし。 > 4行目のメンバ変数「a」に、7行目のローカル変数「i」の値を代入したいという具合です。 そのaはstaticなメンバではないので、staticなメソッドであるmain()からアクセスするためには、Testクラスのどのインスタンスのaなのかを指定する必要があります。また、iのスコープはそれを宣言しているforループの中だけなので、iを参照するコードはそのforループの中にしか書けません。 public static void main(String[] args) { Test t = new Test(); for(int i = 0;i<=10;i++) { t.a = i; // aにiの値を代入☆ } } 上のコードの☆の行がANo.2に書いたのと同じ形になっていることは分かりますよね? aをstaticなメンバに変えればmain()の中からでもa=i;だけで代入できますが、staticでないメンバをstaticに変えるというのはクラス設計が根本的に間違っていたということを意味します。

rajison
質問者

お礼

そういう意味ですか!! ご親切に分かりやすくご説明してくださってありがとうございます!。 意味不明な日本語ばっか述べててすみませんでしたが、もう一度 今作ってるプログラムを見直してみます! Tacosanさん、salsberryさん、ご回答、ありがとうございました! また何か分からないことがあれば質問させていただきます。 ありがとうございました。

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

#6 の「i は for で変えてるんだけどいつの時点の値を使うのか」ってのは, つまり for(int i = 0;i<=10;i++) で i の値は 0 から 11 まで変わるんだけどそのどの値なの? ってこと. ちなみに void foo() { for (int i = 0; i < 10; ++i) { }//なんか for (int i = -7; i < 10; ++i) { }//なんか } とかされたらどうするんだろう.

rajison
質問者

お礼

>>for(int i = 0;i<=10;i++) >>で i の値は 0 から 11 まで変わるんだけどそのどの値なの? ってこと. う~ん、分かるような分からないような・・・、すみません・・。 >>ちなみに >>void foo() { >>for (int i = 0; i < 10; ++i) { }//なんか >>for (int i = -7; i < 10; ++i) { }//なんか >> } >>とかされたらどうするんだろう. その辺は・・・・・、まだまだJavaに関しては未熟な私なので分からないです・・。 なんでもかんでも分からない分からない言ってばっかしですみません。 まだまだ勉強不足のようですね。 とにかく色んなプログラム組んでみて、経験をつんでみようかと思っています。 ご回答、ありがとうございました!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

まあ文法的にはその通りなんですが>#5, それ以前に ・i は for で変えてるんだけどいつの時点の値を使うのか とか ・ほかのメソッドで i を使ったらどの i の値を使うのか混乱しないだろうか とか 思わなかったんでしょうか?

rajison
質問者

補足

>>i は for で変えてるんだけどいつの時点の値を使うのか すみません、いつの時点と言いますとどういう意味でしょうか? iはどこで使われるのか?こういう意味でしょうか? >>ほかのメソッドで i を使ったらどの i の値を使うのか混乱しないだろうか さすがにそこまで気がいってなかったです(^^;A) ですがそれはthis関数(?)を使えば大丈夫じゃないんでしょうか? 初心者な私なのでその辺はよく分からないですが・・・。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「もらう」でも「取る」でもいいけど, 「メンバ変数からローカル変数に入ってる値をもらう」の意味はやっぱり全然分からん. 特に, 「から」を使っている理由がさっぱりわからない. 的確な日本語で表現するか, それがだめなら疑似コードか何かを使うかしてください.

rajison
質問者

補足

すみません。疑似コードで書かせてもらいました。 *以下構文 import java.io.*; public class Test { int a = i; // ←メソッド内の変数(forループの中にあるint型の)iを参照。 public static void main(String[] args) { for(int i = 0;i<=10;i++) { } } } 即行で書いたので、文法がめちゃくちゃだと思いますが、ご了承願います。 4行目のメンバ変数「a」に、7行目のローカル変数「i」の値を代入したいという具合です。 元々国語力があまりないんで意味不明な文を書いたりします(^-^;A) 先程から迷惑ばかりかけててすみませんが、アドバイスの方宜しくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「メンバ変数からローカル変数にアクセスする」の意味が分かりません. どういうことをイメージしているんでしょうか?

rajison
質問者

補足

分かり辛い補足ですみません。 「メンバ変数からローカル変数にアクセスする」というのは、 メンバ変数からローカル変数に入ってる値をもらう(?)ということです。 *「もらう」というより、「取る」といったほうが正しいでしょうか。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

hello h = new hello();で作ったhelloクラスのインスタンスのheとweに値を代入したいのなら、 h.he = Integer.parseInt(str); h.we = Integer.parseInt(stg); あと、Weightは横幅ではなくて重さですよ。

rajison
質問者

補足

ご回答ありがとうございます。 >>あと、Weightは横幅ではなくて重さですよ。 そうだったんですか! 知らなかったです・・・。 それと、質問してるのと恐らく逆の意味ですが、 メンバ変数からローカル変数にアクセスすることは可能なのでしょうか? アドバイスの方、宜しくお願いします。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

代入自体は、型の問題さえなければ普通にできます。 class C { int a; void method() { int i; for (i=0; i<10; i++) a=i; // メソッド内のローカル変数の値をメンバ変数に代入 } } 質問者さんが聞きたいのがそういう問題ではないのなら、具体的なコードとかエラーメッセージとかを補足してください。

rajison
質問者

補足

早速のご回答、ありがとうございます。 今私が作っているプログラムは、「ユーザから四角形の縦と横の長さ(値)を 入力してもらって、それを元に図形を描画させる」というプログラムです。 ローカル変数にユーザからの値が入っているのですが、それをメンバ変数に 代入したいのです。 エラーはでない(文法的に間違ってない(?))ので、実行できるのですが、 「ユーザからの値を元に、図形を描画させる」という点に関してはできない のです。 一応、構文を載せておきますね。 *以下構文 public class hello extends Frame { int he,we; public static void main(String[] args)throws IOException { hello h = new hello(); Frame f = new Frame(); f.setTitle("図形描画"); f.setSize(400,400); f.add(new helloCanvas()); f.setVisible(true); f.addWindowListener(new Ada()); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("左のフレームに入力された値で四角形を描画します。"); System.out.println("まず縦(Height)の長さを入力してください。"); /* int he = br.readLine(); */ //←無効な構文 String str = br.readLine(); int he = Integer.parseInt(str); System.out.println("縦の長さは" + he +"cmですね。"); System.out.println("続いて横(Weight)の長さを入力してください。"); String stg = br.readLine(); int we = Integer.parseInt(stg); System.out.println("横の長さは" + we +"cmですね。"); } static class helloCanvas extends Canvas { public void paint(Graphics g) { g.drawString("ここに図形が描画されます。",100,20); } } protected class sample extends hello { public void paint(Graphics g) { g.drawRect(100,50, he, we); } } } (以下省略) 以上の構文で書いているのですが、ダメでしょうか? 日本語がヘタで、分かりずらいと思いますが、 何卒アドバイスの方宜しくお願いします。