3

私が取り組んでいる問題セットの問題で「拡張」の問題にかなりの時間を費やしています-意図的に混乱させるように書かれているため、ブロックしているだけだと思います。与えられた問題は次のとおりです。

class A {
    int x;
    A(int a) {System.out.println(" class A");}
}

class B extends A {
   int x;
   B() {System.out.println(" class B");}
   public static void main (String [] args) {
    A a = new B();
    }
}

コンパイルすると、次のエラーがコンソールから追い出されます。

cannot find symbol
symbol  : constructor A()
location: class A
   B() {System.out.println(" class B");}
       ^

クラスAに触れずにクラスBでこのエラーを修正できるはずです.明らかに何かが欠けています.

これまでのところ、私は試しました:

  • B() の前に void を投げる - 同じエラー。
  • B() を A(int a) にする - 後者は無効なメソッド宣言エラーで返されます (その前に void を追加すると、元の「シンボルが見つかりません」エラーに戻ります)
  • B() B(int a) の作成 - 同じエラーに加えて、B() 宣言を破棄したため、追加の「シンボルが見つかりません」というエラーがスローされます。
  • クラス B を作成して A をクラス B に拡張すると、A(int A) が拡張されます - 9 つのエラーがスローされます。明らかに答えではありません。
  • A のクラス名を Apple に変更して、答えが得られるかどうかを確認します。これにより、Apple クラスの A(int a) の前に void を追加する必要がありますが、これはできません。

ここで何が欠けているのですか?これは厳密には高度なクラスではないため、それほど複雑なことはできませんが、これは私を完全に狂気にさせます. どんな助けでも大歓迎です。

4

4 に答える 4

5

派生クラスでは、基本クラスのコンストラクターを呼び出す必要があります。これを明示的に行わないと、コンパイラは引数のないコンストラクターへの呼び出しを挿入しようとします。基本クラスに何も存在しない場合、そのエラーが発生します。

解決策は、基本クラスのコンストラクターを何らかの値で明示的に呼び出すことです。

B() {
    super(0);
    System.out.println(" class B");
}
于 2010-12-06T03:22:28.820 に答える
2

B のコンストラクターでの最初の呼び出しは、super(a); である必要があります。a は、B のコンストラクターに入力したいものです。

于 2010-12-06T03:23:30.200 に答える
1

1) クラスを拡張すると、サブクラスには、スーパークラスのインスタンスを作成するために使用されるすべてのデータで構成されるデータのチャンクが暗黙的に含まれます。そのデータも初期化する必要があります。初期化方法を指定しない場合は、デフォルトのコンストラクター、つまりA.A(). しかし、このコンストラクターは存在しませんA.A(int)

この初期化を行うには、B コンストラクターの最初の行として、次のような特別な構文で A コンストラクターを呼び出します。

B() {
    super(42); 
    // because we are calling the constructor that takes an int, we must supply
    // one. It's up to you to figure out what values should be supplied. Maybe 
    // you wanted to take an int in the B constructor, and pass it along?
    System.out.println(" class B");
}

2)int x;クラス A とクラス B の両方で宣言されています。これは、おそらくあなたが望んでいるものではありません。前述のように、各 B インスタンスにint xは、B が A を拡張するために自動的に取得される が既に含まれています。

于 2010-12-06T03:26:00.167 に答える
0

クラス A にはデフォルト コンストラクターがありません。

クラス B には、引数のないデフォルトのコンストラクターがあります。スーパークラスのコンストラクターを呼び出す必要がありますが、クラス A にはそのようなものがないためできません。

于 2010-12-06T03:22:33.367 に答える