第一讲.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表示初始化完成的对象。

原文地址:https://www.cnblogs.com/erdeng/p/4769135.html