くーこれはテストにでそうないやらしい仕様だ!(CSとか学んでるとこんなの普通?)
Value(Primitive) Type
int, double, float, bool, charに関してはこのタイプになるらしい。
関数内で値を変更しても、元々の変数の内容は変わらないよ、ってことになります。
関数が使用しているのは、パラメータとして受け取る値のため。
下記コードの結果は0になります
public class Value_Type { public static void main (String args[]) { int i = 0; add_plus_one(i); System.out.println(i); } static void add_plus_one(int value) { value += 1; } }
追記 3/12/22
上記よりさらに簡単な例は下記.
public class Main { public static void main(String[] args) { int a = 10; int b = a; int a = 100; } }
こうなると、aは100, bは10です。
なぜ?
Primitive型の変数は、メモリ上ではa
はアドレス100番地、b
はアドレス101番地に保存されるから。
a
の値が変更されても、b
のアドレス(参照ポイント)とは違うためにb
の値は変わらない。
Reference Type
Classのオブジェクト、array, Stringもこのタイプ。
簡単にいうと変数を関数などに投げると、アドレス(メモリ参考地点)を渡すタイプのやつ
下記は、表示される値はhappy_birthday
関数が呼ばれる前は20だが、関数コール後は21となります。
Person.java
public class Person { private String name; private int age; Person() { name = ""; age = 0; } Person(String str, int value) { name = str; age = value; } public void setAge(int value) { this.age = value; } public int getAge() { return this.age; } }
Reference_Type.java
public class Reference_Type { public static void main (String args[]) { Person Manko_san = new Person("Manko", 20); System.out.println(Manko_san.getAge()); happy_birthday(Manko_san); System.out.println(Manko_san.getAge()); } static void happy_birthday(Person p) { p.setAge(p.getAge()+1); } }
追記 3/12/22
上の例でもいいんだけどもっとわかりやすいのは下記かも。
alex
はPerson objectを参照している。alex
はアドレス番地201, Person Object
は200番地に存在する。
john
もPerson objectを参照している。john
自身は202番地に存在する。
イニシャルobjectを参照しているalex
のname変数を変えたらどうなるか。
もちろんjohn
の値も変わる。john
の値を変えても同じ。何故ならjohn
もイニシャルオブジェクトを参照しているからだ。
public class Main { public static void main(String[] args) { Person alex = new Person("alex"); Person john = alex; System.out.println(before); System.out.println(alex.name + " : " + john.name); // both names are alex alex.name = "david"; System.out.println(after); System.out.println(alex.name + " : " + john.name); // both names are david } static class Person { String name; Person(String name) { this.name = name; } } }