5

このコードでは、クラス A の super(t) またはクラス B の引数なしコンストラクターのいずれかで動作することを理解しています。以下のコードでは、クラス B の引数なしコンストラクターを使用しています。引数なしコンストラクターを取り出すと、クラスBのコードは機能しません。私はプログラミングが初めてで、理解しようとしているのは、クラス B の引数なしのコンストラクターの何が特別なのかということです。コードが機能するために存在しなければならないのはなぜですか? 特別な条件または規則とは何ですか?

public class Test {

    public static void main(String[] args) {

       B b = new B(5);

    }
}

class A extends B {
    public A(int t)  {

        System.out.println("A's constructor is invoked");
    }
}

class B  {

    public B() {

    }

    public B(int k)   {
    System.out.println("B's constructor is invoked");
    }
}
4

7 に答える 7

2
class A extends B {

コンパイラは、このクラスのコンパイル中に保証します。this()プログラマーが明示的に記述しない場合、 class で提供されるすべてのコンストラクターの最初の行としてsuper()追加されます。super()A

また、コンパイラーは、プログラマーによって提供された他のコンストラクターがない場合、引数なしのコンストラクターをクラスに追加することも保証します。

ここで、クラスで引数なしのコンストラクターを提供しないBと、コンパイラーもコンストラクターに引数を提供した原因を提供しないとしましょう。ただし、クラスでは、コンストラクターの最初の行としてA追加されます。super()つまり、基本クラスの引数のないコンストラクターへの呼び出しです。したがって、コンパイルエラーが発生します。

したがって、あなたが言ったように、クラスで引数なしのコンストラクターを提供するか、クラスでB書き込みます。super(<int>)A

于 2013-01-10T06:29:06.207 に答える
1

クラス B にコンストラクターが定義されていない場合は、暗黙的なデフォルト コンストラクターが存在します。それ以外の場合は、引数のないコンストラクターを明示的に定義する必要があります。

なぜ引数なしのコンストラクターが必要なのですか?

Aコンストラクターを介してインスタンス化されている場合

public A(int t)  {

        System.out.println("A's constructor is invoked");
    }, 

B() への暗黙的な super() 呼び出しがありますが、引数のないコンストラクターを定義しないと、これを完了できないため、エラー メッセージが表示されます。

于 2013-01-10T06:22:32.230 に答える
1

他のコンストラクターを定義すると、Java は引数コンストラクターを追加しません。
引数なしのコンストラクターは、必要に応じて Java によって使用されるデフォルトのコンストラクターではありません。

于 2013-01-10T06:24:42.353 に答える
1

単語は「特別」ではなく、「デフォルト」です。

スーパークラス コンストラクターを呼び出さないことを選択した場合A(int t)デフォルトでコンストラクターB()が呼び出されます。これは、Java が他のどのコンストラクターをデフォルトと見なすことができるかを判断できないためです。したがって、B()存在せず、それへの呼び出しがある場合 (この場合のように)、コンパイルは失敗します。

A明確にするために、行のためではなく、クラスの定義のためにコンパイルが失敗しますB b = new B(5);。その行は問題ありません。

于 2013-01-10T06:24:48.770 に答える
1

クラス B の no args コンストラクターの特別な点は何ですか?コードが機能するために存在しなければならないのはなぜですか? 特別な条件またはルールは何ですか?

--> クラスにコンストラクターを指定しない場合。コンパイラはno-arg/default constructorクラスに追加します。

引数を持つコンストラクターがある場合、コンパイラーはデフォルトのコンストラクターを追加しません。必要に応じて追加する必要があります。

于 2013-01-10T06:25:04.297 に答える
1

All constructors for classes other than Object must start with either a "this" call, invoking another constructor of the same class, or a "super" call, invoking a superclass constructor.

If there is no explicit "this" or "super" call at the start of a non-Object constructor, the compiler, in effect, inserts a simple "super();".

The class A constructor is, in effect:

    public A(int t)  {
        super();
        System.out.println("A's constructor is invoked");
    }

Obviously, there must be a B() constructor for this to work.

于 2013-01-10T06:29:51.490 に答える
1

簡単に言うと、サブクラス コンストラクターの最初の行は への呼び出しsuper()です。
これが舞台裏で起こっていることです。

{
public A(int);
  Code:
   Stack=2, Locals=2, Args_size=2
   0:   aload_0
   1:   invokespecial   #1; //Method B."<init>":()V
   4:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   7:   ldc     #3; //String A's constructor is invoked
   9:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   12:  return
  LineNumberTable:
   line 11: 0
   line 13: 4
   line 14: 12

}

ご覧のとおり、1 行目はデフォルトのコンストラクター (引数なし) である B.init() を呼び出しています。

これが、B で引数なしのコンストラクターが必要な理由です。

于 2013-01-10T06:32:49.980 に答える