码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员--面向对象的三大特性-我之见解

时间:2015-08-12 23:27:54      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

 

------封装------- 

 

1.什么是封装:

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

 

2.封装的好处:

将变化隔离。(不管里面怎么变,使用者不需要知道)

便于使用。(使用者只需按照一定的方法使用就可以了)

提高重用性。(任何人都可以对已封装好的功能进行操作)

提高安全性。(由于暴露给使用者的只是一些外在的操作环节,而不是里面本质的东西,所以就提高了对他的维护性,也就是安全性)

 

3.封装的原则:

将不需要对外提供的内容都隐藏起来。

把属性都隐藏,提供公共方法对其访问。

 

 set方法作用:给外界提供一个设置成员变量值的方法,可以在方法里面对参数进行相应过滤

   

get方法作用:为调用者返回对象内部的成员变量

main.n
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        Person *p = [Person new];
        //设置名称
        [p setName:@"萨达姆"];
        [p setAge:52];
        [p setSex:kSexYao];
        [p setHeight:2.12f];
        
         NSLog(@"%@,%d,%d,%.2f",[p name],[p age],[p sex],[p height]);
        
    }
    return 0;
}


Person.h

#import <Foundation/Foundation.h>

typedef enum {kSexMan,kSexWomen,kSexYao} Sex;

@interface Person : NSObject
{
    //姓名
    NSString *_name;
    //年龄
    int _age;
    //性别
    Sex _sex;
    //身高
    float _height;
}

//给每一个实例变量定义两个方法:设置变量的方法(set) 获取变量值得方法(get)
//set方法的书写规范:
//1) set方法一定是一个对象方法
//2) set方法一定不能有返回值
//3) set方法必须以set开头
//4) set之后跟的是 实例变量去掉下划线,并且首字母大写
//5)set方法一定有参数,而且参数的类型和实例变量的类型一致
//6) set方法的形参名 一般是 去掉下环线的实例变量名
//7)形参名不能和 实例变量名同名
//8) set方法实现中,一定要用形参给实例变量赋值

//_name的set方法
-(void)setName:(NSString *)name;
//int _age;
-(void)setAge:(int)age;
//Sex _sex;
-(void)setSex:(Sex)sex;
//float _height
-(void)setHeight:(float)height;


//get方法书写规范
//1) get方法一定是一个对象方法
//2) get方法一定有返回值,返回值的类型和实例变量的类型要一致
//3) get方法的方法名 是去掉下环线的实例变量名
//4) get方法一定没有参数
//5) get方法的实现中,一定是返回实例变量值

//NSString *_name;
//以后获取name的值,都统一的使用name的get方法
-(NSString *)name;
//int _age;
-(int)age;
//Sex _sex;
-(Sex)sex;
//float _height
-(float)height;

@end

Person.m

#import "Person.h"

@implementation Person

//**************** set 方法的实现 *********
//_name的set方法,以后对_name设置值,一律使用此方法
-(void)setName:(NSString *)name{
    
    //给实例变量赋值
    _name = name;

}
//int _age;
-(void)setAge:(int)age{
    
    _age = age;

}
//Sex _sex;
-(void)setSex:(Sex)sex{

    _sex = sex;

}
//float _height
-(void)setHeight:(float)height{

    _height = height;

}

//**************** get 方法实现 ************
-(NSString *)name{

   return _name;

}
//int _age;
-(int)age{

    return _age;

}
//Sex _sex;
-(Sex)sex{

    return _sex;

}
//float _height
-(float)height{


    return _height;

}


@end

 ---------------继承--------------

三.继承和派生:

继承格式:   

@interface Cat : Animal

 

@end

 

继承定义:  子类拥有了父类属性和方法.

 

派生:   父类向下产生子类的过程称为派生

 

派生类不但包含了基类的方法和属性,同事派生类还可以增加自己的方法和属性

继承的注意事项:

 

1. 子类不能定义和父类同名的成员变量,但是可以继承父类的成员变量

2.子类可以重写父类的方法。

3.调用某个方法时,优先去当前类中找,如果找不到,去父类中找;

3. OC类支持单一继承,不支持多继承

狗继承动物 

Animal.h

#import <Foundation/Foundation.h>

@interface Animal : NSObject
-(void)eat;
-(void)bark;
@end

Animal.m

#import "Animal.h"

@implementation Animal
-(void)eat{

    NSLog(@"动物会吃");
    
}
-(void)bark{

    NSLog(@"动物会叫");
}

Dog.h
#import "Animal.h"

@interface Dog : Animal
-(void)eat;
@end

Dog.m

#import "Dog.h"

@implementation Dog
//把父类的方法,在子类中重新给实现了
//这种做法就称之为:方法的重写
-(void)eat{
    
    NSLog(@"狗会吃");
    
}
-(void)bark{
    
    NSLog(@"狗会叫");
}
@end

main.m
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //先查找当前类有没有eat和 bark,
        //如果有,先调用自己的
        //如果没有,查看父类有没有bark方法
        //      如果父类还没有 去爷爷类
        //      如果有,就执行
        Dog *d = [Dog new];
        [d eat];
        [d bark];
        
        //ani 调用它自己的吃和叫得方法
        Animal *ani = [Animal new];
        [ani eat];
        [ani bark];
    }
    return 0;
}

 

 

方法的重写:父类的方法在子类中重新给实现了

super 的作用

1.直接调用父类中的某个方法

2.super 处在对象方法中,那么就会调用父类的对象方法

super 处在累方法中,那么就会调用父类的类方法

3。使用场合:子类想重写父类的一些方法时想保留一些父类的行为

 

继承的好处:

不改变原来模型的基础上,拓充方法

建立了类与类之间的联系

抽取了公共代码

坏处:耦合性强

 

继承的使用场合:

 1.当两个类拥有相同的属性和方法时,就可以将相同的东西抽取到一个父类中

2.当A 类完全拥有B 类中的属性和方法时,可以考虑让B类继承A类(不一定)

xx是xx 继承;student 是Person

xx拥有xx;组合

 

--实例变量修饰符:

作用范围:

@public :       (公开的)在有对象的前??下,任何地方都可以直接访问。

@protected:  (受保护的)只能在当前类和子类的对象方法中访问

@private:      (私有的)只能在当前类的对象方法中才能直接访问

@package:     (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通 过变量名访问

@interface Person : NSObject
{

    @public     //公开的, 在任何地方通过实例对象都可以访问
    int _age;
    
    @private    //私有的,表示只能在当前类中使用
    NSString *_name;
    
    @protected  //受保护类型,表示只能在当前类和子类中访问
    float _weight;
}

-(void)run;

@end

 

 

实例变量作用域使用注意事项

(1)在@interface @end之间声明的成员变量如果不做特别的说明,那么其默认是protected 的。

(2)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它 都拥有,只是有的它不能直接访问。

五.私有变量&私有方法:

默认情况下实例变量属于@protected修饰.

定义格式:

//在.m文件当中定义

@implementation Person : NSObject

{
int  age;   //  私有变量

}

 

// 不在.h文件中声明,  只在.m文件中实现

-(void)run{
    NSLog(@"我是私有方法");

}

@end

 

 

私有方法只能在当前文件中使用,  不能被子类继承.

--------------多态----------------

什么是多态:多态就是某一类事物的多种形态;

程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态

父类的指针指向了子类的方法

表现形式:  Animal *ani = [Dog new];

多态条件:1.有继承关系     2.有方法的重写

 

1.好处:

简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用 为每一个新加的函数命名一个新名字。

简化代码

如果函数/方法参数中使用的是父类的类型,可以传入父类、子类的对象

 

局限性:父类类型的变量,不能直接调用子类特有的方法。必须强转为子类类型的变量,才能直接调用子类特有的方法

 

2.多态代码实现:

//实例化猫的对象

Animal *animal  = [Cat new]; //父类的指针指向子类对象;

[animal eat];

 

//实例化狗的对象

animal = [Dog new]; //父类的指针指向子类对象。

[animal eat];

 

3.多态的原理

动态绑定:

动态类型能使程序直到执行时才确定对象所属类型

动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法

OC不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型 识别,动态绑定,动态加载

id类型:是一种通用的对象类型,它可以用来存储任何类的对象

通用指针类型,弱类型,编译时不进行类型检查

 

4.多态注意点:

1) 如果存在多态,父类是可以访问子类特有的方法

假设子类Dog 有一个特有的方法bark

Animal *an2 = [Dog new];         //编译时看等号左边,运行时看等号右边

[(Dog*)an2 bark]; //把父类的指针,强制类型转换

 

2) 如果不存在多态,父类是不可以访问子类特有的方法的

Animal *an3 = [Animal new];

[(Dog*)an3 bark]; //错误的,不能强制转换

 

黑马程序员--面向对象的三大特性-我之见解

标签:

原文地址:http://www.cnblogs.com/yilizhijiaotianxiashao-yincaiersanshijianduo/p/4725815.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!