对面向对象简单的理解

面向对象编程,即OOP,是一种编程范式,满足面向对象编程的语言,一般会提供类、 封装、继承等语法和概念来辅助我们进行面向对象编程。

面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化, 对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类 里面

面向对象的三大特征 继承,封装,多态

继承

继承:子类拥有父类的所有属性,和方法。

继承的好处:抽取出了重复的代码,减少代码冗余

继承的缺点:耦合性太强

继承的使用注意

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

(2)OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果没有则一层一层的往上找;

在子类中重写父类的方法,会覆盖父类的方法。

super关键字:

super关键字,在子类中重写方法时,可以让调用者跳过这一层而调用父类中的方法。

使用场景:子类在重写父类方法时,想要保留父类的一些行为。

封装

概念:封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封 装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内 部,尽可能地隐藏内部的细节,只?保留一些对外接口使之与外部发生联系。系统 的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流 与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提 供的外部接口(对象名和参数)访问该对象。

好处:(1)实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实 体后,各程序员可以在需要的时候调用,从而实现了专业的分工。(2)隐藏信 息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息 隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。

多态:

没有继承,就没有多态

不同类的对象能够定义相同名称的方法

当父类对象的指针或引用指向子类对象时,会进行动态监测,调用真实的方法

C++只有虚函数才能实现多态,OC中所有方法都可以

理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类 的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的, 是安全 的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现 时自己特有的属性和方法将不能使用。

而OC是典型的面向对象的语言

OC也是一门动态语言,那么他的动态性是如何体现的呢?

先了解一下什么是动态语言

 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化

比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。

OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。

 

动态类型:程序直到执行时才能确定所属的类。动态类型,说简单点就是id类型

id数据类型

id 通用的对象类型,可以存储任意类型的对象,id后面没有*号,它本身就是个指针

类似于void * ,但只可以指向对象类型

动态绑定:程序直到执行时才能确定实际要调用的方法。

动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。

Class类:表示一个类名,class被创建后,我们可以把class来当成对象的类。

Class cla1 = [类名 class]

Class cla2 = [对象 class]

Class cla3 = NSClassFromString(@"类名");

SEL 类成员方法的指针

可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.

它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)

1>类里面的方法都是被转换成SEL变量进行存储的。

2>放类声明一个对象,对象调用方法的时候,系统会被这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。

3>我们可以自己手动把方法转换成SEL,然后用这个SEL去查找方法(performSelector)。

-isMemberOfClass:

判断是否是这个类的实例

-isKindOfClass:

判断是否是这个类或者这个类的子类的实例

-respondsToSelector:

判读实例是否有这样方法

+instancesRespondToSelector:

判断类是否有这个方法。此方法是类方法。

动态加载

根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x 的图片,而在老一些的普通屏设备上加载原图。随着Retina iPad的推出,和之后可能的Retina Mac的出现,这个特性相信会被越来越多地使用。

时间: 2024-10-10 15:51:40

对面向对象简单的理解的相关文章

12-8面向对象基础--面向对象思想(理解)

一.了解面向对象 1.概念基本理解:1).一个个体可以看做是一个对象,例如:人这个个体: 2).有共同属性的一类作为一个个体,例如:学生.白领.农民工: 3).结构体是用户自定义的数据类型,可以定义不同数据类型的变量,结构体也是面向对象的核心: 2.基本特性: 1)封装:是隐藏信息的特性,具有“封装”意识,是掌握面向对象分析与设计技巧的关键. 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值.取值的功能,也就是对象中的变量可以赋值.取值.,是一种认为的抽象出来的对象的概念. 例如: 2

jQuery闭包之浅见,从面向对象角度来理解

本篇的标题虽然是"jQuery闭包之浅见...",但实际上本篇涉及的多半是javascript"闭包"相关内容,这所以写这个标题,完全是因为自己平常用jQuery写前端习惯了.还有一个原因是:javascript"闭包"很容易造成"内存泄漏", 而jQuery已经自动为我们规避.处理了由"闭包"引发的"内存泄漏". javascript的"闭包"是这样定义的:一个拥有

面向对象基础--面向对象思想(理解)

一.了解面向对象 1.概念基本理解:1).一个个体可以看做是一个对象,例如:人这个个体: 2).有共同属性的一类作为一个个体,例如:学生.白领.农民工: 3).结构体是用户自定义的数据类型,可以定义不同数据类型的变量,结构体也是面向对象的核心: 2.基本特性: 1)封装:是隐藏信息的特性,具有“封装”意识,是掌握面向对象分析与设计技巧的关键. 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值.取值的功能,也就是对象中的变量可以赋值.取值.,是一种认为的抽象出来的对象的概念. 例如: 2

python3----如何简单地理解Python中的if __name__ == '__main__'

1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '__main__'). if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行:当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行. 2. 程序入口

如何简单地理解Python中的if __name__ == '__main__'

1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '__main__'). if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行:当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行. 2. 程序入口

特殊权限简介(简单的理解)

特殊权限: suid:运行程序时,相应的进程的属主是程序文件自身的属主,而不是启动者. chmod u+s(u-s) file sgid:运行某个程序时,对应进程的属组是程序文件自身的属组,而不是启动者的所属的基本组.(常常与sticky一起使用,控制公共文件,组人能修改所有文件不能删除别人文件) chmod g+s(g-s) file sticky:在一个公共的目录中,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件 chmod o+t filedir 特殊权限简介(简单的理解),布

面向过程和面向对象的本质理解

http://kiritor.blog.51cto.com/7400479/1226762/ 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象,抽象 出对象的目的并不在于完成某个步骤,而是描述其再整个解决问题的步骤中的行为. 面向过程的思维方式是分析综合,面向对象的思维方式是构造. 例如c语言解决问题时,一般是先定义数据结构,然后在构造算法.而是用Java面向对象求解时 则是先抽象出对象,构造一个"封闭"的环境,这个环境中有定义

03.JavaScript 面向对象精要--理解对象

JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次被添加给对象时JavaScript在对上上调用了一个名为 [[Put]]的内部方法,该方法会在对象上创建一个新节点保存属性,就像 哈希表上第一次添加一个键一样这个操作不仅指定了初始值 也定义了属性的一些特征 1.1 [[Put]]内部方法 [[Put]]在对象上创建一个自有属性 1.2 [[Set]

一个小例子对多态简单的理解

class Parent{ int age; String name; public Parent(String name, int age){ this.name = name; this.age = age; } public void writeWay(){ System.out.println("毛笔!"); } } class Child extends Parent{ int age; String name;//这里只说为了说明一个问题,其实完全可以有父类继承而来. pu