
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();
}
}
No.2ベストアンサー
- 回答日時:
他のコンストラクタを呼び出す目的では this も super もコンストラクタの最初の文にする必要があります。
両方を同時に書くことはできません。この場合は Object のコンストラクタを明示的に呼び出すならば int 引数付きのコンストラクタの冒頭で以下のように行えます。Q2 はこの呼び出しの部分でフックできるはずです。暗黙の呼び出しをフックできるかというのは……はてどうだったかなぁ。
public ConstThisTest(int constValue) {
super() // ここで明示的に呼ぶ
this.constValue = constValue;
}
> Q1:super()はいつ呼ばれているのでしょうか?
ConstThisTest()
↓
ConstThisTest(int constValue)
↓
(暗黙的な)super()
という順で呼ばれています。
No.1
- 回答日時:
>確かsuper()はコンパイラが自動的にコンストラクタが実行された時1行目に挿入している。
>コンストラクタ内の最初のステートメントであることが必要とエラーが出る。
この2つが示すことは、「superとthisは共存できない」ということです。superはコンストラクタの1行目に暗黙の内に挿入されますが、thisがある場合はこの限りではありません。
thisは、クラス内のコンストラクタを呼び出します。注意したいのは、その呼び出されるコンストラクタ内でも暗黙の内にsuperは呼び出されている、という点です。すなわち、もしthisの前に暗黙裡にsuperが挿入されたなら、コンストラクタが二重に呼び出される(そのコンストラクタ内と、thisで呼び出されたコンストラクタ内)ことになり、インスタンス生成時の初期化が二重に実行されることになります。
従って、thisでクラス内のコンストラクタを呼び出す場合はsuperはつけませんし暗黙裡に挿入もされません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java java final 1 2022/06/10 22:49
- Java eclipse実行ができない 2 2022/07/27 04:47
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一部の文字列を数値に変える方法
-
Javascriptでクラスの順番を入...
-
違うクラスからの変数の共有化
-
アブストラクトとインターフェ...
-
ネストしたenumへのリフレクシ...
-
無名パッケージからのインポート
-
クラス間でのデータ参照
-
「オブジェクト志向」の考えか...
-
デシリアライズでオブジェクト...
-
javaの配列とクラス
-
VB.NETで出来てC#で出来ない???
-
この問題の解説をお願いします。
-
FilterReader クラスのカスタム...
-
C#にて別クラスの関数を使いたい
-
(クラス名.this.メソッド)って...
-
範囲外の数値を代入したらエラ...
-
相互的な検索のできるハッシュ...
-
関数内の変数に<summary>コメン...
-
Genericsの型パラメータ
-
C# log4netの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#でほかのファイルにある自作...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
import と extends について
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#のクラスライブラリでメッセ...
-
C++でfriendクラスにしているの...
-
ひとつのファイルにクラスは1つ?
-
無名パッケージからのインポート
-
継承したクラス側のクラス名の取得
-
visual studioのデザイナ画面で...
-
a href="..." とServlet
-
Java リフレクションについて
-
構造 他のクラスの構造体を別...
-
ASP Pageの孫継承のPage_Load
-
別ファイルのclassの読み込みに...
-
オーバーロードしたメンバ関数...
-
実行可能jarファイルのファイル...
おすすめ情報