Может кто-то указать, что я недопонимаю?Java: абстрактные конструкторы классов и это()
У меня есть два класса, реферат и бетон, а именно:
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) Класс = Бетон; Вызов конструктора no-arg .
2) Класс = Бетон; Создан конструктор 1-arg абстрактного объекта .
3) Класс = Бетон; Конкретный конструктор 1-arg Concrete.
Мой вопрос заключается в следующем: почему не вызов этого() из конструктора args String от String вызывает этот конструктор no-arg на Concrete? Или, возможно, более уместно, есть ли какой-либо способ заставить конструктор arg String ссылаться на конструктор no-arg на Concrete, позволяя «правильную» цепочку конструкторов?
Спасибо Jon. Тот факт, что getClass знает Object isa Concrete, но это() вызывает абстрактный конструктор no-arg, что кажется мне немного неестественным. Цепочка, которую я пыталась достичь, показала бы мне, что позволила бы более естественное разделение ответственности между конструкторами. Я думаю, что мне придется дублировать код в конструкторах Concrete или переместить его в новый метод, но поскольку я не пишу всех реализаций Concrete этого абстрактного класса, это то, что мне придется документировать для других разработчиков , –
Итак, вы пытались рассматривать конструкторы, как если бы они были виртуальными методами? Да, это не сработает. –