2011-03-23 157 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; 
    } 
}