Objective-C:04_面向对象-三大特性

三大特性:封装、继承、多态

封装:

成员变量的封装

为了过滤不合法的属性值,我们需要提供一个方法给外界设置age属性值

        set方法

            作用:提供一个方法给外界设置成员变量值

            命名:方法名必须以set开头

                      set后面跟上成员变量的名称,成员变量的首字母必须大写

                       返回值一定是void

                      一定要接收一个参数,而且参数类型跟成员变量类型一致

                      形参变量的名称不能和成员变量一样

   get方法:

            作用:返回对象内部的成员变量的值

            命名规范:

                肯定有返回值,返回值类型肯定与成员变量类型一致

                方法名跟成员变量名一样

                不需要接收任何参数

成员变量尽量不要用@public

枚举定义方法:

typedof enum{

SexMan,

SexWoman

}Sex;

成员变量的命名规范:一定要以下划线 _开头

               作用:

                    1、让成员变量和get方法的名称区分开

                    2、也可以和局部变量区分开,一看到下划线开头的变量,一般都是成员变量

OC本质上还是C语言,本质上还是面线过程的。还是弱语法。

   没有声明没有实现:

     调用没有声明的方法编译的时候只有警告。

    只会在运行的时候报错:

 -[Person test]: unrecognized selector sent to instance 0x7fe9804076a0:

        给Person对象发送了一个不能识别的消息:test

 

  有声明没有实现:

如果对象声明了一个方法,但是没有实现,编译的时候同样不会报错,只会有警告。只有在执行的时候会报错(错误和上面的一样)。

OC是在运行过程中才会检测对象有没有实现相应的方法(动态检测)

 

 没有声明有实现:

这样写的话没有警告,也不会报错。

程序在运行过程中出错将会闪退。

类方法:

类方法都是以加号(+)开头

    然后调用的时候直接使用类名调用[Person printClassName];

类方法只能使用类名调用,不能使用对象调用。

允许类方法的方法名和对象方法的方法名相同

    在类方法中不能访问实例变量

对象方法:

-》减号 - 开头

-》只能有对象来调用

 -》对象方法中能访问当前对象的成员变量(实例变量)

类方法:

-》加号 + 开头

-》只能由类(名)来调用

 -》在类方法中不能访问实例变量

    

    类方法的好处和使用场合:

        -》不依赖于对象,执行效率高

        -》能用类方法尽量用类方法

        -》场合:当方法内部不需要使用到成员变量时,就可以改为类方法

工具类:

基本没有任何成员变量,里面的方法基本都是类方法。

self关键字

    self:谁调用了当前方法,self就代表谁(self如果出现在对象方法中,self代表对象。self如果出现在类方法中,self就代表类)

    当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

    用self访问成员变量,区分同名的局部变量

  可以利用"self->成员变量名"访问当前对象内部的成员变量

    可以利用[self 方法名];调用其他的对象方法\类方法

    self不管是在类方法还是对象方法中,如果调用自己,那么就会形成死循环

    在类方法中的self不能调用对象方法,对象方法中的self不能调用类方法

self不能调用函数

继承:

继承的好处:

1、抽取重复代码

2、建立了类之间的关系

3、子类可以拥有父类中的所有成员变量和方法

注意点:

        基本上所有类的根类是NSObject

        如果写在同一个文件中,那么父类必须s要写在前面

        OC中不允许子类和父类拥有相同名称的成员变量

        子类重新实现父类的某个方法,不需要像C#中的需要关键字

        调用某个方法时,优先去当前类中找,如果找不到,就去父类中找

  每个类中都有一个superclass指针,指向该类的父类

继承的坏处:耦合性太强了。

 所以继承不能乱用

继承的使用场合:

1、当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

2、当A类拥有B类中的部分属性和方法时,可以考虑让B类继承A类

继承:xx是xxx

组合:xxx拥有xxx

组合:(学生继承成绩,在逻辑上不通,这时候就可以使用组合)

@interface Score : NSObject

{

int _cScore;

int _ocScore;

}

@end

@implementation Score

@end

@interface Student:NSObject

{

 Score *_score;//这种方式就是组合

int _age;

}

@end

@implementation Student

@end

super:

        调用父类的方法。(在重写父类的test方法中想调用父类的test方法或者其他方法,使用[super 方法名])

        super处在对象方法中,那么就会调用父类中的对象方法

        super处在类方法中,那么就会调用父类中的类方法

    

    使用场景:

        子类重写父类的方法时,想保留父类的一些行为

多态

 父类指针指向子类对象

    没有继承就没有多态

    代码的体现:父类类型的指针指向子类对象

    好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象

    局限性:

    父类类型的变量,不能直接调用子类特有的方法,必须强转成子类类型变量后,才能直接调用子类特有的方法。

调用方法的时候会检测对象的真实形象

如果参数中使用的是父类类型,可以传入父类、子类对象

多态的局限性:父类类型的变量,不能用来调用子类的方法。

Dog类继承自Animal类

Animal  *aa=[Dog new];

Dog  *dd=(Dog *)aa;//强制类型转换,将aa转换成Dog *类型的变量

如果有不对的地方请大家指正!!

时间: 2024-11-04 19:39:31

Objective-C:04_面向对象-三大特性的相关文章

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前

面向对象三大特性五大原则 + 低耦合高内聚

面向对象三大特性五大原则 + 低耦合高内聚 面向对象的三大特性是"封装."多态"."继承",五大原则是"单一职责原则"."开放封闭原则"."里氏替换原则"."依赖倒置原则"."接口分离原则". 什么是面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结

C#面向对象三大特性

C#面向对象三大特性 面向对象的三个基本特征是:封装.继承.多态. 封装:隐藏内部功能的具体实现,只保留和外部交流数据的借口.就好比电视机,用一个外壳把内部零部件及控制电路封装起来,只提供按钮或者遥控器接口供人使用.封装可以隐藏实现细节,使得代码模块化.封装成类或结构:类和结构实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法.(1)类定义了每个类对象(实例)可以包含什么数据和功能.举例来说,如果一个类表示客户,我们就可以定义字段customerId,name和addres

面向对象三大特性之二--【继承】

PHP中,一个类只能有一个父类,所谓继承就是去扩展父类,在设计类的时候,如果有两个或多个类有相同或者共用的部分,就将相同部分提取出来放到一个父类里面. 子类只能继承父类的公共属性和公共方法,如果父类的属性和方法有private修饰封装的话,子类是不能访问的(包括类的内部和外部),当然父类的对象也不能在外部访问,但如果是protected修饰的成员属性和方法,子类的类的内部是可以访问的($this),但子类的对象不能在外部访问. 继承的核心是扩展父类的方法,扩展方法包括两种,一种是添加父类中没有的

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

[黑马程序员]Objective-C 面向对象三大特性之继承

基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). 比如我们前文(Objective-C 面向对象三大特性之多态)中提到的Animal和Dog类: #import <Foundation/Foundation.h> @interface Animal : NSObject -(void) eat; @end @implementation Animal -(void)

面向对象编程(十四)——面向对象三大特性之多态②

面向对象最核心的机制——动态绑定,也叫多态. 通过下面的例子理解动态绑定,即多态 1 package javastudy.summary; 2 3 class Animal { 4 /** 5 * 声明一个私有的成员变量name. 6 */ 7 private String name; 8 9 /** 10 * 在Animal类自定义的构造方法 11 * @param name 12 */ 13 Animal(String name) { 14 this.name = name; 15 } 16

JavaScript基础--面向对象三大特性(八):继承封装多态

一.构造函数基本用法:function 类名(参数列表){属性=参数值} 1 function Person(name,age){ 2 this.name = name; 3 this.age = age; 4 } 5 6 //创建Person对象的时候,可以直接给名字和年龄 7 var p1 = new Person('abc',80); 8 window.alert(p1.name); 9 var p2 = new Person('hello',9); 10 window.alert(p2.

面向对象三大特性--封装

//面向对象三大特性//1.封装//目的:让类更加安全,不让外接直接访问类里边的成员变量/*class Ren { private $Name; private $Age; private $Sex; }*/ /*function __construct($s) { $this->Name = $s; } function Say() { echo $this->Name."正在说话!";} function __destruct() { echo "该对象销毁了