2016-09-26 10 views
4

私はJavaで私の話を始めていますが、私はPythonでいくつかのOOPを経験しています。私は、次のクラス階層を持っている:付属のコードは次のようなエラーが発生しJavaのサブクラスでパラメータ化されたコンストラクタをオーバーライド

class A { 
    public A() {}; 
    public A(final java.util.Map dict) {}; 
} 

class B extends A { 
} 

public class Main { 
    public static void main() { 
    java.util.Map d = new java.util.HashMap(); 
    B b = new B(d); 
    } 
} 

Main.java:16: error: constructor B in class B cannot be applied to given types; 
    B b = new B(d); 
     ^
    required: no arguments 
    found: Map 
    reason: actual and formal argument lists differ in length 
1 error 

は何に必要なコンストラクタがすでに基底クラスで定義されているので、私の期待は、ある、への-必要はありません別のコンストラクタを定義する。 super()を呼び出すこととは別に、何も特別なことをしないので、なぜ私はサブクラスのために1つを定義する必要がありますか? Javaコンパイラが子クラスのコンストラクタを定義する必要がある理由は何か特別な理由はありますか?

+0

質問です希望

B b = new B(); //invokes A's Default Constructor B b = new B(d); //invokes A's Parameter Consturctor 

ようにするためので、あなたのコードは、次の

class B extends A { B(){ super(); // calling super class default constructor } B(Map dict) { super(dict); // calling super class single parameter(map) constructor } } 

を必要とします言語のデザイナーであり、このコミュニティではありません。 Javaでは、コンストラクタは継承されません。それは事実です。それ以上のものは推測だろう。 – RealSkeptic

+1

[Javaのコンストラクタの継承]の可能な複製(http://stackoverflow.com/questions/1644317/java-constructor-inheritance) – shmosel

+0

"Javaコンパイラが子クラスのコンストラクタを定義する理由は何ですか? James GoslingとJava標準委員会以外の理由があれば、この方法がより良いと判断したのでしょうか?いいえ、1つではありません。 –

答えて

4

クラスをインスタンス化するときは、そのクラスのコンストラクタを呼び出す必要があります。

Javaクラスにコンストラクタがない場合、コンパイラはパラメータなしのコンストラクタを自動的に生成します。これにより、パラメータなしでクラスをインスタンス化できます(例ではnew B())。

あなたはパラメータを使用してBクラスをインスタンス化しようとしているので、あなたの好みのスーパークラスのコンストラクタを呼び出し、適切なコンストラクタを宣言する必要があります。

public B(Map dict) { 
    super(dict); 
} 
1

をあなたのクラスBにParametrisedコンストラクタを宣言する必要があります

import java.util.*; 

class B extends A 
{ 
    B(Map dict) { 
     super(dict); 
    } 
} 
0

なぜ詐欺:あなたは、クラスBの任意のものを初期化したくない場合など

何かそれからスーパーを呼び出します構造体は継承されませんか?コンストラクタはオブジェクトを初期化するために使用されます。通常、クラスから継承する場合、共通の機能を使用する傾向がありますが、作成は異なる可能性があります。したがって、コンストラクタを拡張することは、この場合、1つのクラスにすべての共通の機能を持たせ、異なる機能を含むユーティリティクラスを持つ方が良いでしょう。

1

Javaの場合 - コンストラクタでAクラスを拡張すると、Bサブクラスのコンストラクタは常にそれを呼び出す必要があります。 Aが0の引数を取得した場合(何も書き込む必要はありません)、コンパイラは自動的に呼び出します。より多くの引数がある場合は、super()でベースコンストラクタに渡す必要があります。いくつかの例を示します:

1

デフォルトのコンストラクタは、コンストラクタが定義されていないときに自動的に作成されます。 Aのデフォルトのコンストラクタを呼び出すために、Bにデフォルトのコンストラクタを追加する必要があります。

これだけで答えることができる、「なぜ、この方法は、言語の仕事はありません」のような明確な

関連する問題