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