• OC第一节 —— 类和对象



    一.类和对象的概念
    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;
    }
    
  • 相关阅读:
    CSS3实战手册(第3版)(影印版)
    21世纪C语言(影印版)
    Spring Data:企业级Java的现代数据访问技术(影印版)
    Hive编程(影印版)
    iOS 6编程Cookbook(影印版)
    做自己——鬼脚七自媒体第一季
    放飞App:移动产品经理实战指南
    《推荐系统》+《推荐系统实践》
    步步惊“芯”——软核处理器内部设计分析
    ip的划分,超详细
  • 原文地址:https://www.cnblogs.com/laolitou-ping/p/6181397.html
Copyright © 2020-2023  润新知