A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#pragma mark - Day04_01_匿名对象

1.没有名字的对象

2.没有专门定义一个指针变量接收对象的地址

3.匿名对象只能使用一次

4.[HMPerson new] ,内存管理,匿名对象会造成内存泄漏

5.

    a)如果一个对象中的成员变量或者方法只会被使用一次,可以使用匿名对象

    b)如果在一个方法中需要传入一个参数,同时我们创建的对象只是为了作为该参数,并且在方法执行完毕之后,不会再使用该对象,这个时候也可以使用匿名对象


#pragma mark - Day04_02_面向对象的三大特征

1.函数的封装

把执行某个功能的代码封装起来,屏蔽代码内部的实现,使用方便


2.类的封装

把类的特征以及类的行为进行封装,不需要知道类的内部复杂的实现


参考电脑的例子来理解

电脑类

CPU 主板 内存... 很复杂的电子元器件

以及很多复杂的功能



我们不需要关心电脑内部复杂的原理

只需要买一台点,能够开机,能够用鼠标和键盘进行操作就可以了


封装是一个思想,需要慢慢的体会和理解


#pragma mark - Day04_03_使用setter方法来对属性赋值做逻辑验证

@interface HMPerson : NSObject

{

    // 用@protected修饰: 使用这个关键字修饰的成员变量,只能在当前类以及子类中进行访问

    NSString *_name;

    int _age;

}


HMPerson *p1 = [HMPerson new];


int age = 200

if ( age < 100 && age > 0) {

    p1->_age = age;

}


HMPerson *p2 = [HMPerson new];

int age = 200

if ( age < 100 && age > 0) {

    p1->_age = age;

}


需求:在给Person的age成员变量赋值的时候,需要通过一种手段对值进行限制,(逻辑判断)


解决方案:1.把赋值时进行的逻辑判断封装起来,保证每次给成员变量赋值的时候都会调用

        2.需要把@public关键字去掉,保证不能类的外部,直接访问类中的成员变量

        3.单独定义一个方法,通过这个方法,访问当前类的成员变量,进行赋值setter


setter方法

1. 必须要是一个对象方法,因为需要在该方法中访问类的成员变量

2. 不需要返回值

3. 需要有参数,就是想要设置给成员变量的值

4. 把赋值时的逻辑判断放在方法的内部

5. 外界如果想给成员变量赋值,必须调用对应的setter,在setter内部,进行逻辑判断

6. setter命名规范:以set开头,后面加上成员变量名称,首字母必须要大写


- (void)set成员变量名:(成员变量类型)成员变量名


- (void)setAge:(int)age;


- (void)setAge:(int)age {

//    _age = age;

    if (age < 100 && age > 0) {

        _age = age;

    } else {

        _age = 1;

    }

}


set 给成员变量设置值


#pragma mark - Day04_04_getter方法取到对象的属性的值

1.getter是一个对象方法,因为需啊在方法中访问当前类中的成员变量

2.getter有返回值,返回对应成员变量的值

3.getter不需要有参数

4.getter命名规范:直接使用成员变量的名字去掉下划线


int age = [p1 age];


#pragma mark - Day04_05_属性封装的规范

getter可以叫做get方法

setter可以叫做set方法


1.如果想给成员变量赋值:set方法 -> 写

2.如果想获得成员变量的值:get方法 -> 读

3.只读:只有get方法,没有set方法(遇到场景比较多)

4.只写:只有set方法,没有get方法

5.可读可写:既有get方法,也有set方法(一般情况)


6.规范:只要一个类的成员变量需要被外界访问,就需要根据读写的要求,为该成员变量封装一个get方法和一个set方法





7.如果一个类的成员变量需要被外界访问,一般情况下,会对应两个方法,get和set


8.类的特征:成员变量\实例变量\属性

    1.成员变量:写在类的@interface大括号中的变量

    2.实例变量:如果成员变量是OC类型的指针,可以叫做实例变量

    3.属性:成员变量对应的get方法和set方法


#pragma mark - Day04_06_类与类之间的关系

1.继承

A继承自B,A就是B的子类,A是一个B, is a


2.关联

当一个类知道另外一个类的时候,可以使用关联关系.

A类关联B类,说明A类知道B类的存在,B类对象作为A类的成员变量

关联是一种拥有的关系, has a

根据拥有的强弱程度,关联关系可以细分为:1.组合关系 和 2.聚合关系

1)组合关系:是一种强的拥有关系,体现了一种严格的部分和整体的关系,部分和整体的生命周期是一样的

鸟 翅膀

2)聚合关系:是一种弱的拥有关系,体现的A对象包含B对象,但是B对象并不是A对象的一部分

班级 学生


3.依赖

当一个类需要用到另一个类的时候,可以使用依赖关系

A类依赖B类

    1.B类对象作为A类中方法的参数

    2.或者B类对象可以作为A类中方法的局部变量


4.耦合:修改一个类的时候,对另一个类的影响程度

5.内聚:在一个类中,只关心和自己相关的功能以及成员 -> 单一职责原则


软件开发的原则:高内聚,低耦合


软件工程:UML建模:类图\活动图\顺序图...

通过图示方式,形象的进行软件架构设计

在前端(iOS,Android,H5)开发中已经弱化.

(了解即可,体现逼格)



#pragma mark - Day04_07_士兵突击

定义一个类有哪些注意点

1.成员变量不要使用@public修饰

2.对于每一个需要在外界访问的成员变量,都要定义一组get方法和set方法(可以根据读写特性,只读或者只写)

3.需要定义一个和类名相同的类方法,用来快速创建一个对象


#pragma mark - Day04_08_Xcode文档的安装(了解)

没有任何的技术含量

只是按照步骤进行操作即可

因为没有网,所以你懂得


#pragma mark - Day04_09_static关键字(C语言中的,OC没有)

1.在C语言中

static修饰局部变量:延长变量的生命周期

static修饰全局变量:改变变量的作用域,可以保证该变量只能在当前文件中使用


如果不使用static修饰全局变量,这个变量在该文件外部也是也可访问的,使用extern声明即可


2.static是C语言的关键字,而不是OC的关键字

所以static不能用在OC特有的语法中

    1.static不能修饰OC中类的成员变量

    2.static不能修饰OC中类的方法

    3.在OC中,static的使用场景和C语言相同


#pragma mark - Day04_10_在对象方法中使用self

1.是什么

self是一个OC关键字,本质上来说就是一个指针,可以用在对象方法和类方法中

    在对象方法中self指向当前对象

    在类方法中self指向当前类

2.有什么作用

在对象方法中

    1.可以使用self访问当前对象的成员变量

    2.可以使用self调用当前对象的对象方法

在类方法中

    1.可以使用self调用当前类的类方法


当前:

使用哪个对象调用对象方法,这个对象就是当前对象

使用哪个类调用类方法,这个类就是当前类


3.怎么用

使用self访问成员变量:self->_age;

使用self调用方法:[self 方法名];


#pragma mark - Day04_11_在类方法中使用self

1.是什么:

在类方法中,self是一个指针,指向当前的类在代码区的地址

2.有什么作用:

在类方法中

1.可以使用self调用当前类的类方法

2.使用self创建一个对象

[HMPerson new] new其实就是一个类方法

如果在一个类方法中,使用self 调用new, [self new]


3.注意点,self是一个指针,不是一个类型,所以不能使用self声明变量




#pragma mark - Day04_12_使用self总结


1.是什么

self是一个OC关键字,本质上来说就是一个指针,可以用在对象方法和类方法中

在对象方法中self指向当前对象

在类方法中self指向当前类

2.有什么作用

在对象方法中

1.可以使用self访问当前对象的成员变量

2.可以使用self调用当前对象的对象方法

在类方法中

1.可以使用self调用当前类的类方法


当前:

使用哪个对象调用对象方法,这个对象就是当前对象

使用哪个类调用类方法,这个类就是当前类


3.怎么用

使用self访问成员变量:self->_age;

使用self调用方法:[self 方法名];


#pragma mark - Day04_13_继承的简单使用

1.是什么

继承是面向对象的三大特性之一,表示的是类和类之间的关系

A类继承自B类,说明A是B的子类,B是A的父类


2.有什么作用

作用:通过继承的特性,子类拥有父类中的所有成员变量和方法,而不需要自己创建


3.怎么用

语法格式

@interface 类名 : 父类名

@end


@implementation 类名

@end


NSObject OC中所有类的父类



4.专业术语

如果A类继承自B类

A类是从B类继承的

A类是B类的子类

B类是A类的父类   -> 强调的是父子关系


A类是从B类派生出来的

A类是B类的派生类

B类是A类的基类



#pragma mark - Day04_14_继承是类在继承而不是对象在继承


1.继承是类和类之间的关系,和对象无关

2.子类模板中拥有了父类模板的成员


虽然两个类继承关系,但是使用父类创建的对象和使用子类创建的对象,没有任何关系,它们是相对独立的.


#pragma mark - Day04_15_什么时候应该使用继承


继承,只要子类继承自父类,那么子类就拥有了父类中的所有成员变量和方法


继承的原则:

只有满足 is a 关系的两个类,才能使用继承

如果说A类是一个B类,这个时候可以使用继承


继承强调的是家族的概念



关联 拥有  has a  A类拥有一个B雷对象的成员变量

强调的是拥有的概念



#pragma mark - Day04_16_只要成员不是所有的子类都拥有的就不应该定义在父类中


设计原则:只有所有子类共同具有的成员变量和方法,才能定义在父类当中


#pragma mark - Day04_17_继承的特点

1.单根性

在OC中的类,有且只有一个父类,不能同时继承自多个父类

继承一定要用在最关键的时刻,而不要乱用



2.传递性

如果A继承自B,B继承自C

那么A中拥有B和C中所有的成员变量和方法



1.思想层面:

面向对象的两个特性: 封装  继承

2.理解:self关键字的作用

3.代码

    1.get方法和set方法一定要掌握

    2.士兵突击的案例



"作业

定义类

创建一个人类

属性  姓名 年龄


封装getter 和 setter


对象方法

1.吃饭

2.睡觉


类方法

1.快速创建对象

2.快速创建对象并设置属性


职员类 继承 人类

属性 公司 薪水


类方法

1.快速创建对象

2.快速创建对象并设置属性


对象方法

1.上班

2.领工资


老师类 继承 职员类

属性 职称


对象方法

1.教学生(给他一个学生对象,让学生学习)

2.加班


类方法

1.快速创建对象

2.快速创建对象并设置属性


学生类 继承 人类

属性 学号


对象方法

1.学习(调用熬夜方法)

2.熬夜


类方法

1.快速创建对象

2.快速创建对象并设置属性



需求

每个对象都创建一个

然后把每一个对象的属性都设置上数值 set方法和get方法


'有能力的同学,请把每个对象的方法调用一下.


把整个项目压缩成zip文件,上传到博学谷



小练习:

需求:

实现一个简易的计算器,包含加减乘除四种运算

最好能用到面向对象的设计思想


C语言的函数就可以直接实现




1 个回复

正序浏览
哇撒,大婶,膜拜下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马