UPSTARTSのぱみやすです
今回はJavaの「基本データ型と参照型のメモリの関係」をみていきます
はじめに、基本データ型と参照型の違いを見ていきましょう
基本データ型
まずは基本データ型ですが、「boolean」「byte」「char」「short」「int」「float」「long」「double」の8つがあります
こちらの例を見て下さい
1 2 3 4 5 |
int a = 5; int b = a; b = 7; System.out.println(a); System.out.println(b); |
「a」に「5」を代入し、「b」に「a」を代入し、「b」に「7」を代入します
実行して表示させてあげると、「a」が 「5」で、「 b」は「 7」 と表示されます
こちらは直感的にわかると思います
参照型
では次に参照型をみていきましょう
参照型は先ほど説明した基本データ型の8つ以外になります
主に「String」「配列」「class」などがあります
それでは今回は配列を例にしてみます、 こちらの例を見てください
1 2 3 4 5 |
int[] a = {5}; int[] b = a; b[0] = 7; System.out.println(a[0]); System.out.println(b[0]); |
先ほどと同様に「a」に「5」を代入し、「b」に「a」を代入し、「b」に「7」を代入します
基本データ型では、「a」が 「5」で、「 b」は「 7」 と表示されましたが、
今回は「a」と「b」の両方とも「 7」と表示されます
メモリの関係
なぜこのようになるのかを別の画面でみてみます
ピンクはコンピューターのメモリだと思ってください
「0A01」や「0x01」は数値はメモリの番地だと思ってください
基本データ型
基本データ型から見ていきましょう
まず基本データ型では「int a」と変数が宣言された時点でメモリ上に「a」という領域を確保し、
そこに「5」という値を保持しています
「int b」も同じように領域が確保され、「b」に「a」が保持され、
その後「b」に「7」が代入され、「a」が「5」、「b」が「7」になります
参照型
では次に参照型を見ていきましょう
参照型では「int[]a」と宣言すると配列の要素が何個がわからない為、 メモリ上にとりあえず「a」という領域を確保します
次に「a」に「5」を代入するのですが参照型の場合、 別の番地に領域が確保され、「a」には「5」が入っている番地(0x03)が代入されます
同じように「int[]b」もとりあえず領域が確保され、「b」に「a」を代入します
この時に、「b」には「a」の番地、要するに(0x03)が代入されるため、「 a」と「b」は同じ場所を参照していることになります
次に「b」に「7」を代入すると「0x03」番地が「7」に変わります
そうすると「a」と「b」はおなじところをみているので、「a」も「b」も「7」になります
こちらとてもややこしいのですが、とても重要なので区別できるよにしておいてください
String
また「String型」は参照型と説明しましたが、基本データ型と似たような動作になるように調整が加えられているので データ型と同じように使うことが出来ます
まとめ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package lesson; public class Main { //基本データ型と参照型のメモリの関係 public static void main(String[] args) { //基本データ型 int a = 5; int b = a; b = 7; System.out.println(a); System.out.println(b); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package lesson; public class Main { //基本データ型と参照型のメモリの関係 public static void main(String[] args) { //参照型 int[] a = {5}; int[] b = a; b[0] = 7; System.out.println(a[0]); System.out.println(b[0]); } } |
次回はメッソドについてやっていきます