Java でオブジェクトを作成するさまざまな方法
出典:
Medium このチュートリアルでは、Java でオブジェクトを作成するさまざまな方法を学びます。 Java オブジェクトは Java クラスのインスタンスです。各オブジェクトには状態、動作、識別子があります。フィールド (変数) はオブジェクトの状態を格納し、メソッド (関数) はオブジェクトの動作を示します。クラスは、実行時にオブジェクト インスタンスが作成される「設計図」として機能します。
Java でのオブジェクトの作成
オブジェクトの作成は、クラス フィールド (変数とも呼ばれます) にデータを格納するためにメモリを割り当てるプロセスです。このプロセスは、多くの場合、クラスのインスタンスの作成と呼ばれます。Java でオブジェクトを作成するには 4 つの異なる方法があります。
- 新しいキーワードを使って
- メソッドnewInstance()
- clone()メソッド
- オブジェクトの逆シリアル化
ここで、前述の各方法を詳しく見てみましょう。
キーワード新規
これは、Java でオブジェクトを作成する最も一般的な方法です。
newキーワードは、指定された型の新しいインスタンスにメモリを割り当てることによって、クラスのインスタンスを作成します。new の後にコンストラクターが来ます。コンストラクターは、オブジェクトの作成と、作成されたオブジェクトのフィールドの初期化を担当する特別なメソッドです。オブジェクトは
new演算子で作成され、コンストラクターで初期化されます。
new演算子を使用して Java オブジェクトを作成する例を次に示します。
Date today = new Date();
この式は、新しい
Dateオブジェクトを生成します(
Date はjava.utilパッケージ内のクラスです)。コード内のこの 1 つの句は、宣言、インスタンス化、初期化という 3 つの操作を実行します。
Date today は、 todayがDate型のオブジェクトを参照することをコンパイラに通知する変数宣言です。new 演算子は
Dateクラスをインスタンス化し(メモリ内に新しい
Dateオブジェクトを作成し)、
Date()がオブジェクトを初期化します。以下の例を考えてみましょう。
public class Person {
private String name;
private int uid;
public Person() {
this.name = "Michael Cole";
this.uid = 101;
}
public Person(String name, int uid) {
super();
this.name = name;
this.uid = uid;
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person("John Bodgan", 102);
System.out.println("Name: " + p1.getName() + " UID: " + p1.getUid());
System.out.println("Name: " + p2.getName() + " UID: " + p2.getUid());
}
}
このコードから、
newキーワードを使用して
Personオブジェクトを作成します。
- p1オブジェクトは、変数名の値を「Michael Cole」に設定し、UID を 101 に設定して、パラメータ化されていないコンストラクターを呼び出します。
- p2オブジェクトはパラメータ化されたコンストラクターを呼び出し、値「John Bodgan」と 102 をコンストラクターに渡し、これらの値に変数名と UID が割り当てられます。
newInstance() メソッドの使用
Java のnewInstance()メソッドは、指定されたクラスのオブジェクトのインスタンスを動的に作成するために使用されます。
newInstance()メソッドには 2 つの標準的な使用法があります。
- java.lang.Class APIのnewInstance()メソッド
- java.lang.reflect.Constructor APIのnewInstance()メソッド
クラス API から newInstance() を使用する
実行時にクラスのオブジェクトを作成するには、クラス API から
newInstance()メソッドを呼び出す必要があります。このメソッドは、そのクラスのオブジェクトを返します。java.lang.Classクラスの
newInstance()メソッドはパラメータや引数をとらないため、そのクラスの引数なしのコンストラクタとして呼び出すことができます。
java.lang.Classクラスの
newInstance()メソッドを使用して
Personクラスのオブジェクトを作成するコード例をいくつか見てみましょう。
public class Person {
private String name;
private int uid;
public Person() {
this.name = "Carl Max";
this.uid = 101;
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class c = Class.forName("com.medium.option2.Person");
@SuppressWarnings("deprecation")
Person p = (Person) c.newInstance();
System.out.println("Name: " + p.getName());
System.out.println("UID: " + p.getUid());
}
}
Class.forName (クラスの完全修飾名) は、 Personという名前のクラスをロードし、次に
newInstance() は、タイプPersonの新しいオブジェクトを作成し、そのオブジェクトへの参照を返します。
ここで、 pへの
Person参照を使用して、その
getters()および
setter()を呼び出して特定のアクションを実行できます。ご注意ください:
- Class.forName()とnewIstance() は両方とも、 tryブロックとcatchブロック、またはthrowsキーワードを使用して処理する必要がある例外をスローします。
- Class API のnewInstance()メソッドはJava 9 以降非推奨になりました。
コンストラクター API から newInstance() を使用する
Constructorクラス(
java.lang.reflect.Constructor ) のnewInstance()メソッドは、パラメータ化されたコンストラクタのパラメータを受け入れることを除いて、
Classクラスの
newInstance()メソッドに似ています。
java.lang.reflect.Constructorクラスの
newInstance()メソッドを使用して
Personクラスのオブジェクトを作成することにより、このアプローチを示してみましょう。
public class PersonTwo {
private String name;
private int uid;
public PersonTwo() {
this.name = "Maya Kumari";
this.uid = 101;
}
public PersonTwo(String name) {
this.name = name;
this.uid = 102;
}
public PersonTwo(String name, Integer uid) {
this.name = name;
this.uid = uid;
}
public static void main(String[] args) {
try {
Class.forName("com.medium.option2.PersonTwo");
Constructor c1 = PersonTwo.class.getConstructor();
PersonTwo p1 = (PersonTwo) c1.newInstance();
System.out.println("Name: " + p1.getName());
System.out.println("UID: " + p1.getUid());
Constructor c2 = PersonTwo.class.getConstructor(String.class);
PersonTwo p2 = (PersonTwo) c2.newInstance("James Gunn");
System.out.println("Name: " + p2.getName());
System.out.println("UID: " + p2.getUid());
Constructor c3 = PersonTwo.class.getConstructor(String.class, Integer.class);
PersonTwo p3 = (PersonTwo) c3.newInstance("Mark Brown", 103);
System.out.println("Name: " + p3.getName());
System.out.println("UID: " + p3.getUid());
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
上記のコードでは、まずClass.forName()メソッド を使用してクラスをロードする必要があります。
次に、 getConstructor()メソッドを呼び出して、渡されたパラメーターのデータ型を照合します。最後に、
newInstance()メソッドで、必須パラメータ (引数がない場合は
null ) を渡します。newInstance()メソッドは、適切なコンストラクターを呼び出すことによって、
PersonTwoクラスの新しいオブジェクトを返します。
clone() メソッドの使用
clone()メソッドは
Objectクラスの一部であり、既存のオブジェクトのコピーを作成するために使用されます。クラス コンストラクターを呼び出さずに、クラスのオブジェクトを作成します。メソッドのクローンを作成するには、対応するクラスがマーカー インターフェイスである
Cloneableインターフェイス を実装している必要があります。
ここで、 Personクラスのオブジェクトを作成し、それを
Personクラスの別のオブジェクトに複製します。
public class Person implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
private String name;
private int uid;
public Person(String name, int uid) {
super();
this.name = name;
this.uid = uid;
}
public static void main(String[] args) {
Person p1 = new Person("Ryan", 101);
try {
Person p2 = (Person) p1.clone();
System.out.println("Name: " + p2.getName());
System.out.println("UID: " + p2.getUid());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
注記。
クローン化されたオブジェクトは、 p2参照を介して同じ元のオブジェクトを参照します。ただし、複製されたオブジェクトには別のメモリが割り当てられます。
これは、 p2によって参照される
Personオブジェクトに加えられた変更は、
p1によって参照される元の
Personオブジェクトを変更しないことを意味します。これは、
clone()メソッドがオブジェクトの浅いコピーを作成するためです。
オブジェクトの逆シリアル化の使用
オブジェクトの逆シリアル化は、一連のバイト ストリームからオブジェクトを抽出するプロセスです。シリアル化はその逆です。その主な目的は、保存されたオブジェクトをデータベース/ネットワークからメモリに取得することです。オブジェクトをシリアル化または逆シリアル化したい場合は、
Serializableインターフェイス(トークン インターフェイス) を実装する必要があります。以下の例を考えてみましょう。
public class PersonDriver {
public static void main(String[] args) {
Person p1 = new Person("Max Payne", 101);
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream("link to text file");
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);
outputStream.writeObject(p1);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
FileInputStream fileInputStream;
try {
fileInputStream = new FileInputStream("link to text file");
ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
Person p2 = (Person) inputStream.readObject();
System.out.println("Name: " + p2.getName());
System.out.println("UID: " + p2.getUid());
inputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ここではまず、参照
p1によってPersonオブジェクトをテキスト ファイルにシリアル化します。
writeObject()メソッドは、オブジェクトのバイト ストリームをテキスト ファイルに書き込みます。次に、オブジェクトの逆シリアル化を使用して、
Personオブジェクトを抽出してp2に戻します。同様に、
readObject()メソッドは、オブジェクトの入力ストリームからオブジェクトを読み取ります。
最後に、 Personオブジェクトからコンソールに データを出力します。
結論
この記事では、Java でオブジェクトを作成するさまざまな方法について学びました。まず、最も一般的な方法である
newキーワードを使用してオブジェクトを作成する方法を検討しました。次に、
クラス クラスと
コンストラクタークラスから
newInstance()メソッドを学習しました。これは、オブジェクトを作成するもう 1 つの一般的な方法です。次に、新しいオブジェクトを作成する代わりに、既存のオブジェクトの浅いコピーを作成する
clone()メソッドを使用しました。最後に、オブジェクトのシリアル化と逆シリアル化の概念を使用して、Java でオブジェクトを作成しました。
Java で String to Int - 文字列を整数に変換する方法
出典:
FreeCodeCamp 今日は、 Integerクラスの 2 つのメソッド、parseInt()とvalueOf()を使用して、Java で文字列を整数に変換する方法を学びます。これは、文字列変数の値を使用して数学的演算を実行するときに役立ちます。
Integer.parseInt を使用して Java で文字列を整数に変換する方法
このオプションは、
parseInt()メソッドが整数に変換する文字列をパラメータとして受け取ることを前提としています。
Integer.parseInt(string_varaible)
使用例を見る前に、文字列値と整数を変換せずに追加するとどうなるかを見てみましょう。
class StrToInt {
public static void main(String[] args) {
String age = "10";
System.out.println(age + 20);
}
}
このコードでは、文字列値「10」を持つ 変数
ageを作成しました。整数値に 20 を加算すると、正解の 30 ではなく、誤って 1020 を受け取りました。これは、
parseInt()メソッドを使用して修正できます。
class StrToInt {
public static void main(String[] args) {
String age = "10";
int age_to_int = Integer.parseInt(age);
System.out.println(age_to_int + 20);
}
}
ここでは、年齢変数を整数に変換するために、それをparseInt()メソッド(
Integer.parseInt(age) ) にパラメーターとして渡し、
age_to_intという変数に格納しました。これで、別の整数に加算すると、正しい加算が得られます:
age_to_int + 20。
Integer.valueOf を使用して Java で文字列を整数に変換する方法
valueOf()メソッドは
parseInt()メソッドと同じように機能します。整数に変換する必要がある文字列をパラメータとして受け取ります。以下に例を示します。
class StrToInt {
public static void main(String[] args) {
String age = "10";
int age_to_int = Integer.valueOf(age);
System.out.println(age_to_int + 20);
}
}
上記のコードでは、前のセクションと同じことがわかります。
- valueOf() : Integer.valueOf(age)にパラメータとして文字列を渡しました。これはage_to_intという変数に格納されました。
- 次に、作成した変数に 10 を追加しました: age_to_int + 20。結果は 1020 ではなく 30 でした。
結論
この記事では、Java での文字列から整数への変換について説明しました。文字列を整数に変換するには、
Integerクラスの 2 つのメソッド、
parseInt()と
valueOf()が使用されました。コーディングを楽しんでください!
GO TO FULL VERSION