为什么把重写和final放在一起,原因就是一条:final的意思是不可更改的,也就是说final定义的东西是不可改变的,下面具体来说一下。
来看一段简单的代码:
1 class BaseClass { 2 final public function test() { 3 echo "BaseClass::test() called "; 4 } 5 6 public function moreTesting() { 7 echo "BaseClass::moreTesting() called "; 8 } 9 } 10 final class AbcClass{ 11 public function abc(){ 12 echo "abc"; 13 } 14 } 15 /* 16 class Abcd extends AbcClass{ 17 public function abcd(){ 18 } 19 } 20 */ 21 22 class ChildClass extends BaseClass { 23 public function moreTesting($tmp=null) { 24 echo "ChildClass::moreTesting() called "; 25 } 26 }
代码中定义了一个类,BaseClass然后ChildClass继承了这个类并且重写了这个类中的方法moreTesting,重写方法的时候方法名一定要一样,参数可以改变。这时候对象调用的时候就是调用的重写后的方法。
代码中注释了一个地方,如果这段代码被执行就会报错,因为AbcClass是final关键字定义的类,可以正常被使用,但不能被任何类继承。
类中final关键字定义的方法也不能被重写,比如BaseClass中的test方法,只能使用,如果重写会出现错误。