面向对象

  • 面向对象,即我们以对象为核心去实现我们的目的,对象顾名思义:万物皆对象,一个人,一条狗...
  • 当我们通过对象处理一些事情时,会让我们的代码清晰明了,内部高聚合,对外低耦合,即封装的思想
  • 相比面向过程,面向对象会让我们的代码更加精简,更具有灵魂性,同时也提高了代码的复用性

###下面通过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)的更多相关文章

  1. Java - 面向对象(object oriented)计划 详细解释

    面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...

  2. OO开发思想:面向对象的开发方法(Object oriented,OO)

    面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...

  3. Python学习札记(三十) 面向对象编程 Object Oriented Program 1

    参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  4. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  5. CSharpGL - Object Oriented OpenGL in C#

    Object Oriented OpenGL in C#

  6. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  7. Object Oriented Programming python

    Object Oriented Programming python new concepts of the object oriented programming : class encapsula ...

  8. What is Object Oriented Design? (OOD)

    Object Oriented Design is the concept that forces programmers to plan out their code in order to hav ...

  9. Java面向对象 Object类 内部类

     Java面向对象 Object类    内部类 知识概要:                 一:Object类                 二:内部类 匿名内部类的写法 1.Object O ...

  10. JavaScript: Constructor and Object Oriented Programming

    Constructor :  Grammar: object.constructor Example: Javascript code: 1 function obj1() { this.number ...

随机推荐

  1. OC #import和@class的用法和区别

    OC #import和@class的用法和区别 import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑, ...

  2. iOS 学习 - 20 UICollectionView 移动 Item ,类似背包

    有100个 item,数据源只有20个,只能在 20 个之间移动,防止 item 复用,出现 bug 方法一:苹果自带 //UICollectionViewDataSource- (BOOL)coll ...

  3. windows server2012 R2 本地策略编辑

    进入本地策略编辑器: 1.win + R 2.输入命令行:gpedit.msc 密码期限设置: 1.windows设置 2.安全设置 3.账户策略 4.密码策略 5.密码最长使用期限 赋值 0 交互登 ...

  4. React Native 红屏之Could not connect to development server.

    React Native 是目前最火的开发框架,其他不说了,上Bug. 按照  React Native iOS环境搭建 高级版 在mac上  搭建 React Native  环境,运行 项目 若出 ...

  5. 我们为什么要使用maven,公司推行maven杂谈

    最近在公司内推荐使用maven,推荐一个落后于业内十年的技术,实在没什么好说的,可是没想到遇到了前所未有的阻力,总是听到各种各样的质疑,我就闹不明白了,推行这个东西是为了更规范的管理项目成果,方便大家 ...

  6. alpha-beta剪枝搜索

    •一种基于剪枝( α-βcut-off)的深度优先搜索(depth-first search). •将走棋方定为MAX方,因为它选择着法时总是对其子节点的评估值取极大值,即选择对自己最为有利的着法: ...

  7. mysql 5.5.32 多实例环境的启动问题

      [root@localhost scripts]# /bin/sh mysql_install_db --user=mysql --dasedir=/application/mysql --dat ...

  8. 《java JDK7 学习笔记》之Collection

    一.使用Collection 收集对象 1.认识Collection架构 Java SE提供了满足各种需求的API,在使用这些API前,建议先了解其继承与接口操作架构,才能了解何时使用哪个类,以及类之 ...

  9. ubuntu系统安装软件方法

    ubuntu系统安装软件方法 ubuntu下安装软件有三种方式,分别为在线安装apt-get方式,软件商店安装方式和 1. 软件商店安装方式 这种方式对经常使用windows系统的同学来说最为简单,因 ...

  10. .NET 类型(Types)的那些事

    引言 您是.Net工程师?那 .NetFramework中的类型您知道有三大类吗?(除了引用类型和值类型,还有?) 引用类型一定在“堆”上,值类型一定在“栈”上? 那引用类型在内存中的布局细节您又知道 ...