コンストラクタについて本気出して考えてみたら~
いつでも同じところに、行きつくのさ♪ とポ〇ノグラフティの名曲が頭をよぎったので、ちょっとしらべてみました。
はじめに
この記事は個人的な確認のための記事です。なので多分わかりやすくありません。あと厳密じゃないとか、ちょっと違うというお話はまぁ置いといてください。言語仕様読めばわかることなんでww
はじまりはこれ
2023/04/18に投稿されたこのツイートです。
これで、チャンと答えを乗せてくれればいいのに。。。残念だな。。と思ったのでちょっと調べることにしました。
この時点で私の認識でコンストラクタとは
- オブジェクトのインスタンス化時に一度だけ実行される、メソッドのようなもの(厳密にはメソッドではない)
さて、あっているでしょうか。
なんでコンストラクタはメソッドじゃないと思ったの?
これは完全に経験なんですが。リフレクションを使ったことがあると、直感的にわかります。
まずね。ConstructorとMethodってJava言語ではきちんとConstructor型とMethod型として定義されているわけです。そして。この2つのクラス。
- 直接の継承関係はありません
- つまりはis-aの関係がなりたたない=まったくの別物
だと、直感的に思っておりました。文章だけではわからないのできちんと、Java API仕様を確認しましょう。
ここです。わかりますか?java.lang.reflect.Executableの直系のサブクラスとしてConstructorとMethodが分岐しているのです。こういう情報ってありがたいですね。。やっぱりこいつら別の機能 なんですね。
ここまではよく使うJava API仕様からの類推でしたが、では実際に何が違うのでしょうか。。
Java 言語仕様を簡単に確認してみる
こういうときは、一次情報を当たるに限ります。Qiitaに書いてあったからとかそういうのをチャラっと信じちゃだめですからね!!わかりますね??というわけでJava言語仕様を確認します
「8.8. Constructor Declarations」にきちんと定義してくれていますね。
A constructor is used in the creation of an object that is an instance of a class.
「コンストラクタはクラスインスタンスを作る際に利用されます。」うむ想定通り。この話題で次に注目すべきは以下の記述かと思います。
Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.
いわく。コンストラクタはメンバじゃない。そしてインスタンスに含まれることもない。だからオーバーライドなんてできないよ。 なるほど。つまり
-
インスタンス化されたオブジェクトにコンストラクタはない。
-
コンストラクタはインスタンス化時に1度だけ呼ばれる使い捨て処理
-
だから Aclass.Aclass(); のような呼び方はできない。(多分)
なるほど。納得しました。
さて、時間もおそくなったのでまとめます。
本日のまとめ
- Constructor は Methodではない
- Constructorはクラスのメンバではない
- Constructorはクラス初期化処理を担う役割しかない。
あ、まぁそうよねという。。