Java 如何强制我的子类构造函数不调用基类构造函数?

Java 如何强制我的子类构造函数不调用基类构造函数?,java,Java,然后,当我称之为: public class Base { public Base() { foo(); } public void foo() { System.out.println("Base.foo()"); } } public class Derived extends Base { public Derived () {} public void foo() { System.out.println("Derived.foo()"

然后,当我称之为:

public class Base {
    public Base() {
    foo();
  }

public void foo() {
    System.out.println("Base.foo()");
  }
}



public class Derived extends Base {

public Derived () {}

public void foo() {
    System.out.println("Derived.foo()");
  }
}
它输出:

public class Running {

public static void main(String[] args) {
    Base b = new Base();
    Derived d = new Derived();
  }
}
那么,当它到达派生构造函数时,为什么会调用基构造函数,而使用派生构造函数的方法呢

PS:如果我将这些方法标记为私有,它将打印出来:

*Base.foo()*

*Derived.foo()*

这就是Java的工作原理阅读本页

更具体地说,请注意:

注意:如果构造函数没有显式调用超类 构造函数时,Java编译器会自动插入对 没有超类的参数构造函数。如果超级类没有 如果没有参数构造函数,则会出现编译时错误。 对象确实有这样的构造函数,所以如果对象是唯一的 超类,没有问题

正如你所看到的,这是预期的行为。即使你有一个超级呼叫,它仍然会自动插入

关于第二个问题,即使您在超级构造函数体中,您的实例仍然属于子类型。另外,如果您对C++有一些熟悉的话,请阅读这个< /P>
当标记为private时,它将编写基类的原因是私有方法没有被继承。这是Java继承主题的一部分。

这就是Java的工作原理阅读本页

更具体地说,请注意:

注意:如果构造函数没有显式调用超类 构造函数时,Java编译器会自动插入对 没有超类的参数构造函数。如果超级类没有 如果没有参数构造函数,则会出现编译时错误。 对象确实有这样的构造函数,所以如果对象是唯一的 超类,没有问题

正如你所看到的,这是预期的行为。即使你有一个超级呼叫,它仍然会自动插入

关于第二个问题,即使您在超级构造函数体中,您的实例仍然属于子类型。另外,如果您对C++有一些熟悉的话,请阅读这个< /P>
当标记为private时,它将编写基类的原因是私有方法没有被继承。这是Java主题中继承的一部分。

因为在派生类的构造函数中,如果不添加对super或同一类中的其他构造函数的调用(使用它),它会自动被注入对super()的调用。

因为在派生类的构造函数中,它会自动被注入对super()的调用,如果您没有添加对super或同一类中其他构造函数的调用(使用此选项)。

回答标题中的问题。正如我所说的,您无法避免调用基类构造函数(如果基类构造函数不止一个,则调用其中一个基类构造函数)。当然,您可以轻松避免执行构造函数的主体。例如:

*Base.foo()*

*Base.foo()*
现在,主方法仅打印:

public class Base {

    public Base(boolean executeConstructorBody) {
        if (executeConstructorBody) {
            foo();
        }
    }

    public void foo() {
        System.out.println("Base.foo()");
    }
}

public class Derived extends Base {

    public Derived() {
        super(false);
    }

    public void foo() {
        System.out.println("Derived.foo()");
    }
}

public class Running {

    public static void main(String[] args) {
        Base b = new Base(true);
        Derived d = new Derived();
    }
}

回答标题中的问题。正如我所说的,您无法避免调用基类构造函数(如果基类构造函数不止一个,则调用其中一个基类构造函数)。当然,您可以轻松避免执行构造函数的主体。例如:

*Base.foo()*

*Base.foo()*
现在,主方法仅打印:

public class Base {

    public Base(boolean executeConstructorBody) {
        if (executeConstructorBody) {
            foo();
        }
    }

    public void foo() {
        System.out.println("Base.foo()");
    }
}

public class Derived extends Base {

    public Derived() {
        super(false);
    }

    public void foo() {
        System.out.println("Derived.foo()");
    }
}

public class Running {

    public static void main(String[] args) {
        Base b = new Base(true);
        Derived d = new Derived();
    }
}

请正确缩进,以便阅读。您正在重写一个方法,因此将调用对象类型的最具体实现。请阅读重写派生类中的方法。另一方面,无法避免调用基类构造函数,因为对象的“基本部分”也需要构造。在现实生活中,这也是你最想要的。请正确缩进,这样会更容易阅读。您正在重写一个方法,因此将调用对象类型的最具体实现。请阅读重写派生类中的方法。另一方面,无法避免调用基类构造函数,因为对象的“基本部分”也需要构造。在现实生活中,这通常也是你想要的。