#pragma mark - Day04_01_匿名对象
1. 如果函数有返回值 我们可以不使用变量接收返回值.
而是直接将函数写在要使用其返回值的地方.
2. 正常情况下.我创建对象. 是使用了1个指针保存了对象的地址.
new 实际上是1个类方法.
这个类方法的作用
-> 创建对象
-> 初始化对象
返回值是: 创建的这个对象的地址.
MKPerson *p1 = [MKPerson new];
我们认为,这个对象的名字就叫做p1
p1指针指向了这个对象.
3. 匿名对象
1) 没有名字的对象. 我们创建1个对象,不用指针去存储这个对象的地址.
[MKPerson new];
调用new方法去创建对象.但是没有使用指针来接收这个方法的返回值.
所以,创建的这个对象就没有指针指向,这个对象就没有名字.
这个对象就叫做匿名对象.
4. 如何使用匿名对象.
1). [MKPerson new]->_name = @"jack";
[MKPerson new] 这是1个方法. 这个方法的返回值就是这个对象的地址.
2). 调用匿名对象的方法.
[[MKPerson new] sayHi];
5. 匿名对象的特点:
因为匿名对象没有名字.所以这个对象只能使用1次. 创建出来的时候就使用.
[MKPerson new]->_name = @"jack";
[MKPerson new]->_name = @"jack";
这是两个不同的独立的对象.
6. 匿名对象有什么用?
1). 如果1个对象的成员你只需要使用1次.那么这个时候就可以使用匿名对象,但是如果这个对象你后面还想要使用.就不能使用匿名对象了.
2). 如果1个方法的参数是1个对象.而传递给这个参数的对象天生就是来传递给这个方法的.传递完毕之后.不会再使用了.那么这个时候就可以传递1个匿名对象.
#pragma mark - Day04_02_面向对象的三大特征
1)封装:
现实生活中的封装: 将很多的小东西 塞在1个大口袋里面.
好处:
a. 对外部屏蔽.
b. 方便管理.
代码的封装:
函数/方法 就是1种封装的体现: 将一段代码塞在函数/方法中.
好处: 屏蔽了内部的实现. 便于管理.
类是一种更高级别的封装:
1个类中封装数据的状态和行为.
将数据的状态和行为封装在了1个类中. 类中有很多复杂的实现. 对于外部而言无需关心.
2)继承:
3)多态:
#pragma mark - Day04_03_使用setter方法来对属性赋值做逻辑验证
原因
为对象的属性赋值的时候,语法上只要赋值1个和属性的类型相同的数据都是可以的
但是情理上.你不能为对象的属性随意赋值.
封装
1). 要解决什么问题: 要求为对象的属性赋值的时候,赋值的数据要有限制.要经过我们的逻辑判断.
2). 靠谱的解决方案:
1. 先把类的属性的@public修饰符去掉.
2. 为类提供1个方法.这个方法的作用 专门用来为对象的属性赋值. setter
3)setter方法特点
a. 这个方法一定是1个对象方法.
b. 这个方法肯定没有返回值.因为这个方法做的事情就是为属性赋值.
c. 这个方法的名字必须以set开头.再跟上这个属性的名字,去掉下环线,首字母大写.
d. 这个方法一定有参数,参数的类型和属性的类型一致,参数名和属性名一致.只是去掉下划线.
e. 在方法的实现中,判断参数的值是否符合逻辑.如果符合就将其赋值给属性,否则做默认处理.
f. 外界如果想要为对象的属性赋值,是不能直接访问属性了,外界只能调用这个setter方法来为对象的属性赋值,而这个时候,setter方法对准备赋值的数据做了逻辑判断,如果符合逻辑就会赋值给对象的属性.否则就不会.
#pragma mark - Day04_04_getter方法取到对象的属性的值
1) 当我们吧@public去掉之后,想要取出对象的属性的值,也取不出来.因为属性根本就没有权限访问了,所以需要为类再提供1个方法. 这个方法专门用来返回对象的属性的值,这个方法我们叫做 getter
2)getter方法特点
a. 这个方法一定是1个对象方法,因为方法要访问当前对象的属性的值 并返回
b. 这个方法必须有返回值.返回值的类型肯定是和属性的类型一致.
c. 这个方法的名字 就是 这个属性的名字,去掉下划线.
d. 这个方法一定是没有参数的.
e. 这个方法的实现,很简单, 就是直接返回当前对象的属性的值.
f. 这个时候,外界如果想要得到对象的属性的值,就只能必须调用对象的getter方法来拿到了.
"练习
创建一个类 人类
属性 姓名 年龄 性别 存款
提供这4个属性的getter 和 setter
并且获取对象的存款属性时 当存款大于100W 返回时存款的0.1倍
并提供两个类方法
快速创建方法 和 快速创建方法并设置属性的方法
#pragma mark - Day04_05_属性封装的规范
1. 只读与只写封装.
1). 如果属性的封装只有getter 没有setter
那么这样的封装我们就叫做只读封装.
就只能调用getter方法取值.不能调用setter方法赋值. 因为没有setter方法.
2). 只写封装.
属性的封装只有setter 没有getter
那么这样的封装我们就叫做只写封装.
就只能调用setter方法赋值.不能调用getter方法取值.因为美哦有getter方法
2. 属性封装的规范.
只要属性需要被外界访问.无论取值或者赋值的时候,是否有逻辑验证.
都要为其封装getter和setter.
#pragma mark - Day04_06_类与类之间的关系
1. 组合关系.
1个对象是由多个对象组合起来的.
比如.计算机对象. 是由主板对象、CPU对象、内存对象、硬盘对象...组合起来的.
主板、内存、硬盘作为计算机对象的属性.
那么这个时候,计算机对象和主板、内存、硬盘的关系为 组合关系.
2. 依赖关系
1个对象的方法的参数是另外1个对象.那么我们就说他们的关系是依赖关系.
耦合度: 当修改1个对象的时候 对另外1个对象的影响程度.
A类和B类. 如果修改了B类. 发现A类就无法使用了,我们就说他们的耦合度很高.
低耦合: 当修改1个对象的时候 对另外1个对象的影响较小甚至没有影响.
高内聚: 1个对象仅仅做自己相关的事情. 跟自己无关的事情就不要写在类中.
单一职责原则. 1个类只做自己的事情.别人的事情给别人做.
3. 关联关系
关联体现的是两个类之间语义级别的一种强依赖关系,
比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性 的,
而且双方的关系一般是平等的。关联可以是单向、双向的。
表现在代码层面,
为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类 型为被关联类B的全局变量。
#pragma mark - Day04_07_士兵突击
1. 士兵突击:
使用面向对象模拟: 士兵开枪,枪射出子弹.
找类:
士兵类:
属性:姓名 兵种