0

以下は簡単な例です。私には2つの抽象クラスがAあり、1つは抽象メソッドを含むB具象クラスです。C

新しいを作成するとき、のコンストラクターが呼び出されるCのを期待していました。なぜ彼らが呼ばれないのか、何か考えはありますか?AB

//Q.java
class Q {
    abstract class A {
        A() {
            System.out.println("in A");
        }
        public abstract void sayHi();
    }
    abstract class B extends A {
        B() {
            super();
            System.out.println("in B");
        }
    }
    class C {
        C() {
            super();
            System.out.println("in C");
        }
        public void sayHi() {
            System.out.println("Hi!");
        }
    }

    Q() {
        C Ccc = new C();
    }

    public static void main(String[] args) {
        Q z = new Q();
    }
}
4

6 に答える 6

6

のスーパークラスcObject

それ以降のクラス名は大文字で始まりますA,B,C,etc

両方を表示して呼び出される場合はab次のようにします。

class c extends b
于 2013-01-02T12:57:17.973 に答える
3

クラスはclassまたはをc拡張しないため、を使用してコンストラクターを呼び出すことはできず、代わりにコンストラクターを呼び出します。basuper()Object

これを試して :

class c extends b {
    public c(){
        super();
        //...
    }
}
于 2013-01-02T12:57:14.397 に答える
2

classから抽象クラスを拡張する必要がありますc

class c extends b {

b明示的に拡張しない場合は、

class c extends Object {

したがって、toをsuper呼び出すとObjectコンストラクターが呼び出されます。

于 2013-01-02T12:58:57.997 に答える
2

作るだけ:

class c extends b{

これで動作します。cでbを拡張していません。

于 2013-01-02T12:59:02.400 に答える
2

ほら、すべてのクラスが暗黙的に拡張するスーパークラスObjectがあります。したがって、持っている場合は public class A{} 、を書くことと同じ public class A extends Object{}です。ただし、独自の別のクラスを拡張する場合は、明示的に言及する必要があります。 public class B extends A{} そうしないと、JavaはObjectをスーパークラスとして扱います。(注:この場合でも、オブジェクトは「B」のスーパークラスですが、これは「A」のスーパークラスであり、したがって「B」であるためです)。したがって、「B extends A」について明示的に言及しない場合、クラスBはその唯一のスーパークラスとしてObjectを持ちます。さらに、サブクラスコンストラクターでsuper()について言及する必要はありません。これも暗黙的に呼び出されます。

于 2013-01-02T13:23:10.010 に答える
1

CBはまったく関係ありません。Cのスーパークラスはjava.lang.Objectデフォルトです

CB次のように拡張する必要があります

class C extends B{ .. }

このような場合、スーパークラスコンストラクターを呼び出します。

super()また、暗黙的に存在するため、明示的に呼び出す必要はありません。

于 2013-01-02T13:28:02.367 に答える