質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

なぜクラスをインスタンス化する際にコンストラクタが必ずないとダメなの?

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,517

mr0237

score 162

JAVAのオブジェクト指向を勉強・練習している者です。

説明が下手ですいませんが、「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P357)「暗黙のコンストラクタ」のところを復習を兼ねて読み直しているのですが、

実はJavaでは、すべてのクラスはインスタンス化に際して、必ず何らかのコンストラクタを実行することになっています。ですから、本来すべてのクラスは、「引数のない、何も処理をしないコンストラクタ」でよいので、最低でも1つ以上のコンストラクタ定義を持っていなければなりません。コンストラクタが一つも定義されてないクラスは許されないのです。

と書かれていたのですが、

1.なぜインスタンス化する際にコンストラクタが必ずないとダメなのですか?

2.「引数なし、処理内容なし」のコンストラクタ(デフォルトコンストラクタ)に入る初期値はintの場合だと0などの何もない感じの値が入るのでしょうか?

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+5

なぜインスタンス化する際にコンストラクタが必ずないとダメなのですか? 

何らかのデータを格納するためのメモリ領域を確保したら、速やかにその領域に意味ある値を設定するのはよい作法であることが過去の経験上分かっています。

Javaはその言語仕様として、コンストラクタでその「よい作法」を強制するようにしている。ということです。この言語仕様は「縛り」ではなく、より良いコーディングを促すための仕組みです。

「引数なし、処理内容なし」のコンストラクタ(デフォルトコンストラクタ)に入る初期値はintの場合だと0などの何もない感じの値が入るのでしょうか? 

そうです。しかし、その挙動に頼ったコーディングをするべきではありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

Javaの設計上、すべての Object は始祖として Object クラスを持っている関係で、例え自らは定義していなくても、祖先にさかのぼってデフォルトコンストラクタが呼ばれます。

子孫クラスで定義しているメンバフィールドに関する初期化はどうなるのかというと、Java 仮想マシンの仕様として、次のように初期化されることになっています。

整数型 0
char \u0000
実数型 0.0
boolean false
参照型 null

ですが、きちんとコンストラクタを定義して、初期値を(例え0であっても)設定してやるべきですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

クラスはあくまで設計書です。設計書を書いただけでは製品は作れませんよね?その作る方法を記したのがコンストラクタであり、製品を作る際にコンストラクタという"マニュアル"にそって製造するわけです。そういう設計から外れた作り方は許されないのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る