黑马程序员——OC基础02—封装、继承、多态

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、面向对象三大特性之封装

1)封装的作用

之前用的@public的成员可以任意被赋值,是因为隐藏的数据底层复杂的东西暴露出一个借口,不封装的话就会失去对属性的管理权,具有很大的风险。
这时候我们需要set和get方法来管理成员的访问,过滤掉不合理的东西。

2)封装的原理:实例变量智能呗当前类的对象进行访问。
set方法的作用:为外界提供一个设置成员变量值的方法;

set方法的声明注意事项:

a  方法名必须以set开头 ,是一个对象方法;
b  set后面跟上成员变量(去掉下划线)的名称,首字母大写  
c  返回值一定是void ;
d  参数类型需要和成员变量的类型一致 
e  形参名不能与成员变量名一样(成员变量名去掉下划线);
f  行参名不能与实例变量名同名


get方法的声明注意事项

a  方法名以get开头 ,是一个对象方法;
b  方法名是去掉下划线的实例变量名;
c  有返回值,返回值和成员变量的类型一致;
d  get方法没有参数;
e  get方法实现中,一定是返回实例变量的值。

例如


#import <Foundation/Foundation.h>

//声明对象的属性和行为
@interface Car : NSObject
{
    //声明对象属性,成员变量默认是protected,且成员变量不能初始化,不能在外部被直接调用,不能使用static关键字进行修饰
//    @public
    int _wheel;
    int _speed;

}

//wheel的set方法
- (void)setWheels:(int)wheel;
//wheels的get方法
- (int)wheel;

//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;
@end

set方法的好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤

3)set 方法和get方法的实现:

@implementation Car  


//set方法  
- (void)setWheel:(int)wheel  
{  

    _wheel = wheel;  //给实例变量赋值
}  
//get方法  
- (int)wheel  
{  
    return _wheel;  
}  


//speed的set方法  
- (void)setSpeed:(int)speed  
{  
    _speed = speed;  
}  
//speed的get方法  
-(int)speed  
{  
    return _speed;  
}  
@end  

4)set 方法和get方法的调用

int  main()  
{  

    Car *c =  [Car new];  


//    c->wheel = 4;  
//    c->speed = 200;  
 //之前一直采用调用成员变量,只有成员变量是public 时,才可以调用成员变量     

    //调用对象的方法,改变成员变量的值  
    [c setWheel:3 andSpeed:500];  


    //匿名对象  
//    [Car new]->wheels =18;  


    //调用get set 方法  
    [c setWheels:10];  
    [c setSpeed:1000];  

    NSLog(@"%d,%d",[c wheel],[c speed]);  
    return 0;  
}  

二、类方法
1.直接可以用类名来执行的方法
2.与对象方法不同:

以‘+’开始;
只能用类名调用,对象不能调用;
类方法中不依赖于对象,执行效率要比对象方法高;
类方法不能访问实例变量(成员变量);
使用场合:当不需要访问实例变量时,尽量使用类方法。




3.类方法的声明与实现

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    @public
    int _wheels;
    int _speed;

//声明类方法
+ (void)info;

@end



@implementation Car

//实现类方法
+ (void)info
{
    NSLog(@"调用了类方法,我是不能访问成员变量的");

}


@end


int  main()  
{  

    Car *c =  [Car new];  

 [Car info];  //类方法的调用

    return 0;  

4.self的用途

1)谁调用了当前方法,self就代表谁;
self出现在对象方法中,self就代表对象;
self出现在类方法中,self就代表类;

2)在对象方法利用self->成员变量名 访问当前对象内部的成员变量;
3)[self 方法名] 可以调用其他对象方法 或者类方法。

@interface Dog : NSObject  
- (void)bark;  
- (void)run;  
@end  

@implementation Dog  
- (void)bark  
{  
    NSLog(@"汪~~");  
}  
- (void)run  
{  
    [self bark];  
   NSLog(@"跑跑跑");  
}  
@end  

int main()  
{  
    Dog *d = [Dog new];  

    [d run];  

    return 0;  
}  

三、继承

1.子类拥有父类的所有成员变量和方法
3.子类重新根据自己的属性实现父类中的方法,称之为重写
4.父类被继承了还是能照常使用的
5.当调用某个方法时,优先在子类中寻找,如果子类没有定义该方法,就去父类中寻找
6.OC支持多层继承,NSObject是全部oc类的最终父类
7.子类不能定义和父类相同的变量,但是可以继承父亲的变量。

继承可以抽取重复的代码,建立类之间的相互关系,使得代码更简洁,设计更合理。例子代码如下:


#import <Foundation/Foundation.h>  

//声明对象的属性和行为  
@interface Car : NSObject  
{  

    int _wheels;  
    int _speed;  
   }

- (void)drive;  

+ (void)test;  
@end  

//实现类  
@implementation Car  

- (void)drive  
{  
    NSLog(@"汽车在行驶---");  
}  

+ (void)test  
{  
    NSLog(@"继承的使用");  
}  
@end  


//定义子类 Jeep类  
@interface Jeep : Car  

- (void)drive;  
+ (void)test;  

@end  
//实现Jeep类  
@implementation Jeep  

- (void)drive  
{  
    NSLog(@"Jeep在行驶---");  
}  

+ (void)test  
{  
    NSLog(@"Jeep在行驶+");  
    [super test];  
}  
@end  

//定义Benz类  
@interface Bmw : Car  

- (void)drive; 
- (void)fly; 
+ (void)test;  
@end  

@implementation Bmw  

- (void)fly{

NSLog(@"我在飞哦~~~"); 
}
- (void)drive  
{  
    NSLog(@"Bmw 在行驶---");  
}  

+ (void)test  
{  
    NSLog(@"Bmw在行驶---");  
    [super test];  
}  
@end  

int  main()  
{  

    Jeep *j =  [Jeep new];   
    [j drive];  

    Bmw *b = [Bmw new];  
    [b drive];  

    //super的使用 和类方法的使用 
    [Jeep test];  //输出 “Jeep在行驶+  继承的使用”
    [Bmw test];  
    return 0;  
}  

四、多态

1.多态的定义:不同的对象以自己独特的方式相应相同方法的能力称为多态。
多态是建立在继承的基础之上,多态可以让父类访问子类。

2.多态的实现条件:有继承关系;有方法重写;父类的声明变量指向子类变量

int  main()  
{  

   //多态的使用  
    Car *c = [Jeep new];  
    [c drive];  //输出  Jeep在行驶---

    Car *c2=[Jeep new];
    [(Jeep*c2)fly];输出:“我在飞哦~~~”  //父类也可以访问子类的非继承原理。
    但是 Car *c2=[Car new];
    (Car*)c2 eat],//在这骗编译器,会提示错误。
    return 0;  
}  
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值