继承、访问控制符、子类重载父类的方法、子类调用父类的方法
来源:互联网 发布:java初级编程题目 编辑:程序博客网 时间:2024/05/14 20:06
继承
继承性也是面向对象程序设计中的重要特性之一,在面向对象领域有着极其重要的角色,它是指建立一个新的派生类,从先前定义的类中继承数据和函数,而且可以重新定或加进新的数据和函数,从而建立了类的层次或等级关系。但在php中只能使用单继承,就是说一个类只能直接从另一个类中继承数据,但是一个类可以有多个子类。
在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性。这是信息组织与分类的行之有效的方法。它简化了对象、类的创作工作量,增加了代码的可重用性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的可重用性。
<?php header('content-type:text/html;charset=utf-8');class Person{ var $name; var $sex; var $age; function __construct($name,$sex="男",$age=1){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.'<br/>'; }}//注:不能继承私有的成员属性和方法class Student extends Person{//继承Person的三个成员属性(name,sex,age)、一个构造函数、一个成员方法(say)。 var $school; function study(){ echo $this->name.' 正在 '.$this->school.' 学习<br/>'; }}class Teacher extends Student{//继承Student的四个个成员属性(name,sex,age school)、一个构造函数、两个成员方法(say、study)。 var $wage; function teaching(){ echo $this->name.' 正在 '.$this->school.' 教学,工资:'.$this->wage; }}$teacher=new Teacher('张三','男',40);$teacher->school='edu';$teacher->wage=3000;$teacher->say();$teacher->study();$teacher->teaching();//结果如下:我的姓名:张三 性别:男 年龄:40张三 正在 edu 学习张三 正在 edu 教学,工资:3000
访问控制符
同一个类中 private protected public(默认)
类中子类 protected public
所有的外部成员 public
protected
当类中的成员被定为 protected 对于同一个类的所有成员都没有访问限制,但对于该类的外部代码是不改变操作的,对于该类的子类也不能访问 protected 修饰的成员。
<?phpheader('content-type:text/html;charset=utf-8');class Myclass { private $var1=100; private function printHello(){ echo 'Hello'; }}class Myclass2 extends Myclass{ function UserPerson(){ echo $var1; $this->printHello(); }}$myclass=new Myclass();//实例化类//echo $myclass->var1;//外部是不能访问private修饰的成员属性//$myclass->printHello();//外部是不能访问private修饰的成员方法$myclass1=new Myclass2();$myclass1->UserPerson();//私有成员属性和私有成员方法不能被继承,所以在子类中访问出错。//结果如下:Fatal error: Cannot access private property Myclass::$var1 in D:\WWW\test.php on line 16Fatal error: Call to private method Myclass::printHello() from context '' in D:\WWW\test.php on line 17Notice: Undefined variable: var1 in D:\WWW\test.php on line 11Fatal error: Call to private method Myclass::printHello() from context 'Myclass2' in D:\WWW\test.php on line 12
protected
当类中的成员被定义为protected ,对于该类的子类及子类的子类都有访问权限,可以进行属性、方法的读及写操作。当不能被该代码的外部代码访问,该子类的外部代码也不具有访问其属性和方法的权限。
<?phpheader('content-type:text/html;charset=utf-8');class Myclass { protected $var1=100; protected function printHello(){ echo 'Hello<br>'; }}class Myclass2 extends Myclass{ protected $var2=200; function UserPerson(){ echo $this->var1.'<br/>'; $this->printHello(); }}$myclass1=new Myclass2();$myclass1->UserPerson();//echo $myclass1->var1;//被protected 修饰的成员属性和成员方法外部不能访问。echo $myclass1->var2; //该子类的外部代码也不具有访问其属性和方法的权限//结果如下:100HelloFatal error: Cannot access protected property Myclass2::$var1 in D:\WWW\test.php on line 18Fatal error: Cannot access protected property Myclass2::$var2 in D:\WWW\test.php on line 19
子类重载父类的方法
在php中不能定义重名的函数,也包括不能在一个类中定义重名的方法,所以也就没有办法重载。但是在子类中可以定义和父类同名的方法,因为父类的方法已近存在了,这样在子类中就可以把从父类中继承过来重写。
<?php header('content-type:text/html;charset=utf-8');class Person{ var $name; var $sex; var $age; function __construct($name,$sex="男",$age=1){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.'<br/>'; }}class Student extends Person{ var $school; function __construct($name,$sex="男",$age=1,$school=''){ $this->name=$name; $this->sex=$sex; $this->age=$age; $this->school=$school; } //子类重写父类的方法 function say(){ echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.' 在'.$this->school.'学校上学<br/>'; }}$student=new Student('张三','男',40,'edu');$student->say();//结果如下:我的姓名:张三 性别:男 年龄:40 在edu学校上学
子类调用父类的方法
调用格式 parent::方法名 列如:parent::__construct();
显然上面的代码有问题,显示非常的繁琐。另外,有些父类中的源代码并不是可见的,所以就不能在重载时复制被覆盖方法中的源代码。在php中,提供了在子类重载的方法中调用父类中被它覆盖的方法功能。这样就可以在子类重写的方法中,继续使用从父类中继承过来的方法,然后添加一些新的功能。
<?php header('content-type:text/html;charset=utf-8');class Person{ var $name; var $sex; var $age; function __construct($name,$sex="男",$age=1){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.'<br/>'; }}class Student extends Person{ var $school; function __construct($name,$sex="男",$age=1,$school=''){ parent::__construct($name,$sex,$age);//调用父类的构造函数 $this->school=$school; } //方法重写 function say(){ parent::say();//调用父类的say()方法 echo ' 在'.$this->school.'学校上学<br/>'; }}$student=new Student('张三','男',40,'edu');$student->say();//结果如下:我的姓名:张三 性别:男 年龄:40在edu学校上学
- 继承、访问控制符、子类重载父类的方法、子类调用父类的方法
- c++ 子类“重载”父类的方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承父类的static方法
- 子类继承父类的构造方法
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量
- 【Java笔记】继承父类的方法可以调用子类的方法(子类必须在重写相应方法)
- python子类调用父类的方法
- Python 子类调用父类的方法
- python子类调用父类的方法
- python子类调用父类的方法
- python子类调用父类的方法
- python子类调用父类的方法
- 学习大神的沉浸式布局
- Notification——通知应用
- Java 利用枚举实现单例模式
- selenium之 玩转鼠标键盘操作(ActionChains)
- 常用控件系列之——代码实现RadioGroup嵌套RadioButton
- 继承、访问控制符、子类重载父类的方法、子类调用父类的方法
- 嵌入式学习笔记 一:内存分部
- C++ PRIMER 5TH 课后题答案1.16
- 华为笔试题1-2016
- 选择排序(2)
- application——注意点
- TCP和UDP有什么区别
- 简单描述Oracle物化视图日志
- android控件——ImageView