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

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

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

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

Q&A

解決済

2回答

1684閲覧

JAVA 同じタイミングで同じフィールドを参照してるのに値が違う

earnest_gay

総合スコア615

Java

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

0グッド

0クリップ

投稿2016/11/18 17:03

java

1public class TestOya extends AppCompatActivity{ 2 3 public String name; 4 public int birthday; 5 public int manpukudo; 6 7 public TestOya(){ 8 this.name = "山田"; 9 this.birthday = 19900101; 10 this.manpukudo = 50; 11 } 12 13 public void eat(){ 14 this.manpukudo += 60; 15 } 16 17}

java

1public class MainActivity extends TestOya { 2 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 8 TestOya test = new com.example.macpro_n_goto.test20161113_gamennseni.databases.TestOya(); 9 10 test.eat(); 11 12 System.out.println("名前:" + this.name); 13 System.out.println("生年月日:" + this.birthday); 14 System.out.println("満腹度:" + this.manpukudo); 15 16 System.out.println("名前:" + test.name); 17 System.out.println("生年月日:" + test.birthday); 18 System.out.println("満腹度:" + test.manpukudo); 19 20 System.out.println("Aのオンクリエイトが呼ばれました"); 21 22 setContentView(R.layout.activity_main); 23 } 24}

結果

I/System.out: 名前:山田
I/System.out: 生年月日:19900101
I/System.out: 満腹度:50
I/System.out: 名前:山田
I/System.out: 生年月日:19900101
I/System.out: 満腹度:110

同じフィールドを参照してるのになぜ値が違うのでしょうか?
本当にごっちゃになってきました。

納得できる解説をお願いします!

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

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

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

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

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

guest

回答2

0

ベストアンサー

異なるインスタンスのフィールドだからです。
前半の出力はthis,つまりこのコードを実行しているMainActivityのインスタンスを指します。
後半の出力は、このコードのはじめでインスタンス化しているTestOyaのインスタンスを指しています。
たとえ双子でもその時々の状態が異なるように、異なるインスタンスは異なる状態を持ちえます。
それぞれのインスタンスが持つフィールドは完全に独立しており、片方が変化してももう片方は影響を受けません。

投稿2016/11/18 17:14

swordone

総合スコア20649

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

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

earnest_gay

2016/11/18 17:24

TestOya test1 = new TestOya(); TestOya test2 = new TestOya(); test1.eat(); System.out.println("名前:" + test1.name); System.out.println("生年月日:" + test1.birthday); System.out.println("満腹度:" + test1.manpukudo); System.out.println("名前:" + test2.name); System.out.println("生年月日:" + test2.birthday); System.out.println("満腹度:" + test2.manpukudo); なら値が違うのは理解してるのですが同じことだったんですね。。。 ありがとございます!
swordone

2016/11/18 17:30

あと、Activity系をコード上でインスタンス化はやめたほうがいいです。 このコードでTestOyaがActivityを継承している必然性はほとんどないので。
earnest_gay

2016/11/18 17:32

>>TestOyaがActivityを継承している必然性はほとんどないので。 実行クラスはonCreate()持ってるのです。
guest

0

「オブジェクトが違うから」という回答になります。

thisはメソッドを実行しているオブジェクトを指します。そして、testはこのメソッド内で作られたオブジェクト(明らかにthisとは別物)です。ちなみにtestだけeatメソッドを呼んでいるので、ここで値が異なるものになりました。

投稿2016/11/18 17:10

HogeAnimalLover

総合スコア4830

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

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

earnest_gay

2016/11/18 17:25

ありがとうございます。 PHPでは確か$this->manpukuでも上書きされてた記憶でした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問