アプリ版:「スタンプのみでお礼する」機能のリリースについて

javaのthisとsuperの理解の為に下記のようなクラスで実験してみているのですが、
少し解らない箇所が出てきました。
コメントアウト行(1)に書いたようにsuper()を書くとエラーが発生してしまいます。

確かsuper()はコンパイラが自動的にコンストラクタが実行された時1行目に挿入している。
と覚えていたので明示的にしようとしたのですが、どうやら認識違いのようでして、だとしたら

Q1:super()はいつ呼ばれているのでしょうか?


また、ConstThisTestは暗黙的にObjectクラスを継承しているはずなので

Q2:Objectクラスのコンストラクタが呼ばれているはずですが、
いつ呼ばれているかをログなどで確認する方法はありますでしょうか?
因みに開発環境はeclipseを使用しております。

尚javaのバージョンやeclipseのバージョン等は
今回は関係ないかなと思うので記載しておりません。

以上 何卒宜しくお願い致します。
---------------------------------------------------------
public class ConstThisTest {
int constValue = 0 ;
public ConstThisTest(int constValue) {
this.constValue = constValue;
}
public ConstThisTest() {
       /* (1)super()を書くとthis()は1行目にかかないと
         コンストラクタ内の最初のステートメントであることが必要とエラーが出る。 */
this(-1);
}

public void printValue(){
System.out.println("constValue = " + constValue);

}

}


public class ConstThisTestMain {
public static void main(String[] args) {
ConstThisTest ct = new ConstThisTest();
ct.printValue();
}

}

A 回答 (2件)

他のコンストラクタを呼び出す目的では this も super もコンストラクタの最初の文にする必要があります。

両方を同時に書くことはできません。

この場合は Object のコンストラクタを明示的に呼び出すならば int 引数付きのコンストラクタの冒頭で以下のように行えます。Q2 はこの呼び出しの部分でフックできるはずです。暗黙の呼び出しをフックできるかというのは……はてどうだったかなぁ。
public ConstThisTest(int constValue) {
super() // ここで明示的に呼ぶ
this.constValue = constValue;
}

> Q1:super()はいつ呼ばれているのでしょうか?
ConstThisTest()
 ↓
ConstThisTest(int constValue)
 ↓
(暗黙的な)super()
という順で呼ばれています。
    • good
    • 0

>確かsuper()はコンパイラが自動的にコンストラクタが実行された時1行目に挿入している。


>コンストラクタ内の最初のステートメントであることが必要とエラーが出る。

この2つが示すことは、「superとthisは共存できない」ということです。superはコンストラクタの1行目に暗黙の内に挿入されますが、thisがある場合はこの限りではありません。

thisは、クラス内のコンストラクタを呼び出します。注意したいのは、その呼び出されるコンストラクタ内でも暗黙の内にsuperは呼び出されている、という点です。すなわち、もしthisの前に暗黙裡にsuperが挿入されたなら、コンストラクタが二重に呼び出される(そのコンストラクタ内と、thisで呼び出されたコンストラクタ内)ことになり、インスタンス生成時の初期化が二重に実行されることになります。

従って、thisでクラス内のコンストラクタを呼び出す場合はsuperはつけませんし暗黙裡に挿入もされません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!