abstract類和abstract方法

2021-07-03 19:03:55 字數 3208 閱讀 6849

可以使用abstract來修飾乙個類或者方法。

用abstract修飾的類表示這個類是乙個抽象類,用abstract修飾的方法表示這個方法是乙個抽象方法。

抽象類不能被例項化。

抽象方法是只有方法宣告,而沒有方法的實現內容。

可以使用abstract來修飾乙個類。

用abstract修飾的類表示這個類是乙個抽象類。

抽象類不能被例項化。

這是乙個簡單抽象的方法,如果它被直接例項化,系統會報錯。

[php]view plain

copy

print?

<?php 

//定義乙個抽象類 

abstract class user  } 

//例項化這個類會出現錯誤 

echo new user(); 

?> 

下面例子的 normaluser 繼承自 user類,就可以被例項化了。

[php]view plain

copy

print?

<?php 

//定義乙個抽象類 

abstract class user  } 

//例項化這個類會出現錯誤 

echo new user(); 

class normaluser extends user 

$a = new normaluser(); 

echo "這個類" . $a . "的例項"; 

?> 

單獨設定乙個抽象類是沒有意義的,只有有了抽象方法,抽象類才有了血肉。下面介紹抽象方法。

用abstract修飾的類表示這個方法是乙個抽象方法。

抽象方法,只有方法的宣告部分,沒有方法體。

抽象方法沒有 {} ,而採用 ; 結束。

乙個類中,只要有乙個抽象方法,這個類必須被宣告為抽象類。

抽象方法在子類中必須被重寫。

下面是乙個抽象類,其中有兩個抽象方法,分別是 setsal() 和 getsal()。用來取回 $sal 員工的工資。

[php]view plain

copy

print?

<?php 

abstract class user  } 

?> 

既然user類不能被直接繼承,我們寫乙個normaluser類繼承自user類。當我們寫成如下**時,系統會報錯。這個錯誤告訴我們,在 user類中有兩個抽象方法,我們必須在子類中重寫這兩個方法。

[php]view plain

copy

print?

<?php 

abstract class user  } 

class normaluser extends user 

?> 

下面例子,重寫了這兩個方法,雖然方法體裡面 {} 的內容是空的,也算重寫了這個方法。注意看重寫方法的引數名稱,這裡只要引數數量一致就可以,不要求引數的名稱必須一致。

[php]view plain

copy

print?

<?php 

abstract class user  } 

class normaluser extends user 

function setsal($sal)  

} //這樣就不會出錯了。 

?> 

下面19-21行,三種寫重寫的方式都會報錯。

19行,缺少引數。

20行,引數又多了。

21行,引數型別不對。(這種寫法在以後章節介紹)

乙個類中,如果有乙個抽象方法,這個類必須被宣告為抽象類。

下面這個類不是抽象類,其中定義了乙個抽象方法,會報錯。

[php]view plain

copy

print?

<?php 

class user  } 

//這個類中有兩個抽象方法,如果這個類不是抽象的。會報錯 

?> 

抽象類繼承抽象類

抽象類繼承另外乙個抽象類時,不用重寫其中的抽象方法。

抽象類中,不能重寫抽象父類的抽象方法。

這樣的用法,可以理解為對抽象類的擴充套件

下面的例子,演示了乙個抽象類繼承自另外乙個抽象類時,不需要重寫其中的抽象方法。

[php]view plain

copy

print?

<?php 

abstract class user 

abstract class vipuser extends user 

?> 

抽象類在被繼承後,其中的抽象方法不能被重寫。

如果發生重寫,系統會報錯。

[php]view plain

copy

print?

<?php 

abstract class user 

abstract class vipuser extends user 

?> 

抽象類繼承抽象類,目的對抽象類的擴充套件。

[php]view plain

copy

print?

<?php 

abstract class user 

abstract class vipuser extends user 

?> 

在php5.1中,抽象類中支援靜態抽象方法。下面這個例子,看到靜態抽象方法可以宣告。實現這個方法時,必須是靜態的方法。

在php5.1中,抽象類中支援靜態抽象方法。下面這個例子,看到靜態抽象方法可以宣告。實現這個方法時,必須是靜態的方法。

[php]view plain

copy

print?

<?php 

abstract class user 

class vipuser extends user 

static function setsal($sal)  

} vipuser::setsal(100); 

echo "you sal is " . vipuser::getsal(); 

?> 

//這裡的抽象方法好像沒有問題 

abstract類和abstract方法

可以使用abstract來修飾乙個類或者方法。用abstract修飾的類表示這個類是乙個抽象類,用abstract修飾的方法表示這個方法是乙個抽象方法。抽象類不能被例項化。抽象方法是只有方法宣告,而沒有方法的實現內容。可以使用abstract來修飾乙個類。用abstract修飾的類表示這個類是乙個抽...

abstract類和abstract方法

可以使用abstract來修飾乙個類或者方法。用abstract修飾的類表示這個類是乙個抽象類,用abstract修飾的方法表示這個方法是乙個抽象方法。抽象類不能被例項化。抽象方法是只有方法宣告,而沒有方法的實現內容。abstract 抽象類 可以使用abstract來修飾乙個類。用abstract...

abstract 類的誤解

今天在寫 時,很多類中都要使用log4j,每個類中都要寫一句private logger log logger.getlogger myclass.class 特別麻煩,所以就想在父類中定義乙個protected log物件,供子類使用,網上搜了一下例子,從這些例子中看到了自己很多地方的誤解,特此記...