黑马程序员 面向对象编程的三大特性

时间:2023-02-11 19:41:18

——- android培训java培训ios培训期待与您交流!

三大特性

一、封装

将对象中的成员变量隐藏起来,控制对它的访问和修改。
这样做的目的是提高安全性和简化编程

1.1 定义一个Person类,具有年龄、身高、体重,年龄是只读的,身高和体重既可以外界访问又可以修改。

代码如下:

@interface PersonNSObject
{
    int _age;
    int _height;
    int _weight;
}
@end

此时的成员变量并不能被外界访问,它们是被保护的。需要设置set和get方法,其中set方法是修改变量的值,get是访问(获取)变量。
代码如下:

- (void)setAge:(int)age; - (int)age; - (void)setHeight:(int)height; - (int)height; - (void)setWeight:(int)weight; - (void)weight;

在@implementation中实现,由于age属性是只读的,所以不需要-(void)setAge。
代码如下:

@implementation Person
-(void)setAge
{
    _age=age
}
-(void)setHeight:(int)height
{
    _height=height;
}
-(int)height
{
    return _height;
}
-(void)setWeight:(int)weight
{
    _weight=weight;
}
-(int)weight
{
    return _weight;
}
@end

set方法的命名规范

1.方法名必须以set开头
2.set后面跟上成员变量的名称,成员变量的首字母必须大写
3.返回值一定是void
4.一定要接收一个参数,而且参数类型跟成员变量一致
5.形参的名称不能与变量名一样

get方法的命名规范

1.肯定有返回值,返回值类型肯定与成员变量类型一致
2.方法名跟成员变量名一样
3.不需要接收任何参数

1.2 get与set方法的使用

既然是方法,那么它的使用方式就与普通的方法使用方式一致
代码如下:
int main()
{
    Person *p=[Person new];
    //获取年龄
    int age=[p age:20];//age=20
    //设置身高,体重
    [p setHeight:175];
    [p setWeight:65];
    //获取身高,年龄
    int height=[p height];
    int weight=[p weight];
    return 0;
}

二、继承

通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。

2.1 NSObject类

NSObject是大多数Objective-C类的继承的根类;它没有父类。通过NSObject,其它类继承了一些基础的与Objective-C语言编译器系统之间的接口,并且获得了在它的实例中表现为一个对象的能力。
尽管NSObject不是一个严格的抽象类,实际上它已经是一个类。但是通过它自己一个除了表现为一个简单类之外,NSObject实际上几乎无法完成任何有用的操作。为你的程序添加任何属性(attributes)并制定实现逻辑,你必须创建一个或者多个从NSObject继承或者父类从NSObject继承的类。
如前面代码中Person类的声明:

@interface Person :NSObject

这个Person类就是继承了NSObject类。同样我们还可以再声明一个Student类继承Person类

@interface Student:Person
@end
@implementation Student
@end

此时的Student类具有Person全部的成员变量以及方法。

2.2 self和super的用法

之前学习C#的时候遇到过this关键字,此时的self关键字与this的用法相同,super关键字调用的是父类的方法。
定义一个Person类,方法1,打印年龄,有一个Student类继承Person,方法1打印身高,方法2调用方法1打印身高,并打印体重,方法3调用父类中的方法1打印年龄。
代码如下:

@interface Person :NSObject
{
    int age;
    int height;
    int weight;
}
- (void)print;
@end
@implementation Person
- (void)printAge
 {
    NSLog(@"年龄为:%d",age);
 }
@end

 @interface Student:Person
 {
    int no;
 }
 - (void)printHeight;
 - (void)printWeightAndHeight;
 @implementation Student
 -(void)printHeight
 {
     NSLog(@"身高为:%d",height);
 }
 -(void)printWightAndHeight
 {
     NSLog(@"体重为:%d",weight);
     [self printHeight];//self调用自身的方法
 }
 -(void)printAge
 {
     [super printAge];//调用父类的方法
 }

三、多态

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。
无继承,无多态
代码如下:

int main()
{
    Student *s=[Student new];//声明一个Sutdent类对象
    Person *p=[Student new];//将父类对象p指向子类对象地址
}

方法中以父类对象为参数
代码如下:

-(void)walk:(Person *)person;
重写
Person类中包含方法printAge,Student类中也包含方法printAge,但是两个方法中的内容却不同。
Person中:
    - (void)printAge
     {
        NSLog(@"年龄为:%d",age);
     }
Student中:
    -(void)printAge
    {
        [super printAge];//调用父类的方法
    }

它们的结果是相同的,因为Student类中调用的是Person类中的方法。

四、总结

(一)封装:控制成员变量的访问与修改,提高数据的安全性。

1.get方法获取成员变量值,set方法设置成员变量的值。
2.成员变量可写可读、只读、只写。

(二)继承:类与类之间的关系,A继承B,A具有B的所有成员变量及方法,B称为父类,A称为子类

1.好处:抽取重复代码、建立类与类之间的关系、子类拥有父类所有的成员变量和方法
2.super:调用父类的方法
3.self:调用自身的方法。

(三)多态:对象的多种形态

1.  对象的多种形态
2.  父类指针指向子类对象
3.  调用方法会自动态检测 对象的真实类型,然后调用对象对应的方法
4.  无继承,无多态