有人可以指出我的误解吗?
我有两个类,一个抽象类和一个具体类,如下所示:
public abstract class Abstract
{
protected static int ORDER = 1;
public static void main (String[] args)
{
Concrete c = new Concrete("Hello");
}
public Abstract()
{
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Abstract's no-arg constructor called.");
}
public Abstract(String arg)
{
this();
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Abstract's 1-arg constructor called.");
}
}
和
public class Concrete extends Abstract
{
public Concrete()
{
super();
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Concrete's no-arg constructor called.");
}
public Concrete(String arg)
{
super(arg);
Class c = this.getClass();
System.out.println(ORDER++ + ": Class = "
+ c.getSimpleName()
+ "; Concrete's 1-arg constructor called.");
}
}
当我运行它时,我得到以下输出:
1) Class = Concrete; Abstract's no-arg constructor called.
2) Class = Concrete; Abstract's 1-arg constructor called.
3) Class = Concrete; Concrete's 1-arg constructor called.
我的问题是:为什么 Abstract 的 String arg 构造函数对 this() 的调用不调用 Concrete 上的无参数构造函数?或者,也许更相关的是,有没有办法让 Abstract 的 String arg 构造函数调用 Concrete 上的无参数构造函数,从而允许构造函数的“正确”链接?
最佳答案
否 - 构造函数链接总是要么横向(在同一类型中)要么向上(到父类型)。
不要忘记调用必须在编译时解析 - 并且 Abstract
不知道其他类将从它派生什么,或者他们将拥有哪些构造函数。
您可以在Abstract
构造函数中调用虚拟方法,并在Concrete
中重写该方法...但我强烈建议您< em>不这样做。特别是,Concrete
的构造函数主体尚未执行,变量初始值设定项也不会执行 - 因此它无法对 Concrete
执行任何操作 -具体状态。在某些非常特定情况下,这样做是正确的,但这种情况很少见,应谨慎处理。
你到底想做什么?通常我发现最好有许多“横向”链通向具有“向上”链的单个构造函数。
关于Java:抽象类构造函数和 this(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859546/