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

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

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

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

Q&A

解決済

3回答

1373閲覧

javaのコードについて解説をお願いします。

BSS_sapporo

総合スコア44

Java

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

0グッド

1クリップ

投稿2016/04/14 04:25

現在独学でjavaを学んでいます。
初歩的な質問で申し訳ありませんが、以下のコードの実行結果が

Java Unix
Java Solaris

となることが理解できません。

お手数ですが、どの値がいつどのように動いているのか詳しい解説をお願いできますでしょうか。
よろしくお願いいたします。

<コード>
class Test {
static String lang = "C";
public String operation = "Unix";
Test() { }
Test(String str) {
operation = str;
}
public static void main (String args[]) {
Test obj1 = new Test();
Test obj2 = new Test("Solaris");
obj2.lang = "Java";
System.out.println(obj1.lang + "\t" + obj1.oparation);
System.out.println(obj2.lang + "\t" + obj2.oparation);
}

<実行結果>
Java Unix
Java Solaris

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

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

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

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

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

ItoTomonori

2016/04/14 04:40

動作を全部説明するのは、結構たいへんです。 ご自身は、どのような結果を期待していましたか?それを提示されると、その結果がなぜ違うのかとう観点で、説明しやすくなるかもしれません。
guest

回答3

0

ベストアンサー

こんにちは。ちょっと長いですが・・・

これを理解するには、インスタンスとは何か?オブジェクトとは何か?というのが分かっていないと
難しいかと思います。

Test obj1 = new Test();
Test obj2 = new Test("Solaris");

この2行では、Testクラスのインスタンスをobj1obj2それぞれ作成しています。
Testクラスの箱が2つあると考えてください。

Testクラスの箱には、フィールドlangoperationがそれぞれ用意されています。
初期値は

static String lang = "C";
public String operation = "Unix";

です。

インスタンスを作成する際に使用するのがコンストラクタです。
Testクラスにはコンストラクタが2つ用意されています。

Test() { }

Test(String str) {
operation = str;
}

1つ目のコンストラクタは引数なしで、Testクラスのインスタンスをそのまま作成します。
2つ目のコンストラクタは引数strに指定されたものをoperationフィールドに代入した状態でインスタンスを作成します。

一番最初に見た2行(newしている部分)が、これを実際に使っている部分ですね。
このときの状態を図にすると↓のようになります。

Test obj1 └ static String lang = "C"; └ public String operation = "Unix"; Test obj2 └ static String lang = "C"; └ public String operation = "Unix"; ← ここが "Solaris" になります。

main()メソッドに戻りましょう。
次の処理は

obj2.lang = "Java";

これはobj2のフィールドlangの値に直接"Java"を代入しています。
ここで注意したいのは、langstaticであること。
staticとしているとTestクラス全体の値が変わります。

上の図にしてみると、

Test obj1 └ static String lang = "C"; ← ここが "Java" になります。 └ public String operation = "Unix"; Test obj2 └ static String lang = "C"; ← ここが "Java" になります。 └ public String operation = "Solaris";

となります。

そして、

System.out.println(obj1.lang + "\t" + obj1.oparation);

System.out.println(obj2.lang + "\t" + obj2.oparation);

でそれぞれのインスタンスのフィールドの中身を標準出力に書き出しているのです。
obj1.langobj1インスタンスのlangフィールド という意味です。(他も同様)

なので、出力された結果が

Java Unix Java Solaris

になるのです。
ちなみに、「\t」はタブ文字です。「エスケープシーケンス」で調べてみてください。

投稿2016/04/14 04:54

編集2016/04/14 04:58
kaputaros

総合スコア1844

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

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

kaputaros

2016/04/14 05:00

ちょっと修正しました。 langフィールドがstaticであることを失念してました (汗
BSS_sapporo

2016/04/14 05:09

ものすごくご丁寧に解説いただきましてありがとうございます。 おかげさまで本当にすんなりと理解することができました。
guest

0

Mainの最初の3行の動きを理解すれば判るかと思います。

Test obj1 = new Test();

これで, obj1に、operation が "Unix"となっているTestクラスのオブジェクトが入ります。

Test obj2 = new Test("Solaris");

引数に"Solaris"と指定したコンストラクタが使われていますから、 obj2に、operation が "Solaris"となっているTestクラスのオブジェクトが入ります。

obj2.lang = "Java";

langは、TestクラスのStaticなメンバーです。Staticということは、Testクラスの全て(obj1もobj2も)のオブジェクトが同じ値を持つということです。
obj2.lang = "Java"; とすることで、obj1.langnの値も"Java"になります。

投稿2016/04/14 04:41

coco_bauer

総合スコア6915

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

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

BSS_sapporo

2016/04/14 05:01

それぞれの代入値についてやっと理解できました。 早々にご回答いただきありがとうございました!
guest

0

Java

1class Test { 2 static String lang = "C"; // クラス変数のlang が C になります 3 public String operation = "Unix"; // オブジェクト変数のoperation が Unix になります 4 Test() { } 5 Test(String str) { 6 operation = str; // new Test("hoge") のタイミングで、operation が hoge になります 7 } 8 public static void main (String args[]) { 9 Test obj1 = new Test(); // Test.lang=C, obj1.operation = Unix になりました 10 Test obj2 = new Test("Solaris"); // Test.lang=C, obj2.operation = Solaris になりました 11 obj2.lang = "Java"; // Test.lang=Java になりました(obj1.lang,obj2.lang共にJavaになります) 12 System.out.println(obj1.lang + "\t" + obj1.oparation); 13 System.out.println(obj2.lang + "\t" + obj2.oparation); 14 }

Javaにおいて static とつけた変数はオブジェクトではなくクラスに結びつきます。
なので、obj1,obj2のlangが両方 Java になります。

投稿2016/04/14 04:37

編集2016/04/14 04:39
tnd-.-b

総合スコア247

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

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

BSS_sapporo

2016/04/14 04:55

早速ご回答頂きましてありがとうございます。 何度も申し訳ありませんが、 Test obj2 = new Test("Solaris"); 上記の際に lang ではなく operation が Solaris になるのは operation がオブジェクト変数だから( lang はクラス変数のため obj2.lang = "Java"; で代入されている?)という認識で良いでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問