黑马程序员—12-oc类跟对象

一、类和对象的关系

面向对象中有2个非常重要的概念:类和对象

1. 如何创建对象

1)  面向对象解决问题的时候必须有对象,那如何创建对象呢?

2)  现实生活的例子:如何创造汽车对象?

a)   需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)

Ø   属性:轮子数、时速

Ø   功能(行为):跑

b)   然后再根据图纸上的描述生成汽车

c)   每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例

d)   图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括

2. OC中的面相对象

1)  OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

2)  OC利用类来创建对象,对象是类的具体存在

3)  因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

3. 需要设计哪些类,如何设计类

1)  类的设计,只关心3样东西:

Ø   事物名称(类名):

Ø   属性:

Ø   行为(功能):

2)  一般名词都是类

3)  拥有相同(或者类似)属性和行为的对象都可以抽像出一个类

二、定义OC的类和创建OC的对象

类的声明一般采用如下形式:

1. 类的声明

1)   代码编写

Ø   定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑

Ø   类名\属性的命名规则:标示符的规则

Ø   类名的命名规范:有意义、驼峰标识、首字母大写

#import <Foundation/Foundation.h>

// 类的声明

@interface Car : NSObject

{

@public

int wheels; // 多少个轮子

int speed; // 时速

}

- (void)run; // 跑的行为

@end

2)   成员变量

Ø   @interface的大括号{}中声明的变量:wheels、speed

Ø   @interface的大括号和函数的大括号是不一样的

Ø   默认会初始化为0

3)    @public

@public可以让Car对象的wheels和speed属性被外界访问

4)    NSObject

加上:NSObject的目的是让Car类具备创建对象的能力

2. 类的实现

// 类的实现

@implementation Car

- (void) run

{

NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);

}

@end

3. 创建对象

1)  代码编写

// 主函数

int main()

{

// 创建车子对象

Car*c = [Car new];

c->wheels = 3;

c->speed = 300;

[crun];

return 0;

}

2)  main函数的代码分析、内存分析(对象在内存中有成员)

Ø   [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

Car *c = [Car new];

用一个指针变量c指向内存中的Car对象

Ø   设置车子对象的属性

跟用指向结构体的指针访问结构体属性一样,用->

c->wheels = 3;

c->speed = 300;

4. 创建多个Car对象

Ø   分别只设置wheels、speed属性

Car *c1 = [Car new];

c1->wheels = 4;

Car *c2 = [Car new];

c2->speed = 250;

[c1 run];

Ø   1个赋值给另一个,然后修改属性

Car *c1 = [Car new];

c1->wheels = 4;

c1->speed = 250;

Car *c2 = c1;

c2->wheels = 3;

[c1 run];

三、类方法

1. 基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2. 类方法和对象方法对比

1)   对象方法

Ø   以减号-开头

Ø   只能让对象调用,没有对象,这个方法根本不可能被执行

Ø   对象方法能访问实例变量(成员变量)

2)   类方法

Ø   以加号+开头

Ø   只能用类名调用,对象不能调用

Ø   类方法中不能访问实例变量(成员变量)

Ø  使用场合:当不需要访问成员变量的时候,尽量用类方法

3)   类方法和对象方法可以同名

4)   类方法的好处

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

Ø  能用类方法,尽量使用类方法

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

5)    工具类:基本没有任何成员变量,里面的方法都是类方法

#import<Foundation / Foundation.h>

@interfacePerson : NSObject

-(void)test;

+(void)test;

@end

@implementationPerson

-(void)test

{

NSLog(@"对象方法\n");

[Person test];

}

+ (void)test

{

NSLog(@"类方法");

}

@end

int main()

{

Person *p = [Person new];

[p test];

return 0;

}

输出结果:对象方法

类方法

四、self关键字

1. 成员变量和局部变量同名

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

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

2. 使用细节

1)  出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

2)  作用

Ø   使用 "self->成员变量名" 访问当前方法调用的成员变量

Ø   使用 "[self 方法名];" 来调用方法(对象方法\类方法)

时间: 2024-10-12 13:40:05

黑马程序员—12-oc类跟对象的相关文章

【黑马程序员】————OC特有语法

一.点语法 点语法的本质还是方法调用 p.age = 10; // [p setAge:10]; int a = p.age; // [p age]; 二.成员变量的作用域 @public : 在任何地方都能直接访问对象的成员变量 @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private) @protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected) @package : 只要处在

黑马程序员-面向对象-Object类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一.Object类中的equals(

黑马程序员——Java基础篇之对象归要

1.static关键字 1.1.static可以修饰成员变量,成员方法,还有类(其中这里的类是内部类) 1.2.static修饰的部分会随着类的加载而加载: 加载过程:当JVM执行static修饰的代码时,会在内存的共享区给static部分开辟一个空间,供该类持有,static部分不是某个对象的部分,而是该类共有的,所以当一个函数会被多个对象调用时,最好定义成static,这样比较节省空间. 1.3.静态方法只能访问静态成员 原因:如果静态方法中调用了非静态的变量,那么由于静态方法是随着类的加载

黑马程序员-----集合框架类(三) Map集合

黑马程序员-----集合框架类(三) Map集合 1.1 Map集合:该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 1,添加. put(K key, V value) putAll(Map<? extends K,? extends V> m) 2,删除. clear() remove(Object key) 3,判断. containsValue(Object value) containsKey(Object key) isEmpty() 4,获取. get(Object ke

【黑马程序员】OC基本语法——类与对象相关概念

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 最近在学OC的面向对象部分,可能是因为以前学Java和PHP时习惯了主流的面向对象思想,接触到OC的面向对象有很多说法都不习惯,查了很多东西,终于基本都搞清楚了,在这里小结一下. 一.类和对象 1.类:类是一个抽象概念,代表着一类事物,如:人,动物,交通工具等:这个和Java或PHP里类的概念没有区别. 其定义方法如下: @interface Student : NSObject { NSSt

黑马程序员----面向对象(类)

一.面向对象和面向过程的区别 以将大象装进冰箱为例: 面向过程: 1.打开冰箱门 2.将大象装进去 3.将冰箱门关上 面向对象 冰箱 1.开门 2.装大象 3.关门 总结: 面向过程关注的是结局问题需要哪些步骤: 面向对象关注的是解决问题需要哪些对象: 二.类 面向对象中两个很关键的概念:类和对象 1.创建对象 创建对象需要现有类(建造图纸),图纸上表述清楚了对象应该具备的属性和功能(行为) 2.创建类 事物名称(类名):人(Person) 属性:身高(height).年龄(age)等 行为(功

黑马程序员——12,多线程(2)

------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- //线程之间的通信 //就是多个线程操作同一个资源,操作动作不同 //举一个例子:一堆资源(名字,性别),一个线程输入,一个线程输出打印 class Person { String name; String sex; } class Shu

黑马程序员————数组工具类对象建立

今天学习了数组工具类对象的建立巩固掌握以前学习的语句,函数,数组等相关知识 /** 建立一个用于操作数组的工具类,其中包括者常见的对数组操作的函数,如:最值,排序等 @author lostnotes */ public class ArraryTool { private ArrayTool () {}//该类中的方法都是静态的,所以不需要创建对象. //为了保证其他成员不创建该类对象,可以构造函数私有化. } /** 获取整数类型数组的最大值 @param arr 接收一个元素为int类型的

《黑马程序员》 OC的三大特性

OC 的三大特性:封装.继承.多态. 封装:过滤不合理的值 #import <Foundation/Foundation.h> // set 方法 // 作用:提供一个方法给外界设置成员变量,可以在方法对成员变量进行赋值和过滤 // get 方法 // 作用:返回对象内部的成员变量,得到成员变量的值. @interface Student : NSObject { // 成员变量名的命名规范 // 成员变量名肯定以下划线开头 // 好处:可以区分参数名称和成员变量的名称,也可以区分变量名和成员

黑马程序员——常见一些类的使用

------ <a href="http://www.itheima.com" target="blank">android培训</a>.<a href="http://www.itheima.comtarget="blank"> java培训</a>.期待与您交流! --------- Runtime对象,该类并没有提供构造函数,说明不可以new对象, 该类中的方法包括静态与非静态的 该