Java 9のJShellで参照型を宣言する方法をわかりやすく解説
JShellとは
JShellは、Java 9で導入された対話型(REPL)ツールです。ユーザーが入力したコードをその場で評価し、結果を即座に出力してくれるため、小さなコード断片の動作確認やJavaの学習に非常に便利なツールです。
参照型とは何か
値型と異なり、参照型は値そのものを直接保持しません。代わりに、実際の値が格納されているメモリ上のアドレス(参照)を保持します。つまり、参照型の変数には、データが置かれている別のメモリ領域を指し示す情報が入っているということです。Javaにおける主な参照型には、String、配列、クラス、インターフェースなどがあります。
ヒープ上に作成されるオブジェクト
以下のコードでは、Animalクラスの新しいインスタンスを作成しています。new Animal()を実行すると、オブジェクトはヒープメモリ上に生成されます。出力例の「Animal@73846619」において、「@」以降の「73846619」は、オブジェクトがヒープ上のどこに格納されているかを示す識別子(ハッシュコード)に相当します。
スニペット1:クラスの定義とインスタンス化
jshell> class Animal {
...> }
| created class Animal
jshell> Animal dog = new Animal();
dog ==> Animal@73846619
続くコードでは、2つの新しいAnimalオブジェクトがヒープ上に作成され、それぞれのメモリ位置(参照)が参照変数dogとcatに格納されます。Javaではすべてのクラスが参照型であり、プリミティブ型以外のインスタンス(オブジェクト)はすべてヒープに格納されます。そして、オブジェクトへの参照だけが、dogやcatのような参照変数に保持される仕組みになっています。
スニペット2:複数オブジェクトの生成
jshell> class Animal {
...> int id;
...> public Animal(int id) {
...> this.id = id;
...> }
...> }
| created class Animal
jshell> Animal dog = new Animal(10);
dog ==> Animal@6adede5
jshell> Animal cat = new Animal(20);
cat ==> Animal@5025a98f
プリミティブ型との違い:値はそのままコピーされる
一方、プリミティブ型の場合は挙動が異なります。以下のコードでは、「j = i」を実行すると、iの値そのものがjにコピーされます。その後、jの値を変更しても、iには一切影響しません。また、比較も値同士で行われるため、両者が同じ値を持っていれば「==」による比較はtrueを返します。
スニペット3:プリミティブ型の代入と比較
jshell> int i = 5; i ==> 5 jshell> int j; j ==> 0 jshell> j = i; j ==> 5 jshell> j = 10; j ==> 10 jshell> i; i ==> 5 jshell> i == j; $11 ==> false jshell> j = 5; j ==> 5 jshell> i == j; $13 ==> true
まとめ
このように、JShellを活用すれば、参照型とプリミティブ型の動作の違いを手軽に確認できます。参照型の変数が保持しているのはオブジェクトへの参照(アドレス)であり、実体はヒープ上に存在します。一方、プリミティブ型の変数は値そのものを直接保持します。この違いを正しく理解することは、Javaのメモリ管理や、==演算子とequalsメソッドの使い分けなど、オブジェクトの等価性を扱ううえで非常に重要な基礎知識となります。
-
Java 9のJShellでシステムプロパティを取得する方法【コード例付き】
JShellは、REPL(Read-Evaluate-Print-Loop)と呼ばれる対話型ツールです。main()メソッドを持つクラスを作成しなくても、簡単なJavaの文を入力するとその場で評価され、結果がすぐに表示されます。起動も簡単で、コマンドラインプロンプトで「jshell」と入力するだけでOKです。 システムプロパティを取得するには、System.getProperty()メソッドとSystem.getProperties()メソッドを使用します。 まずは、Systemクラスのstaticメソッドであるproperty()を使って、特定のシステムプロパティの値をJShell上で表示
-
Java 9でJavaFXを使ってJShellをプログラムから実装する方法
JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として