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

  • 相关阅读:
    WebApi 自定义过滤器实现支持AJAX跨域的请求
    ASP.NET MVC 实现与SQLSERVER的依赖缓存
    MVC4+Springnet+Nhibernate学习系列随笔(一)
    自定义JsonResult处理JSON序列化DateTime类型数据(Ext4.2+ASP.NET MVC 4)
    SqlServer计算周岁的函数
    RabbitMq 使用笔记(winows 64版本)
    解决IDEA下tomcat启动server乱码
    Servlet学习笔记(一)
    解决IDEA使用terminal时 git log 乱码
    Git常用的命令
  • 原文地址:https://www.cnblogs.com/erdeng/p/4769135.html
Copyright © 2020-2023  润新知