検索

キーワード


【Java】インスタンスとは?クラスとの関係やnew演算子を使った生成方法を解説

  • 公開日:2020-08-11 18:33:20
  • 最終更新日:2021-01-25 18:25:08
【Java】インスタンスとは?クラスとの関係やnew演算子を使った生成方法を解説

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてインスタンスについて紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:クラス宣言の方法 / オブジェクト指向とは? / コンストラクターの使い方 / 変数と定数の違い / メソッドとは? / stringクラスの紹介 / if文の使い方 

インスタンスの役割と生成方法

Java の特徴であるオブジェクト指向には「モノ」という概念があります。

「モノ」は主に動作などの指示が記録されていて、

それらモノを組み合わせることでアプリやWebサイト、社内システムなどが動く仕組みとなっています。

Java ではクラスからこのようなモノを生成することをインスタンス化と呼びます。

ここではインスタンス化やインスタンスそのものについて紹介させていただきます。


インスタンスの概要

クラスは java において必要不可欠な要素となっていますが、

ただクラスを作成しただけではまだ何も生み出すことはありません。

そのクラスを実体化することで初めて実体としての機能を活用することができます。

この「クラスを実体化する」ことを「インスタンス化」と呼び、実際にできた実体を「インスタンス」と呼びます。

よくクラスが「設計図」として例えられていますが、

もし設計図で例えるのならばネジの構造が記された設計図がクラス、

ネジクラスをもとにネジを実体化することを「インスタンス化」、

インスタンス化によって出来上がったネジが「インスタンス」となります。

こういった様々なインスタンスを組み合わせることで例えば、車が出来上がるといった具合にプロジェクトが開発されます。

Java では様々なクラスが生成され、インスタンス化が繰り返されています。



new 演算子 (インスタンスの生成)

クラスのインスタンス化には new 演算子を使います。

・new 演算子の構文: 型 変数名 = new クラス名();

クラス名()は厳密に言うとコンストラクタ名のことを指します。

 ※クラスとコンストラクタの関係については別記事で紹介させていただきます。


new 演算子でクラスをインスタンス化(new クラス名())して変数へ代入(型 変数名 = )することで

インスタンスを生成することができます。

実際のサンプルコードを確認しましょう。


◆名前を保持する機能を持つ Test クラスの作成。

// Test クラスの作成
public class Test {
	String name;
	
	public String method(String str) {
		return name = str;
	}

}


◆上記 Test クラスを new 演算子でインスタンス化する Task クラス

public class Task {

	Object test = new Test();

}

 ※自作クラスを含み、全てのクラスは Object クラスの派生となるため上記のように書くことができます。

Task クラスで生成したインスタンス test から Test クラスのメソッドやフィールドを呼び出せます。

public class Task {	
	public static void main(String[] arg) {

		Object test = new Test();
		test.method("田中");
		System.out.println(test.name); // 結果:田中を表示

	}
}

test の method に田中を入れて、test の name を呼んで「田中」を表示させるクラスです。

このように new 演算子を用いてクラスのインスタンス生成を行い、

そのインスタンスが保持するメソッドやフィールドを利用することができます。


生成されたインスタンスは変数名で呼び出すことができます。

この際に同クラスを元に2つのインスタンスを生成した場合、

それぞれ別のインスタンスとして判断されます。

public class Task {	
	public static void main(String[] arg) {
		Object test1 = new Test();
		Object test2 = new Test();
	}
}

同じ Test クラスから生成されたインスタンス test1, test2 はそれぞれ独立しているため、

それぞれの内容を別々に更新しても互いに影響は与えません。

Object test1 = new Test();
Object test2 = new Test();

test1.method("田中"); // test1 の method に田中を渡す
test2.method("山本"); // test2 の method に山本を渡す

System.out.println(test1.name); // 結果:田中を表示
System.out.println(test2.name); // 結果:山本を表示



余談

Test クラスで使用した String も実はクラスで、インスタンス生成を行なっています。

String はよく使われるクラスとして特別扱いされており new 演算子を使わずにインスタンス生成されますが、

省略せずに書くと「 String name = new String();」となります。



instanceof (単純なインスタンスを比較する場合)

複雑なプログラムになってくると、

「インスタンス化したクラスはプログラマーが意図したクラスか?」といったことを確かめたい場合が出てきます。

このような場合、instanceof 演算子を使うことで意図したクラスかどうかを確認することができます。

instanceof 演算子は boolean を返す真偽の演算子であり、if文と相性が良いです。

サンプルコードでは if文を使った例を見てみましょう。


◆ instanceof 演算子の利用例

Object test = new Test();

// 真偽値 true を返すため if文へ入って文字列を表示する
if(test instanceof Test) {
	System.out.println("testインスタンスはTestクラスに属します");
}

System.out.println(test instanceof Test); // 結果:true を表示

インスタンス化した test は Test クラスに属しているため true を返します。

インスタンスと比較できるクラスはそのインスタンスが属するクラスのみとなり、

インスタンスが属するクラスと異なるクラスを比較しようとするとコンパイルエラーを起こします。


ちなみに論理否定(エクスクラメーション( ! ))を使って false が返った場合に if文へ入るようにもできます。

Object test = new Test();

// true が返ってくるため if文には入らずスルー
if(!(test instanceof Test)) {
	System.out.println("testインスタンスはTestクラスに属しません");
}

System.out.println(test instanceof Test);


インスタンスのクラスを true / false で比較することができました。



まとめ

クラスを実体として使えるようにするために new 演算子を用いてインスタンス化させます。

インスタンス化したインスタンスは独立して存在するため、

同じクラスから作られた別のインスタンスにデータの更新があっても互いに影響を及ぼしません。

これらインスタンスが組み合わさって1つのプロジェクトが開発されます。


関連記事リンク

クラス宣言の方法 / オブジェクト指向とは? / コンストラクターの使い方 / 変数と定数の違い / メソッドとは? / stringクラスの紹介 / if文の使い方


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様