第一讲.oc概述,类和对象,实例变量简单操作
类与对象
面试题:
1. 面向对象编程的三大特征?
封装,继承,多态
1>.封装: 封装是对象和类概念的主要特性。它是隐藏内部实现,稳定外部接口,可以看作是“包装”。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
好处:使用更加简单 变量更加安全 可以隐藏内部实现细节 开发速度加快
2>.继承: 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。被继承的类成为超类(super class),继承的类是子类(child class),可以直接拥有父类中所有非私有成员(相关实例变量)、方法。
3>.多态: 允许将子类类型的指针赋值给父类类型的指针。不同对象以自己的方式响应相同的消息的能力叫做多态。(意思就是假设生物类(life)都用有一个相同的 方法-eat; 那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。 也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。)
注意:属性封装了实例变量,方法封装了具体的实现代码, 类封装了属性和方法。子类可以继承父类中的方法,还可以重写(override)父类的方法。
总结:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
2.面向过程和面向对象的区别(冰箱装大象的例子)
1>它们是人思考问题的两种不同方式
面向过程强调 -à注重业务功能
面向对象强调-à注重功能的封装和层次
2>面向过程:分析解决问题的步骤,实现函数,依次调用
面向对象:分析问题组成的对象,协调对象间的联系和通信,从而解决问题
面向对象是以对象为中心,面向过程是以过程为中心的
(老板与员工例子,一个面向对象,一个面向过程)
3.什么是类,什么是对象,类对象有什么关系,举例说明
类是抽象的概念
对象是一个类的一个具体的表现实体
(汽车例子)
4.实例变量的可见度有哪几种?默认的是什么?
有三种:@public @protected @private
默认是: @protected
可见度 |
特点 |
public(公有的) |
实例变量可以在类的外部和内部操作 |
protected(受保护的,默认的) |
实例变量只能在该类和其子类内操作 |
private(私有的) |
|
注: oc里面,所有的实例对象默认的可见度是受保护的,protected指的是本类和子类;
5.对象的内存分配在堆区
1> 分为两步:分配内存空间和初始化
分配内存空间:调用父类的alloc方法分配内存空间,根据类中声明的实例变量为对象分配内存,返回首地址,将所有实例变量置为默认值0.
2>对象存储问题
// OC语言不同于其他语言,OC语言不允许在栈内定义对象,只能在堆里创建对象,然后栈内创建一个指针, 指向堆区的 对象。(栈内存储的是堆区兑现的首地址)
// 因此OC中所有的对象其实是 栈区的一个指针, 指向堆区开辟的空间。
// 我可以把类名 理解为 指针类型。
// 给类创建对象: 类的创建对象分为两步: 1. 开辟空间(会清零) 2. 为清零的区域附上初始值。
3> alloc方法的作用是在堆区开辟空间,并且把首地址返回
[ ]的作用是调用方法的语法
+ 表示的是类方法,只能由类的名字来调用;alloc是一个+的方法
alloc和init 方法返回的类型都是id,id也是一种类型,表示的的泛型,可以表示所有的对象类型,在oc中除了基本数据类型都是对象类型
6.oo是什么,oop是什么
面向过程 Procedure Oriented
面向对象 Object Oriented,简称OO
面向对象编程 Object Oriented Programming,简称OOP
7.#import “ ”和#import< >有什么区别
1> “ ”的意思是自己创建的文件,用这个首先会在当前的目录中寻找,如果找不到就到其他的位置寻找,< >引用一个是系统的文件
2>#import比起#include的好处就是不会引起交叉编译
在 Objective-C中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题
8. 面向对象设计具有良好的可扩展性,可重用性.
(例如:添加悔棋,雕版印刷术和活字印刷术灵活性强)
面向过程:修改整个判断逻辑
面向对象:修改棋盘对象,添加悔棋,即回溯功能即可.
对象是类的实例,类是对象的类型
9. Mac book air(轻薄时尚娱乐)
Mac book pro(专业版)
Mac book mini (只是主机)
10.oc中类的定义
开发中:先定义,再创建对象,然后使用对象
定义类包含两部分:接口部分和实现部分(分开写)
1>接口部分:对外声明类的特征和行为(声明实例变量和方法)
2>实现部分:对内实现行为.(实现接口部分声明的方法,即实现类的行为)
11.(1)创建对象分两步:分配内存空间和初始化
初始化:为对象的实例变量设置初始值
(2)+ (id)alloc; +表⽰示这个⽅方法属于类,只能类执⾏行。id返回值 类型,表⽰示任意类型的对象,即创建好的对象。
- (id)init; -表⽰示这个⽅方法属于对象,只能对象执⾏行。id返回值类型,表⽰示初始化完成的对象。
12.
1.>id和instancetype的比较:
1、都表示对象类型;
2、id在编译阶段不确定类型,instancetype在编译器阶段就已经确定类型;
3、id可以当作参数的类型来使用,instancetype不可以只能当作返回值类型
2>public和protected的区别。如果对象的实例变量是默认可见度的,在外部,无法通过“->”操作实例变量,会出现car -> _carBrand。
13.方法的分类,命名规则,声明,如何确定方法名
(1)分类:方法分为两类:类方法和实例方法。
类方法:只有类能使用。以‘+’开头,+(id)alloc;
[AudiCar alloc];
实例方法:只有对象能使用。以‘-’开头,-(void)study;
[student study];
(2)命名规则:采用“驼峰命名法”,第一个单词首字母小写,后面的单词首字母大写。
(3)声明:
- (void) study : (NSString *) course;
方法 返回 方法 参数
类型 类型 参数 类型 参数名
(4)确定方法名:去掉方法类型、返回值、参数类型、参数名,剩下的部分就是方法名,OC中方法不能重名,但是相同名字的实例方法和类方法并不能算是同一个方法。
14. (1)#import的作用是导入文件,相当于将文件的内容进行拷贝。例如:
#import “Woman.h”
@interface Man:NSObject
{
Woman * _wife;
}
#import “Woman.h”相当于Woman.h文件中的内容拷贝到Man.h文件中,这样可以得到Woman.h文件中的所有信息。
#import 可以重复导入文件,不会报错。#include 不能重复导入文件。
(2)@class是告诉编译器,某个字段知识作为类名使用,类的接口的信息不知道。
@class “Woman.h”
@interface Man:NSObject
{
Woman * _wife;
}
(3)使用#import时需要注意一个问题,避免出现循环引用。例如:
#import “Woman.h”
@interface Man:NSObject
{
Woman * _wife;
}
#import “Man.h”
@interface Woman:NSObject
{
Man * _husband;
}
这样会出现重复引用的问题
15.创建对象
Person *person2 = [[Person
alloc] init];
+(id)alloc; // +号表示方法属于类,只能类执行。id表示任意类型的对象,即创建好的对象。
-(id)init; // -号表示方法属于对象,只能对象执行。id表示初始化完成的对象。