面向对象(Object-Oriented)
面向对象
- 面向对象,即我们以对象为核心去实现我们的目的,对象顾名思义:万物皆对象,一个人,一条狗...
- 当我们通过对象处理一些事情时,会让我们的代码清晰明了,内部高聚合,对外低耦合,即封装的思想
- 相比面向过程,面向对象会让我们的代码更加精简,更具有灵魂性,同时也提高了代码的复用性
###下面通过PHP来讲解(实例化对象)
* * *
- 面向对象,有对象必然会引入类,对象是类的实例化,当我们定义一个类,比如‘人’,那么具体到男人、女人...那便是实例化对象了
- 其定义如下:
<?php
class Humen {
public $name = "熔岩巨兽"; //定义共有变量
public function eat($food){ //定义共有方法
echo $this->name."'s eating ".$food; //this是man实例化对象(伪变量)
}
}
$man = new Humen(); //通过new关键字实例化一个对象,即通过Humen类实例化出一个对象,存放到$man变量中
echo $man->name."\n"; //对象通过->调用类成员(属性、方法)
$man->eat('apple');
?>
构造函数
- 当我们想要在实例化对象时,定义我们的属性和方法时,我们可以引入构造函数,这样我们便可以灵活定义属性、方法
- 其定义如下:(注:构造函数是在对象实例化时自动被调用一次,每次对象实例化都会调用一次)
<?php
class Humen {
public $name = "熔岩巨兽";
public function eat($food){
echo $this->name."'s eating ".$food;
}
function __construct($name, $sex, $age){ //__construct定义构造函数(双下划线),通过参数传入对象实例化时的属性
echo $this->name = $name."\n";
echo $this->sex = $sex."\n";
echo $this->age = $age."\n";
}
}
$man = new Humen("剑圣", "男", "18"); //对象实例化时传入参数
echo $man->name."\n";
$man->eat('apple');
?>
析构函数
- 析构函数当变量被释放后,程序运行完后会自动调用
- 由此可见,其一般用于变量释放,对象销毁等方面(注:析构函数若遇到变量释放、置空,其会被提前调用,即程序运行完毕前)
- 其定义如下:
<?php
class Humen {
public $name = "熔岩巨兽";
public function eat($food){
echo $this->name."'s eating ".$food."\n";
}
function __construct($name, $sex, $age){
echo $this->name = $name."\n";
echo $this->sex = $sex."\n";
echo $this->age = $age."\n";
}
function __destruct(){ //通过__destruct来定义析构函数
echo "德玛西亚";
}
}
$man = new Humen("剑圣", "男", "18");
echo $man->name."\n";
$man->eat('apple');
?>
注:-若$woman=$man
,$man=null
,那么析构函数不会被调用,因$woman
还指向Humen
的实例化对象,对象并未销毁,所以析构并未执行,要等程序结束才会被调用
-若$woman=&$man
,则会执行析构函数,因为这属于引用赋值,他俩公用一个地址,共同指向一个对象,其中一个变量销毁,那对象就销毁了,析构函数会被立即调用
继承
- 当我们定义一些类时,他们之间会有相同的属性和方法,这样定义的过程中便会重复定义
- 我们可以定义一个父类,让其拥有这些共有属性
- 让其他拥有相同属性、方法的类去继承父类
- 其定义如下
<?php
class Humen {
public $name = "熔岩巨兽";
public function eat($food){
echo $this->name."'s eating ".$food."\n";
}
function __construct($name, $sex, $age){
echo $this->name = $name."\n";
echo $this->sex = $sex."\n";
echo $this->age = $age."\n";
}
function __destruct(){
echo "德玛西亚";
}
}
class SmallHumen extends Humen{ //extends关键字定义 继承,SmallHumen子类继承了Humen父类
}
$man = new Humen("剑圣", "男", "18");
echo $man->name."\n";
$man->eat('apple');
$smallHumen = new SmallHumen("德莱文", "男", "20");
echo $smallHumen->name;
?>
访问权限 public,protected,private
- public,公共属性、方法,可以被自身、子类调用,也可以在类的外部调用
<?php
class Man {
public $kl = "1";
public function eat(){
echo "I 'm Eat";
}
}
class Dog {
public $kl = "2";
public function eat(){
echo "Dog 's Eat";
echo $this->kl; //类内部调用
}
}
class SmallDog extends Dog{ //extends关键字继承
public function eat(){
echo $this->kl; //子类调用
}
}
$man = new Man();
$dog = new Dog();
$sdog = new SmallDog();
$man->eat();
$dog->eat();
echo $dog->kl; //类外部调用
echo $man->kl;
$sdog->eat();
?>
- protected, 受保护的属性、方法,自身、子类可以调用,类的外部不可以调用
<?php
class Man {
public $kl = "1";
public function eat(){
echo "I 'm Eat";
}
}
class Dog {
protected $kl = "2";
public function eat(){
echo "Dog 's Eat";
echo $this->kl; //类内部调用
}
}
class SmallDog extends Dog{ //extends关键字继承
public function eat(){
echo $this->kl; //子类调用
}
}
$man = new Man();
$dog = new Dog();
$sdog = new SmallDog();
$man->eat();
$dog->eat();
echo $dog->kl; //类外部调用,会出错
echo $man->kl;
$sdog->eat();
?>
- private,私有成员,只可以自身调用
<?php
class Man {
public $kl = "1";
public function eat(){
echo "I 'm Eat";
}
}
class Dog {
private $kl = "2";
public function eat(){
echo "Dog 's Eat";
echo $this->kl; //类内部调用
}
}
class SmallDog extends Dog{ //extends关键字继承
public function eat(){
echo $this->kl; //子类调用,会出错
}
}
$man = new Man();
$dog = new Dog();
$sdog = new SmallDog();
$man->eat();
$dog->eat();
echo $dog->kl; //类外部调用,会出错
echo $man->kl;
$sdog->eat();
?>
static关键字
- 当有多个类继承了同一个类,通过其中一个子类改变父类属性时,会同时影响其他子类,即其他子类继承的属性也会变化
- 但是由下面一段代码看,并不是这样,这不是我们所要
<?php
class Animal{
public $scale = "奔波霸";
public function changeCon ($name){
$this->scale = $name;
}
}
class Man extends Animal {
public function eat(){
}
}
class Dog extends Animal {
public function eat(){
}
}
$man = new Man();
$dog = new Dog();
$man->changeCon("霸波奔"); //改变了父类Animal里scale的值
echo $dog->scale; //对于$dog对象,scale并未改变
?>
- 引入static关键字,实现属性全局化,即一个子类改变父类的属性,其他子类继承到的属性也会变化
<?php
class Animal{
public static $scale = "奔波霸"; //通过static关键字调用静态属性,方法
public static function changeCon ($name){
self::$scale = $name; //通过self\static,::操作符调用静态属性,记得静态变量前加 $
}
}
class Man extends Animal { //extends关键字继承
public function eat(){
}
}
class Dog extends Animal {
public function eat(){
}
}
Man::changeCon("霸波奔"); //通过类和操作符::,直接调用静态方法(继承了父类的changeCon方法)
echo Dog::$scale; //输出后发现其他子类继承的属性也发生了变化,由此可见static将变量全局化了
?>
方法的重写(override)
- 子类里具有与父类相同名字方法
- 参数可以不同
<?php
class Animal{
public $scale = "oop";
public function changeCon (){ //父类里的changeCon方法
echo "孙爷爷";
}
}
class Man extends Animal {
public function eat(){
}
public function changeCon (){ //与父类里相同名字的方法
echo "玉帝老儿";
}
}
class Dog extends Animal {
public function eat(){
}
}
$man = new Man();
$dog = new Dog();
$man->changeCon(); //输出后,发现子类对父类方法重写了
?>
final关键字
- 在类、方法前加上final关键字后,类不可以被继承,方法不可以被重写
- final 不可以加到属性前面
<?php
final class Animal{ //final使得子类不能继承父类的方法 may not inherit
public $scale = "oop";
final public function changeCon (){ //final使得子类不能重写父类的方法 Cannot override
echo "孙爷爷";
}
}
class Man extends Animal { //子类不可以再继承父类(final关键字的作用)
public function eat(){
}
public function changeCon (){ //与父类里相同名字的方法,这里子类对父类方法的重写会失败
echo "玉帝老儿";
}
}
class Dog extends Animal {
public function eat(){
}
}
$man = new Man();
$dog = new Dog();
$man->changeCon();
?>
数据访问
- parent::
- self::
<?php
class Animal{
public $scale = "oop";
final public function changeCon (){
echo "孙爷爷";
}
}
class Man extends Animal {
public function eat(){
parent::changeCon(); //通过parent::,访问父类的方法
self::changeCon(); //通过self::,访问子类的方法
}
public function changeCon (){
echo "玉帝老儿";
}
}
class Dog extends Animal {
public function eat(){
}
}
$man = new Man();
$dog = new Dog();
$man->eat();
?>
接口(interface)
接口的定义
- interface关键字定义接口
- implements关键字实现接口
- 接口里的方法不需要具体实现
- 类通过implements实现接口后要实现方法,方法名必须与接口里的方法名一致
- 接口不可以直接实例化,必须通过类实现,然后类再去实例化
<?php
interface ICanEat { //定义接口
public function eat(); //定义方法,不需要实现
}
class Man implements ICanEat { //实现接口
public function eat(){ //实现方法
echo "I 'm a man";
}
}
class Dog implements ICanEat { //实现接口
public function eat(){ //实现方法
echo "I 'm a dog";
}
}
$man = new Man();
$dog = new Dog();
$man->eat();
$dog->eat();
?>
判断是否属于实现接口的类的实例化对象(instanceOf)
<?php
interface ICanEat {
public function eat();
}
class Man implements ICanEat {
public function eat(){
echo "I 'm a man";
}
}
class Dog implements ICanEat {
public function eat(){
echo "I 'm a dog";
}
}
$man = new Man();
$dog = new Dog();
$man->eat();
$dog->eat();
function scale ($who){
if($who instanceOf ICanEat){ //判断是否属于实现接口的类的实例化对象
echo "true";
}else{
echo "false";
}
}
scale($man); //调用上面的scale方法
scale($dog);
?>
接口的继承
- 通过extends关键字继承
- 继承后要通过类实现自己、自己的方法、父接口的方法
<?php
interface ICanEat {
public function eat();
}
class Man implements ICanEat {
public function eat(){
echo "I 'm a man";
}
}
class Dog implements ICanEat {
public function eat(){
echo "I 'm a dog";
}
}
interface YouCanEat extends ICanEat { //继承接口
public function yEat();
}
class Women implements YouCanEat{ //实现接口
public function yEat(){ //实现自己的方法
echo "You can eat";
}
public function eat(){ //实现父接口的方法
echo "I can eat";
}
}
$man = new Man();
$dog = new Dog();
$man->eat();
$dog->eat();
?>
多态
- 类实现接口后,不同的实例化对象调用接口方法时,实现的结果不同即为多态
抽象类(abstract)
- 类里的方法是全部定义好的
- 接口里的方法是没有实现的
- 抽象类里的方法是部分实现的
- 对于相同的方法定义好、实现好,便于调用;不同的方法定义抽象方法,具体到某一个子类再去具体实现
<?php
abstract class Animal{ //abstract定义抽象类
abstract public function eat(); //未定义好方法
public function breath (){ //所有子类相同的方法,在父类里统一定义,然后继承
echo "breath";
}
}
class Man extends Animal {
public function eat(){ //具体再在子类里定义,必须与抽象类里的抽象方法一致
echo "Man eat";
}
}
class Dog extends Animal {
public function eat(){
echo "Dog eat";
}
}
$man = new Man();
$dog = new Dog();
$man->eat();
$man->breath();
$dog->eat();
$dog->breath();
?>
面向对象(Object-Oriented)的更多相关文章
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- OO开发思想:面向对象的开发方法(Object oriented,OO)
面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...
- Python学习札记(三十) 面向对象编程 Object Oriented Program 1
参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...
- 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性
一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...
- CSharpGL - Object Oriented OpenGL in C#
Object Oriented OpenGL in C#
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- Object Oriented Programming python
Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...
- What is Object Oriented Design? (OOD)
Object Oriented Design is the concept that forces programmers to plan out their code in order to hav ...
- Java面向对象 Object类 内部类
Java面向对象 Object类 内部类 知识概要: 一:Object类 二:内部类 匿名内部类的写法 1.Object O ...
- JavaScript: Constructor and Object Oriented Programming
Constructor : Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...
随机推荐
- JDBC快速入门
/** * JDBC快速入门: * 1.导入jar包 数据库驱动 * 2.注册驱动 * 3.获取数据库连接对象 Connection * 4.定义sql语句 * 5.获取发送执行sql语句的对象 St ...
- IOS开发之Bug--遇到一个类型不确定的bug
下面的问题不大,是我在开发中遇到的问题: 然后我就google搜一下这个报错 . 下面就解决了:
- jxl导入导出实例
1 package com.tgb.test; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.util.Ar ...
- 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...
- Reporting Service 服务启动时报错The service did not respond to the start or control request in a timely fashion
案例环境: 启动一台数据库服务器(Windows Server 2003)的Reporting Service(SQL Server 2008 R2)服务时,出现如下错误信息: System.Inva ...
- .NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)
阅读目录: 1.开篇介绍 2.使用委托消除函数串联调用 2.1.使用委托工厂转换两个独立层面的对象 3.多态入口(面向对象继承体系是可被扩展的) 4.多态的受保护方法的单元测试(Protected成员 ...
- js输出二维数组最长的子数组
,,],[,,,],[,,,,]]; ].length; ; i < a.length; i++) { if (max<a[i].length) { max=a[i].length; va ...
- Java Generics and Collections-2.2
2.2 Wildcards with extends 前面介绍过List<Integer>不是List<Number>的子类,即前者不能替换后者, java使用? extend ...
- springmvc 上传下载
springmvc文件上传下载在网上搜索的代码 参考整理了一份需要使用的jar.commons-fileupload.jar与commons-io-1.4.jar 二个文件 1.表单属性为: enct ...
- Caffe源码解析3:Layer
转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ layer这个类可以说是里面最终的一个基本类了,深度网络呢就是 ...