🙌
[Javaの基礎]基本データ型(プリミティブ型)と参照型について
はじめに
ここではJavaにおけるデータ型についてまとめています。
データ型
基本データ型(プリミティブ型)
Javaで用意されている基本データ型(プリミティブ型)は以下のようになってます。異なる型への再代入はできません。
| データ型 | 値 |
|---|---|
| byte | 8ビット整数 (-128~127) |
| short | 16ビット整数 (-32,768~32,767) |
| int | 32ビット整数 (-2,147,483,648~2,147,483,647) |
| long | 64ビット整数 (-9,223,372,036,854,775,808~9,223,372,036,854,775,807) |
| float | 32ビット単精度浮動小数点数 |
| double | 64ビット倍精度浮動小数点数 |
| char | 16ビットUnicode文字 |
| boolean | true or false |
参照型
参照型とはオブジェクトの実体ではなく、その実体がメモリ上のどこにあるか(アドレス)を記録しています。String, Aray, List, Map, 自作クラスなどがあります。
以下のように最初はaとbが同じ"Hello"を参照していますが、bに"World"を代入した時点でbは別の文字列を指すようになります。
String a = "Hello";
String b = a;
System.out.println(a); // Hello
System.out.println(b); // Hello
b = "World";
System.out.println(a); // Hello(aは影響を受けない)
また、以下の場合はobj1とobj2は同じオブジェクトを参照しているので、obj2.someField = 100;とするとobj1.someFieldも100になります。
「参照型の変数を代入」=「同じオブジェクトを共有する」
MyClass obj1 = new MyClass();
MyClass obj2 = obj1;
参照型を扱うときの注意点
-
NullPointerExceptionの原因となるのでnullチェックを忘れずに行う。 - 同じオブジェクトを参照していると、一方の変更が他方にも影響することに注意する。
-
==での比較は同じ参照かの比較になる。値の比較にはequals()を使う。
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false(参照が違う)
System.out.println(a.equals(b)); // true(値が同じ)
Stringクラス
Stringはjava.lang.Stringというクラスであり、オブジェクト指向の概念に基づいた参照型です。Stringは使用頻度が高いためリテラルを使用して簡単に生成できますが、内部的にはStringクラスのインスタンスです。
String s = "Hello"; // Stringクラスのインスタンスを生成
String s = new String("Hello"); // 明示的にオブジェクト生成
型変換
ある型を別の型に変換することをキャストといい、自動型変換(暗黙的型変換)と明示的変換(キャスト)があります。
自動型変換(暗黙的型変換)
小さいデータ型から大きいデータ型へ自動的に変換される場合、Javaが自動的に変換を行います(精度が落ちない変換)。
int i = 100;
long l = i; // int → long に自動変換
double d = l; // long → double に自動変換
System.out.println("int: " + i);
System.out.println("long: " + l);
System.out.println("double: " + d);
出力
int: 100
long: 100
double: 100.0
明示的変換(キャスト)
大きいデータ型から小さいデータ型へ変換する場合、精度の損失やオーバーフローの可能性があるため明示的なキャストが必要です。
double d = 123.456;
int i = (int) d; // 明示的キャスト:double → int
System.out.println("double: " + d);
System.out.println("int: " + i);
出力
double: 123.456
int: 123 // 小数部分が切り捨てられる
Discussion