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

class b extends a
{
b()
{
super();
System.out.println("B");}
}

class c extends b
{
c(){System.out.println("c");}
}

class last
{
public static void main(String aaa[])
{
c obj = new c();
}
}

出力は次のようになります。

A

B

C

すべきではありません:

A

A

B

C

スーパーキーワードのため

4

5 に答える 5

8

super(); is always there if you don't specify explicitly. Java only adds automatic call if you don't specify it explicitly.

So your code

    B() {
        super();
        System.out.println("B");
    }

is same as

    B() {
        System.out.println("B");
    }
于 2012-10-15T07:33:25.983 に答える
4

No. If you have a call to super within the constructor, the automatic call doesn't get added. The compiler only adds the automatic call if you leave yours out. So the super(); line in b is unnecessary, as that's exactly what the compiler will add for you (a call to the default constructor). That is, these two bits of source result in identical bytecode:

// This
class b {
    b() {
    }
}

// Results in the same bytecode as this
class b {
    b() {
        super();
    }
}

The reason for being able to call the superclass constructor directly is for passing arguments to it, since the compiler will only ever add calls to the default constructor (and will complain if there isn't one on the superclass).

于 2012-10-15T07:33:12.093 に答える
2

super(); is called once within any constructor through inheritance tree, either you do it explicitly or it is done implicitly. So you shouldn't expect that "A" will be printed twice.

This won't compile:

b()
{
    super();
    super();
    System.out.println("B");
}

Error message: Constructor must be the first statement in a constructor.

It means that you are not allowed to call super() multiple times in a constructor.

于 2012-10-15T07:35:56.310 に答える
0

extendsキーワードを使用して他のクラスのサブクラスを作成する場合、Javaコンパイラはコンストラクタの最初の行としてsuper()呼び出しを配置し​​ます(自分で作成していない場合)。この例では、クラスaは(デフォルトで)java.lang.Object()を拡張し、コンパイル後の最初の行は、Objectのデフォルトコンストラクターを呼び出すsuper()を呼び出します。したがって、サブクラスコンストラクターのコードが実行される前に、そのスーパークラスコンストラクターのコードが実行されます。

Aが複数回印刷されないのはなぜですか?Javaコンパイラは、コンストラクタの先頭にsuper()を追加するのは、自分でそれを行っていない場合のみです。(たとえば、いくつかのパラメーターを受け取るスーパークラスコンストラクターを呼び出したい場合があります)

うまくいけば、それは物事を少し明確にします。

于 2012-10-15T07:40:51.780 に答える
0
package threaddemo;

public class NewClass {
    NewClass() {
        System.out.println("hello");
    }
}

class Child extends NewClass {

    Child() {
        System.out.println("child");
    }

    public static void main(String []ar) {
        Child c1=new Child();
    }
}
于 2014-06-05T19:32:09.093 に答える