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

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

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

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

Q&A

解決済

3回答

2168閲覧

staticの処理の手順と回避方法。java Eclipse

R.lawliet

総合スコア41

Java

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

0グッド

0クリップ

投稿2015/04/14 09:01

現在staticの単元の勉強をしております。
ここでこの問題に詰まりました。

以下問題

/*以下のプログラムを実行すると

本田さんの得点:74
本田さんの得点:83

という結果になりました。

田中さんの得点:74
本田さんの得点:83

という結果になるようプログラムを修正してください。
(★SubStatic1クラスの内容のみ修正してください。★)*/

lang

1package overload_1008; 2class SubStatic1{ 3 //フィールド 4 static String name = ""; 5 int score = 0; 6} 7class Static01{ 8 public static void main(String[] args) { 9 //インスタンス化 10 SubStatic1 tanaka = new SubStatic1(); 11 SubStatic1 honda = new SubStatic1(); 12 13 //フィールドに代入 14 tanaka.name = "田中"; 15 tanaka.score = 74; 16 honda.name = "本田"; 17 honda.score = 83; 18 19 //表示 20 System.out.println(tanaka.name + "さんの得点:" + tanaka.score); 21 System.out.println(honda.name + "さんの得点:" + honda.score); 22 } 23}

なぜ本田さんで田中さんが上書きされているのかが理解できません。
なので問題を解く事すら敵わない状況です。

この状態で実行を行った場合、
どの様な処理が行われているのか、

どなたか手順を追って解説をしては頂けませんでしょうか(汗)

また、その処理を回避する方法も一緒にご教授頂けるとありがたいです。
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

static変数とは、簡単に言うと、
「別のインスタンス間でも共有する変数」です。

つまり、

lang

1 SubStatic1 tanaka = new SubStatic1(); 2 SubStatic1 honda = new SubStatic1();

これでインスタンスを2つ作っていますが、
static String name = "";
このnameという変数はインスタンス間で共有して使っているんです。
なので、

lang

1 tanaka.name = "田中"; // ① 2 tanaka.score = 74; // ② 3 honda.name = "本田"; // ③ 4 honda.score = 83; // ④

①共有のnameに"田中"をセット。
②個別のscoreに74をセット。
③共有のnameに"本田"をセット。
④個別のscoreに83をセット。
としているんです。

解決策としては、単純に
String name = "";
って感じでstaticを取ってあげれば出来ます。

static変数を勉強できる、いい問題ですね。

投稿2015/04/14 09:21

runun

総合スコア305

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

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

R.lawliet

2015/04/15 00:06

staticが付くことで共有されてしまっているのですね。 順を追っての説明ありがとうございます。 とても理解しやすかったのでベストアンサーに選ばせていただきます。
guest

0

lang

1class SubStatic1{ 2 //フィールド 3 static String name = ""; // これはフィールドではなくクラス変数といいます。 4 int score = 0; 5}

クラス変数はインスタンス毎に生成されるプロパティやフィールドと違い、
実行時に、ただ1つしか生成されません。

honada.nameもtanaka.nameも同じ変数を指しています。
同じ変数に値を代入すれば、最後に代入したものが格納されるのはわかりますね?

クラス変数ではなくフィールドにすることで、インスタンス毎に値を格納できます。
つまりStaticを消せば期待した動作になるはずですよ。

投稿2015/04/14 09:17

wakuwaku

総合スコア386

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

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

R.lawliet

2015/04/15 00:02

なるほど、僕がフィールドと思っていたものはクラス変数だったのですね。 だから後者の本田さんに上書きされる、と。 勉強になります。ありがとうございました!
guest

0

staticの単元なんだから
そのコード内の2つのstaticの
どれかがそうしていると察して欲しいところですが。

staticなフィールド変数は、ざっくり言うとそのクラスで共通の変数です。
SubStatic1のnameフィールドはSubStatic1のインスタンスをいくつ作ろうが
全部同じものを指します。
なので後から代入した"田中さん"に上書きされます。

「java static」でググって出てくるような回答ですがこんな感じです。

投稿2015/04/14 09:18

ozwk

総合スコア13521

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

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

R.lawliet

2015/04/15 00:12

static String name = ""; が悪い事をしているのは把握出来ていたのですが、 書き換えるだけで課題終了、ではなく、なぜこうなるのか、を知りたかったもので(汗) 田中さん、は"本田さん"のミスですね、回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問