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. Sublime Text 3 格式代码插件 codeFormatter

    一款可以对html.JS.CSS.PHP.python代码格式化的sublime插件 默认快捷键ctrl+alt+F,默认可以对html.js.css格式代码, 如果想对PHP格式化,需要PHP5.6 ...

  2. butterknife简化android开发

    butterknife库非常不错的依赖注入库 使用1  使用2 http://jakewharton.github.io/butterknife/ maven引入 http://www.mvnrepo ...

  3. ABAP SAPGUI_PROGRESS_INDICATOR 显示数据处理进度

    ABAP处理的数据量较大时,盯着一动不动的选择屏幕是不是很无聊?? LOOP AT I_TAB. DESCRIBE TABLE I_TAB[] LINES L_LIN. L_PERC = SY-TAB ...

  4. 在mysql中修改表名的sql语句

    在使用mysql时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢?可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦.能否简单使用一个 ...

  5. Java的finally理解

    1.为什么要用finally 先看一个没有finally的异常处理try-catch语句: 如果count为要使用到的资源,而且用完要求释放此资源.那么我们能够把释放资源的语句放到try-catch后 ...

  6. Robotium---环境搭建及入门示例

    Robotium是一款基于控件的Android自动化测试框架 环境搭建(window): 安装JDK以及集成Android Sdk的eclipise. 入门: 1,下载Robotium Solo 5. ...

  7. Java GC 概念摘要

    很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...

  8. [Eclipse]The type XXX cannot be resolved. It is indirectly referenced from required .class files

    在Eclipse中遇到The type XXX cannot be resolved. It is indirectly referenced from required .class files错误 ...

  9. oracle学习----访问路径

    什么是访问路径?表扫描数据的时候使用了什么方式,这个方式就是访问路径 1.全表扫描TABLE ACCESS FULL 全表扫描,多块读,等待事件:db file scattered read 如果是并 ...

  10. python基础知识十一

    图形软件 使用Python的GUI库——你需要使用这些库来用Python语言创建你自己的图形程序.使用GUI库和它们的Python绑定,你可以创建你自己的IrfanView.Kuickshow软件或者 ...