一.类和对象的概念
1.1类
自己的定义: 具有相同或相似性质对象的抽象。
1.2 对象
自己的定义: 对象是人们要进行研究的任何物体,从最简单的整数到复杂的飞机
等均可以看做是对象。
举例说明:
类 :车 ;对象:奔驰,宝马,劳斯莱斯
类 :人 ;对象:小明,小红,李平
对象一般都具有属性:一个对象用数据值来描述他的状态:
一个叫xiaoming的对象,具有年龄和姓名的属性
age = 10
name = “xiaoming”
对象还有操作:对象的操作用来改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合:使数据和操作封装于对象的统一体中。
作者: 平平安安2
链接:http://www.imooc.com/article/15254
来源:慕课网
一.类和对象的概念
1.1类
自己的定义: 具有相同或相似性质对象的抽象。
1.2 对象
自己的定义: 对象是人们要进行研究的任何物体,从最简单的整数到复杂的飞机
等均可以看做是对象。
举例说明:
类 :车 ;对象:奔驰,宝马,劳斯莱斯
类 :人 ;对象:小明,小红,李平
对象一般都具有属性:一个对象用数据值来描述他的状态:
一个叫xiaoming的对象,具有年龄和姓名的属性
age = 10
name = “xiaoming”
对象还有操作:对象的操作用来改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合:使数据和操作封装于对象的统一体中。
二.面向对象
2.1自己的定义:面向对象是把问题里拥有相同属性的东西建立一个类,类有属性和方法,然后创建类的一个对象,调用类的属性,方法来解决问题。有三个明显的特点 :封装,继承,多态
1.封装性
指利用类将数据和基于数据的操作封装在一起,数据被保护在类的内部,系统的其他部分只有通过被授权的操作,才能与这个类进行交流和交互。
好处:将变化隔离,便于使用,提高重用性,提高安全性
封装原则:将不需要对外提供的内容隐藏起来;把属性都隐藏,提供公共方式对外访问
2.继承性
一个类可以从其它已有的类中派生,新类保持了父类中的行为和属性,但增加了新的功能。
3.多态
指一个程序中可以有同名的不同方法共存的情况,可以利用子类对父类;方法的覆盖和重载在同一个类中定义多个同名的方法来实现。
2.3 面向对象的优点
1、易维护:采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求, 那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高:在设计时,可重用现有的,在以前的项目的领域中已被测试过的类,使系统满足业务需求并具有较高的质量。
3、效率高:在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展:由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
作者: 平平安安2
链接:http://www.imooc.com/article/15254
来源:慕课网
一、类和对象的概念
1.1类
自己的定义: 具有相同或相似性质对象的抽象。
1.2 对象
自己的定义: 对象是人们要进行研究的任何物体,从最简单的整数到复杂的飞机
等均可以看做是对象。
举例说明:
类 :车 ;对象:奔驰,宝马,劳斯莱斯
类 :人 ;对象:小明,小红,李平
对象一般都具有属性:一个对象用数据值来描述他的状态:
一个叫xiaoming的对象,具有年龄和姓名的属性
age = 10
name = “xiaoming”
对象还有操作:对象的操作用来改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合:使数据和操作封装于对象的统一体中。
二、面向对象
2.1自己的定义:面向对象是把问题里拥有相同属性的东西建立一个类,类有属性和方法,然后创建类的一个对象,调用类的属性,方法来解决问题。有三个明显的特点 :封装,继承,多态
**1.封装性**
指利用类将数据和基于数据的操作封装在一起,数据被保护在类的内部,系统的其他部分只有通过被授权的操作,才能与这个类进行交流和交互。
好处:将变化隔离,便于使用,提高重用性,提高安全性
封装原则:将不需要对外提供的内容隐藏起来;把属性都隐藏,提供公共方式对外访问
**2.继承性**
一个类可以从其它已有的类中派生,新类保持了父类中的行为和属性,但增加了新的功能。
**3.多态**
指一个程序中可以有同名的不同方法共存的情况,可以利用子类对父类;方法的覆盖和重载在同一个类中定义多个同名的方法来实现。
2.3 面向对象的优点
1、易维护:采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求, 那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高:在设计时,可重用现有的,在以前的项目的领域中已被测试过的类,使系统满足业务需求并具有较高的质量。
3、效率高:在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展:由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
三、创建OC工程(本人电脑版本10.12 ;Xcode 版本 8.1)
好了,到这里第一个工程文件就创建完成了。
2、接下来我们就写一个类和对象的代码
创建类: 分为两个部分
1)类的声明部分
2)类的实现部分
类的声明部分:
@interface 类名 : NSObject
@end
类的实现部分
@implementation 类名
@end
以创建一个学生的类为例:
#import <Foundation/Foundation.h> //创建学生类 @interface Student : NSObject { //字段、成员变量 //@public char _name[20]; int _num; int _age; } //方法的声明. 类里面的函数-----方法 /****************************** 写一个无参数 , 无返回值的方法 C: void 函数名(void); OC: - (void)方法名; ******************************/ - (void)eat; //方法名: eat - (void)sleep; //方法名: sleep - (void)playGame; - (void)writeCode; /****************************** 写一个带有一个参数 , 无返回值的方法 C语言的函数: void 函数名(参数类型 参数) OC: - (void)方法名:(参数类型)参数; ******************************/ - (void)setName:(char *)name; //方法名: setName: - (void)setNum:(int)num; // setNum: - (void)setAge:(int)age; // setAge: /****************************** 写一个没参数 , 有返回值的方法 OC: - (返回值类型)方法名; ******************************/ - (char *)getName; //方法名: getName - (int)getNum; - (int)getAge; /****************************** 写一个带有多个参数的方法 OC: //void - (返回值类型)标签1:(参数类型)参数1 [标签2]:(参数类型)参数2 [标签3]:(参数类型)参数3....; 除了第一个标签,后面的标签可以省略不写【空标签】,标签的作用标识参数的含义。 ******************************/ - (void)setName:(char *)name //方法名: setName:num: num:(int)num; //- (void)setName:(char *)name :(int)num; - (void)setName:(char *)name //方法名: setName:num:age: num:(int)num age:(int)age; //打印对象里面所有的信息 - (void)printAllInformation; @end @implementation Student //实现所有的方法 - (void)eat { //实现跟C语言的函数一样 NSLog(@"他很能吃!"); } - (void)sleep { NSLog(@"吃完了,可以睡觉!"); } - (void)playGame { NSLog(@"他会玩英雄联盟!"); } - (void)writeCode { NSLog(@"他能写OC代码!"); } - (void)setName:(char *)name { // _name = name; //当传入的字符串的长度超过 19 , 不接受 if (strlen(name) > 19) { return; } strcpy(_name, name); } - (char *)getName { //返回_name 数组的首地址 return _name; } - (void)setNum:(int)num { if (num < 0 || num > 100) { return; } _num = num; } - (void)setAge:(int)age { if (age < 0 || age > 200) { return; } _age = age; } - (int)getNum { return _num; } - (int)getAge { return _age; } - (void)setName:(char *)name num:(int)num { strcpy(_name, name); _num = num; } - (void)setName:(char *)name num:(int)num age:(int)age { strcpy(_name, name); _num = num; _age = age; } - (void)printAllInformation { NSLog(@"name: %s, num: %d, age: %d", _name, _num, _age); } @end int main(int argc, const char * argv[]) { @autoreleasepool { //实例化对象 Student *stu1 = [Student alloc]; // stu1->_id = 10; // NSLog(@"id: %d", stu1->_id); //[对象指针 方法] //通过stu1给对象发送了 eat消息 //通过对象指针,给对象 发送消息 //对象执行这个 eat方法,相应消息 [stu1 eat]; [stu1 sleep]; [stu1 playGame]; [stu1 writeCode]; //调用带有一个参数的方法 [stu1 setName:"zhangsan"]; //OC自诩为最优雅的语言 NSLog(@"name: %s", [stu1 getName]); [stu1 setNum:1]; NSLog(@"num: %d", [stu1 getNum]); //创建一个新的对象 stu2 Student *stu2 = [Student alloc]; [stu2 setName:"lisi"]; [stu2 setAge:20]; [stu2 setNum:2]; NSLog(@"name: %s", [stu2 getName]); NSLog(@"num : %d", [stu2 getNum]); NSLog(@"age : %d", [stu2 getAge]); [stu2 setName:"wangwu" num:3]; NSLog(@"name: %s", [stu2 getName]); NSLog(@"num : %d", [stu2 getNum]); [stu2 printAllInformation]; //创建一个新的对象 stu3 Student *stu3 = [Student alloc]; [stu3 setName:"yangliu" num:10 age:23]; [stu3 printAllInformation]; } return 0; }
3. 类中实例变量的权限
3.1 类的封装性, 数据的保护
3.2 三种权限和默认的权限
成员变量有3种访问权限:
直接访问权限 类里 类外
@public 公共的 V V
@protected 受保护的 V(子类) X (默认)
@private 私有的 V X
4 方法 方法(函数,消息)(有实例方法和类方法)见上述代码
实例化方法也叫对象方法同时也叫减方法 - (void)方法名;
非实例化也叫类方法同时也叫加方法 + (void)方法名;
-方法/对象方法/实例化方法 调用方式 [对象指针 -方法]
+方法/类方法/非实例化方法 调用方式 [类名 +方法]
5 初始化方法(构造方法)
1、一般语言中,在创建对象时,自动调用的方法
2、OC中,凡是用init开头的成员方法都是构造方法
【注】构造方法一般用于对象的初始化。
初始化方法格式
<1>无参的初始化方法
- (id)init{
self = [super init];//要调用父类的初始化方法初始化父类的成员变量
if (self) {
_age = 24;//初始化子类自己的变量
}
return self;//返回当前对象地址
}
<2>带参数的初始化方法
- (id)initWithAge:(int)newAge{
self = [super init];//要调用父类的初始化方法初始化父类的成员变量
if (self) {
_age = newAge;//初始化子类自己的变量
}
return self;//返回当前对象地址
}
初始化方法/构造方法(id,super,self)
id类型
id: 泛型对象指针,与C语言void *类似
super
super: 用于调用父类方法的关键字(实际上就是一个编译器符号)
self
self: 指向当前对象的指针
类内的方法进行相互调用可以用self
最后:大家可以试着自己创建一个长方形的类,有长和宽两个对象。
#import <Foundation/Foundation.h> @interface MyRect : NSObject { CGFloat _length; CGFloat _width; } - (void)setLength:(CGFloat)length; - (void)setWidth:(CGFloat)width; -(CGFloat)getLength; -(CGFloat)getWidth; - (CGFloat)area; - (CGFloat)permiter; @end #import "MyRect.h" @implementation MyRect - (void)setLength:(CGFloat)length { _length = length; } - (void)setWidth:(CGFloat)width { _width = width; } -(CGFloat)getLength { return _length; } -(CGFloat)getWidth { return _width; } - (CGFloat)area { return _length * _width; } - (CGFloat)permiter { return 2 * (_length + _width); } @end #import <Foundation/Foundation.h> #import "MyRect.h" int main(int argc, const char * argv[]) { @autoreleasepool { MyRect *rect1 = [MyRect alloc]; [rect1 setLength:6]; [rect1 setWidth:7]; NSLog(@"%f==%f",[rect1 getLength],[rect1 getWidth]); NSLog(@"area: %f", [rect1 area]); NSLog(@"permiter: %f", [rect1 permiter]); //实例化第二个长方形 MyRect *rect2 = [MyRect alloc]; [rect2 setLength:4.5]; [rect2 setWidth:2.3]; NSLog(@"area: %f", [rect2 area]); NSLog(@"permiter: %f", [rect2 permiter]); } return 0; }