抽象类中的构造函数?

为什么抽象类有构造函数? 由于我们无法创建它的对象,为什么我们需要抽象类中的构造函数?

在某些情况下,我们需要初始化抽象类中的字段。 如果它是一个空构造函数,则由子类中的构造函数隐式完成,否则我们使用super(parameters) 。 带参数的构造函数强制子类指定一些参数(不一定来自它自己的参数)。

总而言之,这意味着构造函数由子类构造函数使用,而不是来自“外部”。

通过向抽象类添加构造函数,可以强制子类调用super来初始化某些字段。 例:

abstract class Person { private String name; public Person(String name) { this.name = name; } } class SoccerPlayer extends Person { public SoccerPlayer(String name) { super(name); } } Person p = new SoccerPlayer("Ronaldo");
abstract class Person { private String name; public Person(String name) { this.name = name; } } class SoccerPlayer extends Person { public SoccerPlayer(String name) { super(name); } } Person p = new SoccerPlayer("Ronaldo"); 

您仍然需要能够创建一个必须调用其父级构造函数及其父级等的子类。

真正的问题是为什么你可以将一个抽象类构造函数公开。 ;)

因为inheritance您的abstact类的类可以调用此构造函数

 abstract class Foo { private int number; public Foo(int i) { this.number = i; } } class Bar extends Foo { public Bar() { super(1); } } 

子类可以实例化,并可以从其构造函数中调用抽象类的构造函数。 例:

 abstract class Foo { public Foo() { // Do Stuff } } class Bar extends Foo { public Bar() { super(); } } 

可以想象一个抽象类,如派生类的蓝图,最多1个或2个方法,必须在派生类中实现。 在抽象类中实现尽可能/合理的实现是有意义的,包括构造函数。

抽象构造函数强制从类inheritance的类来实现(或调用)构造函数。 这意味着您可以确保将执行抽象类的构造函数中的任何操作。

抽象类表示更高级别的对象,在某些情况下,这些顶级对象需要在业务透视图创建对象时设置值。 缺少设置此值可能导致业务对象失败。 构造函数在构造类时强制设置值(否则可能会被遗忘)。 例如,

 public abstract class AccountHolder { } public abstract class Account { private AccountHolder holder; public Account(AccountHolder holder) { this.holder = holder; } } public class FixedDeposit extends Account { public FixedDeposit (AccountHolder holder) { super(holder) } } 

在这里,我们无法想象没有持有者的账户,因此在创建对象时设置持有者是至关重要的。 在基本级别设置它可确保在添加新类型的子类时强制设置它。 因此,确保’开放扩展但关闭修改’是SOLID原则之一。

基类中的构造函数可用于执行构造函数链接,因此您可以初始化基类字段。 在此构造函数中,您可以放置​​一些businesslogic来validation参数

示例构造函数chainging:

 public abstract class Person { protected readonly string Name; protected Person(string name) { //Do some validations or regex on the name for example so you know all person names match your business rules Name = name; } } public class Employee : Person { private decimal _salary; public Employee(string name, decimal salary) : base(name) { _salary = salary; } }