まだオブジェクト指向のやり方がわからない?と「オブジェクト指向再訪」では、オブジェクト指向プログラミングの概念と特徴を紹介しました。また、次のようなコードも多く含まれています:
Dog dog = new Dog();この記事では、オブジェクトの作成に焦点を当てます。
例の紹介
以下はDogクラスです:
Dog dog = new Dog();
以下は、Dogオブジェクトを作成し、関連する処理を行うTestクラスです:
/**
*
*/
public class Dog {
private String name;
private int age;
private String address;
public void say() {
System.out.println(" " + name + " " + age + "歳、在住" + address + "ワン・ワン・ワン...");
}
//getters 和 setters
}
出力:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName(" ");
dog.setAge(1);
dog.setAddress("明るい近隣")
dog.say();
}
}
オブジェクトとオブジェクト変数
オブジェクトはクラスに基づいて作成され、使用されるのはクラスではなく特定のオブジェクトです。オブジェクトを使用するには、まずそのオブジェクトを作成する必要があります。次のコードはオブジェクトを作成するステートメントです:
Dog dog = new Dog();これを3つの部分に分けて見てください:
new: オブジェクトを作成するには、new演算子を使わなければなりません。
Dog(): これはコンストラクタで、コンストラクタは特別なメソッドです。このコンストラクタを呼び出すことで、オブジェクトを作成して初期化することができます。
new Dog()を連結すると、正しくオブジェクトが作成されます。しかし、作成されたオブジェクトは一度だけ使用されるのではなく、何度も使用されます。そのため、オブジェクトに 「名前を付けて」「呼び出し中」であることを確認する必要があります。これには3番目の部分が必要です:
Dog dog: dogというDog型の変数を宣言します。これは、int number型の数値変数を宣言するのと似ています。
これを=で代入することで、生成されたオブジェクトにdogという 名前を 与え、後でdogオブジェクトと呼ぶことができます。
ここで誤解があるかもしれませんが、dog dogはdogオブジェクトの生成の一部であり、これは間違いです。dogは最初から最後までただの変数です。この変数とint numberやstring strなどと宣言された変数との間には型以外の違いはありません。
実際にオブジェクトを生成するのはnew Dog()の部分です。
ここで、 "take a name "の 意味を説明します。
Javaでは、オブジェクト変数に格納されているのはオブジェクトではなく、本当の変数はメモリのどこかに眠っています。オブジェクト変数があれば、オブジェクトの位置がわかり、その位置から本当のオブジェクトを見つけることができます。
下のコードを見てください:
私の名前はブラッキー、1歳、ブライトの近所に住んでいる、ワンワン、ワンワン...
1b6d8536はメモリ上の犬オブジェクトのアドレスです。
コンストラクタ
先に述べたように、オブジェクトを作成する鍵はnew演算子とコンストラクタを使うことです。コンストラクタとは、オブジェクトを生成して初期化するために呼び出される特別なメソッドのことです。
コンストラクタの特徴
- アクセス修飾子があります。
- コンストラクタの名前はクラス名と同じです。
- コンストラクタには戻り値がありません。
- コンストラクタは new 演算子とともに使用します。
- コンストラクタは、0 個、1 個、あるいはそれ以上のコンストラクタを持つことができます。
- クラスは複数のコンストラクタを持つことができます。
参照なしのコンストラクタ
つまり、Dog() のようにパラメータを持たないコンストラクタです。パラメータなしコンストラクタは、Java のデフォルトのコンストラクタです。コンストラクタなしでクラスを記述した場合、Java はデフォルトでクラス内にパラメータなしコンストラクタを提供します。
Dogクラスにはコンストラクタが書かれていません。Dogクラスはデフォルトで以下のようなパラメータなしのコンストラクタを持っています:
public Dog() { } です。パラメトリック・コンストラクタ
パラメトリック・コンストラクタとは、パラメータを持つコンストラクタのことです。例えば
Dog dog = new Dog();
これは非常に単純なコンストラクタで、パラメータ n と a に値を渡し、オブジェクトのプロパティに値を代入します。唯一の欠点は、パラメータの変数名が十分に「名前付け」されていないことです:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();//犬オブジェクトを作る
System.out.println(dog);//犬を印刷する
}
}
出力:基本.Dog@1b6d3586
パラメータの名前はオブジェクトのメンバ変数の名前と同じで、パラメータの意味が非常に明確になります。値を代入する際には、thisキーワードを使用して両者を区別します。thisは作成されたオブジェクトを表し、this."".nameはオブジェクトのメンバ変数です。
パラメトリックコンストラクタを使用すると、オブジェクトのプロパティを初期化することができます:
public Dog() {
}
出力:
public Dog(String n, int a, String addr) {
name = n;
age = a;
address = addr;
}
複数のコンストラクタの使用
まず、オーバーロードという概念を理解しましょう。オーバーロードとは、クラス内に同じメソッド名で異なるパラメータを持つメソッドが複数存在することです。戻り値の型は、同じであってもなくてもかまいません。注意:オーバーロードされたメソッドのパラメータリストは一意でなければなりません。
注意: パラメータ・リストの一意性とは、パラメータ・リストの型の一意性を意味します。
func(文字列名)とfunc(文字列アドレス)のメソッドの引数リストが異なると思ってはいけません。func(String)とfunc(String)は同じメソッドです。
次の図は、Stringクラスのいくつかのメソッドのオーバーロードを示しており、引数リストの一意性を理解することができます:
なぜパラメータリストは一意でなければならないのですか?
ここでもうひとつの概念、メソッドのシグネチャについて説明します。メソッドのシグネチャとは、メソッドを完全に記述するために、メソッド名とパラメータ型を示す必要があることを意味します。注意:メソッドの戻り値の型はシグネチャの一部ではありません。
つまりJavaでは、メソッド名とパラメータリストがメソッドを識別します。メソッド名とパラメータ・リストが同じで、戻り値の型が異なるメソッドは存在しません。
一方、オーバーロードは、同じメソッド名で異なる引数リストを必要とします。メソッドシグネチャの観点からは、オーバーロードされたメソッドは本質的に互いに異なります。
オーバーロードのおかげで、クラス内で異なるパラメータリストを持つ複数のコンストラクタを書くことができ、クラスに複数のオブジェクト生成形式を与えることができます。例えば
public Dog(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
コンストラクタを3つ書くことで、オブジェクトを作成する方法が3つになります:
public static void main(String[] args) {
Dog dog = new Dog("パピー・パラメトリック", 1, " ");
dog.say();
}
コンパイラは、指定されたパラメータに基づいて適切なコンストラクタにマッチします。
注意: パラメータなしのコンストラクタは、コンストラクタが記述されていない場合にのみデフォルトで提供されます。そのため、クラス内に他のコンストラクタがある場合、パラメータなしコンストラクタが必要であれば、手動で書き出す必要があります。
コンストラクタ間の関係
クラスでは、あるコンストラクタが別のコンストラクタを呼び出すことができます。以下に例を示します:
私の名前はパピー・アリセン、1歳、地球に住んでいる、ワンワンワン!...
Dog(String, int) を使用してオブジェクトを作成します:
public class Dog {
private String name;
private int age;
private String address;
public Dog() {//他のコンストラクタが存在する場合、非参照コンストラクタはデフォルトでは提供されない。
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public Dog(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public void say() {
System.out.println(" " + name + " " + age + "歳、在住" + address + "ワン・ワン・ワン...");
}
//getters 和 setters
}
出力:
Dog dog = new Dog(" ", 1, " ");
Dog dog1 = new Dog(" ", 2);
Dog dog2 = new Dog();
別のコンストラクタを呼び出すには、コンストラクタの最初の行でthis を使ってください。注意:1行目の文でなければなりません。
オブジェクト・プロパティの初期化
初期化とは、オブジェクトを作成し、そのプロパティの値を設定することです。
属性のデフォルト値
オブジェクトのプロパティ値は、オブジェクトの作成時に明示的に設定されていない場合、デフォルト値に初期化されます。
デフォルト値は、数値の場合はfalse、ブーリアン値の場合はfalse、オブジェクト参照の場合はnullです。
次の例の Dog クラスのプロパティ値です:
/**
*
*/
public class Dog {
private String name;
private int age;
private String address;
public Dog(String name, int age) {
this(name, age, " ");//別のコンストラクタを呼び出す
System.out.println("つのパラメーターを持つコンストラクター");
}
public Dog(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
System.out.println("つのパラメーターを持つコンストラクター");
}
public void say() {
System.out.println(" " + name + " " + age + "歳、在住" + address + "ワン・ワン・ワン...");
}
//getters and setters...
}
オブジェクトを作成します:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("パピー・パラメトリック", 1);
dog.say();
}
}
出力
つのパラメーターを持つコンストラクター
つのパラメーターを持つコンストラクター
私の名前はパピー・アリセン、1歳、天の川に住んでいる、ワンワンワン!...
プロパティ値の直接設定
クラスのプロパティの値をクラス内で直接設定することで、そのクラスに基づいて作成されたオブジェクトのプロパティの値を決定することができます。
以下の例では、Dog クラスの属性値を設定しています:
public class Dog {
private String name;
private int age;
private String address;
public void say() {
System.out.println(" " + name + " " + age + "歳、在住" + address + "ワン・ワン・ワン...");
}
}
この時点でオブジェクトが作成されます:
public static void main(String[] args) {
Dog dog = new Dog();
dog.say();
}
出力されます:
私の名前はヌル、私は0歳、ヌルに住んでいる、ワンワン、ワンワン...
コンストラクターを使った初期化
オブジェクトのプロパティの値がコンストラクタで明示的に設定されていない場合は、デフォルト値に初期化されます。次のパラメータなしのコンストラクタのように:
public Dog() { } オブジェクトを作成します。オブジェクトを作成します:
public class Dog {
private String name = " ";
private int age = 2;
private String address = " ";
public void say() {
System.out.println(" " + name + " " + age + "歳、在住" + address + "ワン・ワン・ワン...");
}
}
出力します:
public static void main(String[] args) {
Dog dog = new Dog();
dog.say();
}
参照なしコンストラクタのメソッド本体でプロパティ値を初期化できます:
私の名前はブラッキー、2歳、太陽系に住んでいる、ワンワン、ワンワン...
オブジェクトを作成します:
public Dog() {
}
出力します:
public static void main(String[] args) {
Dog dog = new Dog();
dog.say();
}
パラメトリックコンストラクタを使用することも可能で、その場合、オブジェクトは渡された変数に従ってプロパティ値を初期化します:
私の名前はヌル、私は0歳、ヌルに住んでいる、ワンワン、ワンワン...
オブジェクトを作成します:
public Dog() {
name = " ";
age = 2;
address = " ";
}
出力:
public static void main(String[] args) {
Dog dog = new Dog();
dog.say();
}
また、エラーがあれば修正してください。





