8:コンストラクタ | Java入門メモ

Java入門メモ

Javaの基礎知識についてゆるゆると書いています

※初めてこのサイトに来た方は

↓Java入門メモについて(必読)を読んでください。

http://ameblo.jp/javareference/entry-10815079120.html




※このページではコンストラクタの機能を生かすために


あえて変数にstaticを付けていません。


詳しい事はEX4:豆知識


「3、staticについて」


「4、フィールド、ローカル変数、仮引数について」


を見てください。



1.コンストラクタ


コンストラクタとは


HelloWorld a = new HelloWorld();


とインスタンスを作った時の()の中に入れる引数の事です。


ここに入れた値でインスタンスは初期化されます。


クラスにコンストラクタを設定するには


そのクラス内で


HelloWorld() {


}


と書きます。


コンストラクタ名はclass名と同じです。


メソッドに似てますが、戻り値は必要ありません。


戻り値と引数については6:メソッド を見てください。


class ConstructorTest {

   int b;
   String c;

   public static void main(String[] args) {

   }

   ConstructorTest(int no, String st) {

   }

}


↑引数を設定しただけではメソッドと同じく何も処理しません。



class ConstructorTest2 {

   int b;
   String c;

   public static void main(String[] args) {

   }

   ConstructorTest2(int no, String st) {
      b = no;
      c = st;
   }

}


↑ですが、このようにbとcへの代入文を書くと 


ConstructorTest2 a = new ConstructorTest2(1, Test);


という文でインスタンスが作られた時に


ConstructorTest2型のaの中のbに1、cに"Test"が代入されます。


↓さらに詳しく書くとこうなります。


class ConstructorTest3 {

   int b;
   String c;

   public static void main(String[] args) {

   }

   ConstructorTest3(int no, String st) {
      this.b = no;
      this.c = st;
   }

}


↑これが正しい文です。先程の文は「thisを省略している」だけなのです。


thisは「自インスタンス」を指します。



2.thisとコンストラクタ内の変数


ちょっとややこしい話になりますが


コンストラクタの{ }内で宣言した変数とthis(自インスタンス)の変数は


↓同じ名前を重複して使う事ができます。


class ConstructorTest4 {

   int b;
   String c;

   public static void main(String[] args) {

   }

   ConstructorTest4(int no, String st) {
      b = no;
      c = st;
      int b = no;
      String c = st;
   }

}

↑のコンストラクタの{ }内にある変数bとcは


それぞれ別の変数として扱われます。


コンストラクタ内で宣言した変数はコンストラクタ内でしか使えません。


「コンストラクタ内で変数を使う時」は


コンストラクタ内で作られた変数が優先して使用されます。


「this」を付けて使えばコンピュータが


ちゃんとthis(自インスタンス)の変数と見分けを付けてくれるので


thisをしっかり記入しておくと色んな意味で間違いが起こりにくくなります。


 ちなみにコンストラクタを作らなかったクラスをインスタンス化すると


自動的に{ }と()の中が無いコンストラクタが作られたかのように動きます。


もっと理解を深めたい場合は↓を見てください。



3.コンストラクタ内の処理の実行



変数に代入せずに


new ConstructorTest();


とだけ宣言した場合は


ConstructorTestコンストラクタ内の処理を自動で行います。


処理内容は宣言をしたクラスにも反映されます。


(HelloWorldクラスでnew ConstructorTest();と書いた場合


HelloWorldクラスにも影響がある)


引数も書けるので、戻り値が必要ないところ以外はメソッドと同じです。



4.同名コンストラクタと同名メソッド



コンストラクタは引数の定義が違っていればいくつでも作ることができます。


ConstructorTest4(int no) {
   this.b = no;
}


ConstructorTest4() {

}


↑2つともConstructorTest4クラスに付け加えてみてください。


引数が違うのでエラーになりません。


実はメソッドも引数の定義が違っていれば


「同じ名前のメソッドをいくつでも作れる」のです。