スーパーコンストラクタで抽象メソッド呼び出しがあります。私は "コンストラクタの呼び出しがコンストラクタの最初の文でなければならない"というエラーに遭遇します。スーパーのコンストラクタを呼び出す前に、サブクラス内のいくつかの状態を初期化する必要があるからです。スーパークラスコンストラクタで抽象メソッドを呼び出す
私は、コンストラクタの呼び出しが最初でなければならないことを理解します。しかし、私にはいくつかの問題があります。
スーパークラスには、すべてのサブクラスが抽象メソッドを実装しています。 しかし、サブクラスのコンストラクタには、抽象メソッドを実行する前に処理する必要がある引数が必要です。私のコードで
は、私は、スーパークラスのコンストラクタで抽象メソッドを持っているので、あなたはもちろんの問題を理解します: スーパークラスが行います。- INFO1取得し、info2にスーパー(I1、I2)を使用して
- は、サブクラス
を通じて抽象メソッドを実行しますが、少しのスーパークラスのコンストラクタは)それも スーパー(の下の行に宣言されている情報3と情報4を、必要なことを知っていた - ライン。
私は、スーパークラスのコンストラクタが戻って、サブクラスから情報を集める前に、 メソッドを実行する前に、何も考えていないと思っていました。
また、すべてのサブクラスの抽象メソッドで引数が異なるため、このメソッドは引数を必要としません。
経験豊富な方、どうすればこの問題を回避できますか?いくつかのグーグル後
、これをしなければならないようだ。 http://webcache.googleusercontent.co...s-constructor/
しかし、まだ初心者なので、それはハードにハングアップするために見つける... 私はこのすべてを避けていたかもしれないと感じサブクラスのコンストラクタが処理された後にsuper()を使用するだけで問題が発生する場合があります。
リクエストに応じてコード:
abstract public class Prylar {
abstract public Integer value();
private String itemName;
private Person owner;
public Prylar(Person thisOwner, String iN){
owner = thisOwner;
itemName = iN;
value = value();
}
public class Smycken extends Prylar{
private int antalStenar;
private boolean guldEllerSilver;
private int value;
public Smycken (Person who, String n, int aS, boolean material){
super(who,n);
antalStenar = aS;
guldEllerSilver = material;
}
public Integer value() {
if (guldEllerSilver){
value = 2000;
}
else{
value= 700;}
value += (500*antalStenar);
return value;
}
}
そして、私はちょうど言って、これを終了するには、読んで男を助けるためにあなたの時間を割いてありがとうございました。ほんとうにありがとう。うまくいけば、他の人が同様の問題を抱えていると、彼らはこれにつまずくでしょう。
ありがとうございました!
私はあなたが私は2つのオプションを考えることができ、あなたのコード –
を投稿する必要があると思う は、この例で考えてみましょう内部では明示的に外部を呼び出します。 2.追加の情報を取得し、抽象メソッドの前に呼び出す別の抽象メソッドを作成します。 btw、どうしてあなたのメソッドのシグネチャを変更できないのですか? – aishwarya
コンストラクタでvalue()を呼び出してその結果を無視する理由を理解できません。私はtypoがあり、実際のコードはthis.value = value()であると推測しています。 ??? – user949300