2

そのため、作業中のコードで少し問題が発生しました。基本的に、私は次の3つのコードを持っています。

抽象クラス:

public abstract class TestParent {
    int size;

    public TestParent(int i){
        size = i;
    }

}

子クラス:

     public class TestChild extends TestParent{
     public void mult(){
         System.out.println(this.size * 5);
     }

 }

実装:

public class TestTest {

   public static void main(String args[]) {
       TestChild Test = new TestChild(2);
       Test.mult();
   }
}
4

6 に答える 6

2

抽象クラスと拡張実装の次のケースを考えてみましょう。 https://stackoverflow.com/a/260755/1071979

abstract class Product { 
    int multiplyBy;
    public Product( int multiplyBy ) {
        this.multiplyBy = multiplyBy;
    }

    public int mutiply(int val) {
       return muliplyBy * val;
    }
}

class TimesTwo extends Product {
    public TimesTwo() {
        super(2);
    }
}

class TimesWhat extends Product {
    public TimesWhat(int what) {
        super(what);
    }
}

スーパークラスProductは抽象であり、コンストラクターを持っています。具象クラスTimesTwoには、値2をハードコードするだけのデフォルトコンストラクターがあります。具象クラスTimesWhatには、呼び出し元が値を指定できるようにするコンストラクターがあります。

注:親抽象クラスにはデフォルト(または引数なし)のコンストラクターがないため、サブクラスで使用されるコンストラクターを指定する必要があります。

抽象コンストラクターは、クラスの制約や、クラスのセットアップに必要な最小フィールドなどの不変条件を適用するために頻繁に使用されます。

于 2012-07-25T19:18:12.207 に答える
1

スーパークラスで明示的なコンストラクターが定義されていて、引数が定義されていないコンストラクターがない場合、子クラスはスーパークラスコンストラクターを明示的に呼び出す必要があります。

public class TestChild extends TestParent{
        TestChild ()
        {
            super(5);
        }
    }

または、パラメーターを使用してスーパークラスコンストラクターを呼び出したくない場合は、スーパークラスに引数を指定せずにコンストラクターを追加する必要があります。

public abstract class TestParent {
    int size;
    public TestParent(){

    }
    public TestParent(int i){
        size = i;
    }

}
于 2012-07-25T19:11:04.327 に答える
1
public class TestChild extends TestParent{
     public TestChild(int i){
         super(i); // Call to the parent's constructor.
     }
     public void mult(){
         System.out.println(super.size * 5);
     }

 }
于 2012-07-25T19:11:23.783 に答える
1

super親(TestParent.TestParent(int))コンストラクターを呼び出すために使用します。

public class TestChild extends TestParent{

    public TestChild(int i) {
        super(i);
    }

    //...

}

または、定数を使用する場合:

    public TestChild() {
        super(42);
    }

Javaには抽象コンストラクターのようなものはないことに注意してください。基本的に、コンストラクターをTestParent呼び出す前に呼び出す必要があるコンストラクターは1つだけTestChildです。

また、それsuper()は常に最初のステートメントでなければならないことに注意してください。

于 2012-07-25T19:11:51.473 に答える
0

基本クラスにはデフォルトのコンストラクターがないため、コードはコンパイルされません。基本クラスで提供するか、派生クラスでパラメーター化されたコンストラクターを提供してsuperを呼び出す必要があります。

于 2012-07-25T19:13:04.343 に答える
0
 public class TestChild extends TestParent{
             public TestChild (int i)
             {
               super(i * 2);
             }

}

このコードはiのdoubleを使用します。何を聞きたいのかわかりませんが、これは最優先です。

その他の解決策:

 public class TestChild extends TestParent{
             public TestChild (int i)
             {
               super(i);
               this.size = 105;
             }

}

このソリューションでは、サイズを保護または公開する必要があります。

于 2012-07-25T19:13:14.577 に答える