2011-03-23 165 views
19

为什么抽象类有一个构造函数? 因为我们不能创建它的一个对象,为什么我们需要一个抽象类中的构造函数?抽象类中的构造函数?

+9

为什么赏金? – 2011-08-27 01:12:44

+1

@Kublai Khan:对不起,但你不能在堆栈溢出问这样的问题“你的问题似乎是主观的,并可能被关闭?“;) – vinayvasyani 2011-08-30 14:27:11

回答

35

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

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

+1

真棒重播 – developer 2011-03-30 06:32:36

1

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

abstract class Foo 
{ 
    public Foo() 
    { 
    // Do Stuff 
    } 
} 

class Bar extends Foo 
{ 
    public Bar() 
    { 
    super(); 
    } 
} 
8

你仍然需要能够创建一个子类必须调用它的父类的构造及其父母等

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

1

想象一个抽象类,像一个派生类的蓝图,最多1个或2个必须在派生类中实现的方法。 在抽象类(包括构造函数)中尽可能/明智地实现它是有意义的。

2

,因为它继承您的abstact类的类可以调用此构造

abstract class Foo { 

    private int number; 

    public Foo(int i) { 
     this.number = i; 
    } 
} 

class Bar extends Foo { 

    public Bar() { 
     super(1); 
    } 

} 
0

从类继承来实现(或调用)构造函数的抽象构造力量类。这意味着你可以确定抽象类的构造函数中的任何操作都将被执行。

25

通过向抽象类添加构造函数,您可以强制子类调用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"); 
 
+1

你能解释得更清楚吗 – developer 2011-03-30 06:33:21

+3

+1为清楚的例子 – 2014-04-05 22:28:35

+0

@marcosbeirigo'强制子类打电话给超' - 你不需要也添加一个私人的无参数构造函数来完成迫使子类使用参数调用抽象超类的构造函数的目标? – 2014-12-01 08:35:07

0

抽象类代表对象的更顶尖水平,在某些情况下,这些顶级的对象需要值在由企业的角度创建对象的设定。缺少设置此值可能会导致业务对象失败。构造函数在抽象类中受到支持,以在构建类时强制设置值(否则可能会被遗忘)。例如,

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原则之一。

0

基类中的构造函数可以用来构造函数链,所以你可以初始化你的基类字段。在这种构造可以放一些businesslogic来验证参数

例如构造器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; 
    } 
}