01封装

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
//@public 成员变量尽量不使用
int _age; //所有的成员变量以 _ 打头 与get方法的名称和局部变量进行区别
}
- (void)setAge:(int)age; //set方法 提供给外界设置成员变量的值,可以在实现里对参数进行相应过滤
- (int)age; //get方法 返回对象内部成员变量的值 如有get没有set那么这个成员变量就是只读的
- (void)study;
@end @implementation Student
- (void)setAge:(int)age //set方法必须以set开头,加成员变量名,变量名以大写开头
{
if(age<= || age>) //利用set方法对参数的值进行必要的过滤
{
age = ;
}
_age = age;
} - (int)age
{
return _age;
} - (void)study
{
NSLog(@"%d岁的学生开始学习!",_age);
}
@end int main()
{
Student *stu = [Student new];
[stu setAge:];
[stu study];
NSLog(@"此时成员变量_age的值是%d",[stu age]); //使用get方法来获取成员变量的值
return ;
}

类的方法

#import <Foundation/Foundation.h>

//工具类:基本没有 {成员变量(实例变量)[是要通过实例对象来调用的]},里面的方法基本都是类方法
//对象方法 以 - 开头 只能由对象来调用 可以访问当前对象的成员变量(实例变量)
//类方法 以 + 开头 只能由类名来调用 不可以访问成员变量,因为成员变量只有创建出实例对象后才创建
//能用方法的地方就使用类方法,效率要高,不用先去创建对象 当方法内部不需要使用成员变量的时候就使用类方法 @interface Calc : NSObject
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;
@end @implementation Calc
+ (int)sumOfNum1:(int)num1 andNum2:(int)num2
{
return num1 + num2;
}
+ (int)averageOfNum1:(int)num1 andNum2:(int)num2
{
int sum = [Calc sumOfNum1:num1 andNum2:num2]; //面向对象的思想,已经有方法可以实现加法了,不在(num1+num2)
return sum / ;
}
@end int main()
{
int sum = [Calc sumOfNum1: andNum2:];
int ave = [Calc averageOfNum1: andNum2:];
NSLog(@"sum=%d,average=%d",sum,ave);
return ;
}

02继承

1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法
2.注意
1> 父类必须声明在子类的前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找

2.坏处:耦合性太强  当删除了一个类,那么它的子类也无法使用

知识点:

1.每个对象里都有一个 isa指针 指向创建了它的类  低层原理是 isa指针这个成员变量是声明在NSObject中的,继承了它的子类创建的对象都有它的成员变量isa指针

2.每个类内都有一个 superclass指向了它的父类

#import <Foundation/Foundation.h>
/*
1.继承的好处:
1> 抽取重复代码
2> 建立了类之间的关系
3> 子类可以拥有父类中的所有成员变量和方法 2.注意点
1> 基本上所有类的根类是NSObject
*/ /********Animal的声明*******/
@interface Animal : NSObject
{
int _age;
double _weight;
} - (void)setAge:(int)age;
- (int)age; - (void)setWeight:(double)weight;
- (double)weight;
@end /********Animal的实现*******/
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
} - (void)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return _weight;
}
@end /********Dog*******/
// : Animal 继承了Animal,相当于拥有了Animal里面的所有成员变量和方法
// Animal称为Dog的父类
// Dog称为Animal的子类
@interface Dog : Animal
@end @implementation Dog
@end /********Cat*******/
@interface Cat : Animal
@end @implementation Cat
@end int main()
{
Dog *d = [Dog new]; [d setAge:]; NSLog(@"age=%d", [d age]);
return ;
}

有些情况下继承是不合理的  学生是分数 所以要使用<组合>

#import <Foundation/Foundation.h>

@interface Score : NSObject
{
@public
int _ocScore;
int _cScore;
}
@end @implementation Score
@end @interface Student : NSObject
{
@public
Score *_score;
int _age;
} @end @implementation Student
@end int main()
{
Student *stu = [Student new];
stu->_age = ; Score *s= [Score new];
s->_ocScore = ;
s->_cScore = ; stu->_score = s; NSLog(@"年龄是%d,oc分数是:%d",stu->_age,stu->_score->_ocScore); return ;
}

03多态

/*
1.没有继承就没有多态
2.代码体现:父类类型的指针指向子类对象
3.好处:如果函数/方法参数使用的是父类类型,可以传入 父类/子类对象
4.注意:父类类型的变量不能直接调用子类特有的方法,要强转为子类类型变量后才能直接调用子类特有方法
*/ #import <Foundation/Foundation.h> // 动物类
@interface Animal : NSObject
- (void)eat;
@end @implementation Animal
- (void)eat
{
NSLog(@"Animal--吃东西");
}
@end // 狗类
@interface Dog : Animal
- (void)eat; // 狗类重写了父类的 eat 方法
- (void)run; // 狗类独有的 run 方法
@end @implementation Dog
- (void)eat
{
NSLog(@"Dog--吃东西");
}
- (void)run
{
NSLog(@"Dog--跑起来");
}
@end // 猫类
@interface Cat : Animal
- (void)eat; //猫类重写的父类的 eat 方法
@end @implementation Cat
- (void)eat
{
NSLog(@"Cat--吃东西");
}
@end //定义一个 喂 的函数
void feed(Animal *a) //注意传入的参数是父类指针
{
//虽然父类指针中实际是动态绑定的真实对象,但编译器还是会认为它存着父类对象,所以,如果这个方法是子类独有的,父类中不存在这个 eat 方法 ,编译器会报警告,也许找不到 eat 方法
[a eat];
} int main()
{
Dog *d = [Dog new];
//虽接收者是父类指针,但程序会动态的绑定真实的对象,掉用对象中的方法
feed(d);
Cat *c = [Cat new];
feed(c); Animal *a = [Dog new];
// [a run]; //run 是狗独有的方法 编译时会报警告 在Animal中找不到 run方法 Dog *dd = (Dog *)a; // 强转
//[(Dog *)a run]; // 这样也是可以的 不用在额外声明一个指针
[dd run]; return ;
}

OC语言-02面向对象的三大特性的更多相关文章

  1. 面试问题之C++语言:面向对象的三大特性

    转载于:https://www.cnblogs.com/BEN-LK/p/10720249.html 面向对象的三大特性:封装.继承.多态 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和 ...

  2. oc语言--面向对象的三大特性

    一.封装 1.什么是封装 在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的 ...

  3. OC面向对象的三大特性

    一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...

  4. 谈谈Java面向对象的三大特性

    Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...

  5. JavaScript面向对象的三大特性

    1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...

  6. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  7. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  8. 面向对象:三大特性、类成员、property

    一.类的基础知识 python 一切皆为对象. 我们以前的str,list,int 都是对象. 1.1 类的定义 与 调用 class 关键字用来定义类,注意类名首字母大写. 类的调用,先实例化一个类 ...

  9. 菜鸟笔记 -- Chapter 6.4 面向对象的三大特性

    6.4.1  三大特性概述 面向对象的三大特性是Java中一个很重要的基本理念. 封装是面向对象的核心思想.将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的意思.采用 ...

随机推荐

  1. c#常用工具类:文件和二进制转换

    //================二进制相关转换类============== #region 将文件转换为二进制数组 /// <summary> /// 将文件转换为二进制数组 /// ...

  2. easyui 很好很强大

    easyui 很好很强大 http://api.btboys.com/easyui/   中文API教程 分页,拖动等效果很漂亮...

  3. 全文索引(三)lucene 分词 Analyzer

    分词: 将reader通过阅读对象Analyzer字处理,得到TokenStream处理流程被称为分割. 该解释可能是太晦涩.查看示例,这个东西是什么感性的认识. 样品:一段文本"this ...

  4. LabVIEW设计模式系列——普遍使用值改变事件

    标准: 1.当使用值改变事件时,使用单击时触发或者单击时释放开关动作.这样即保证仅仅触发一次,也保证按钮恢复默认值 标准:1.值改变事件的优点:不论是鼠标动作还是键盘动作都能触发值改变事件,增强了程序 ...

  5. hdu2041java

    超级楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. 【Android】数据库的简单应用——升级数据库

    假如我们已经创建好了一个数据库,随着功能需求的增加,想在数据库中再添加一个表,如果直接在之前的代码中插入一个表,会发现创建表失败,这是因为该数据库已经存在.该如何解决呢? 1.卸载程序,重新编译安装. ...

  7. 程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  8. jq版本更新后无live函数的处理.

    之前你的代码如果是$("#ele").live("click", function() {    //...});现在要写成$("#ele" ...

  9. 错误:Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005 拒绝访问。

    最近,把一个网站部署到另一个服务器上,网站中一个功能word转pdf报下面错误: 在此附上解决方案: 方法1:配置Web.Config文件,在每次请求时模拟本地系统的账户. 具体操作:在Web.Con ...

  10. Activity是如何挂载Pargment的Day35

    Activity是如何挂载Pargment的Day35 mebile5.0 1.Fragment优化早上任务 思路 一个主Activity 短信群发器 中秋给朋友发短信,都能够加上他们的姓名,这样他们 ...