Javaの基礎② (プリミティブ型/オブジェクト型/変数の上書き)

Java

Javaの基礎の第二弾!
第一弾をみていない方は、ぜひそちらからご覧ください。

一緒にJavaを学んでいきましょう!

データ型

プログラムで扱うことのできるデータの種類 = データ型 があります。

プリミティブ型(基本データ型)

  • 値そのものを直接保持する
    例えば、int x = 10; の場合、変数 x の中に「10」という数値が直接入っています。
  • メモリ効率が良い
  • 操作が高速
  • 値渡し(コピーされる)
    変数同士で代入や引数渡しをすると、値がコピーされます。
  • Javaの8つの基本型がこれにあたる
    int, byte, short, long, float, double, char, boolean
分類型名格納するデータ宣言の例
整数型byte1バイトの整数(-128〜127)byte b = 100;
short2バイトの整数(-32,768〜32,767)short s = 30000;
int4バイトの整数(約-21億〜21億)int i = 100000;
long8バイトの整数(非常に大きい範囲)long l = 10000000000L;
浮動小数点型float4バイトの小数点数(単精度)float f = 3.14f;
double8バイトの小数点数(倍精度)double d = 3.14159;
文字型char2バイトの文字(Unicodeの1文字)char c = 'A';
論理型boolean真偽値(true または falseboolean flag = true;
Q
longの宣言の例にある 「 L 」って何?
A

リテラルが long 型であることを明示するためのサフィックス(接尾辞)です。
Javaでは、数値リテラル(例えば 10010000000000)は基本的に int として扱われます。
ただし、int 型の最大値は約21億(2,147,483,647)なので、それを超える数値は int では表現できません。
そこで、long 型のリテラルであることを示すために、数値の末尾に L または l を付けます。
Ll は同じ意味ですが、小文字の l は数字の1に見間違えやすいので、通常は大文字の L を使うのが推奨されています。


Q
floatの宣言の例にある 「 f 」って何?
A

リテラルが float 型であることを示すためのサフィックス(接尾辞)です。
リテラルの末尾に f または F をつけて、「これは float 型のリテラルですよ」 と明示します。
Javaでは、小数の数値リテラルはデフォルトで double として扱われます。
つまり 3.14double 型のリテラル。
変数 ffloat 型なので、double をそのまま代入するとエラーになります(型が異なるため)。

参照型(オブジェクト型)

  • 実体(データ)はヒープ領域に置かれ、変数にはその実体の「参照(アドレス)」が入る
    例えば、String s = "hello"; の場合、変数 s には「文字列オブジェクトの場所(メモリアドレス)」が格納されています。
  • 参照渡し
    変数同士の代入や引数渡しは、実体ではなく「参照(ポインタ)」がコピーされます。
  • メソッドやプロパティを持てる
    オブジェクトには操作やデータがまとまっている(例えば文字列の長さを返すlength()メソッドなど)
  • 自分で作ったクラスやライブラリのクラスはすべてオブジェクト型
  • 配列も参照型の一種
分類型名格納するデータ宣言の例
クラス型String文字列のデータ(文字の並び)String name = "Ami";
独自のクラス名クラスのインスタンス(オブジェクトの参照)Car car = new Car();
配列配列型同じ型の複数のデータint[] numbers = {1, 2, 3};
Ami
Ami

< ヒープ領域とは >

Javaプログラムが実行される際に、動的に作成されるオブジェクトや配列が格納されるメモリ領域のことを「ヒープ領域」と呼びます。

  • Java仮想マシン(JVM)が管理するメモリの一部。
  • new演算子で生成されたオブジェクトはすべてこのヒープ領域に置かれる。
  • プリミティブ型(intやbooleanなど)は基本的にスタックに直接格納されますが、オブジェクト型はヒープ上に配置される。

< なぜヒープ領域が必要? >

  • 動的メモリ確保:実行時に必要な分だけオブジェクトを作成できるようにするため。
  • 寿命の管理:ローカル変数(スタック上)とは違い、ヒープ上のオブジェクトは参照がなくなるまで存在し続ける。
  • ガベージコレクション:不要になったオブジェクトは自動的にJVMのガベージコレクタによって回収される。

注意点

  • オブジェクト型はnullが入ることがあり、参照がない状態を表せる(プリミティブ型は不可)
  • プリミティブ型のラッパークラス(例:Integerintのラッパークラス)を使うことで、プリミティブ型の値をオブジェクトとして扱うこともできます。

変数の上書き

public class Main{
    public static void main(String[] args) {
        int i = 100;
        System.out.println(i);
        i = 5; //再代入
        System.out.println(i);
    }
}

上記のコードの実行結果は、
100
5
になります。

同じ変数に代入してしまっているので、上書きされてしまっていますね?
絶対に上書きされたくない場合は、「final」を使用します。
「final」付きで宣言された変数は、定数と呼ばれ、初期値が代入された後は、値を書き換えることができなくなります。

public class Main{
    public static void main(String[] args){
        final int i = 20;
        System.out.println(i);
        i = 15;
        System.out.println(i);
    }
}

上記のコードは、final変数 i に再代入しようとしているため、コンパイルエラーになります。
finalがついた変数は、一度値をセットすると変更できないため、再代入は許されません。

まとめ

第二弾も初めてみる方は、覚えられない!と思うかもしれませんが、暗記をするというよりは何度も見て、何度も書いて理解するという方が大切になります。
ぜひ、いろんな値を代入して試してみてください。

タイトルとURLをコピーしました