05-面向对象语法04

一、 继承

1. 继承的基本用法

l 设计两个类Bird、Dog

// Bird的声明

@interface Bird : NSObject

{

    @public

    int weight;

}

- (void)eat;

@end

// Bird的定义

@implementation Bird

- (void)eat {

    NSLog(@"吃吃吃-体重:%d", weight);

}

@end

// Dog的声明

@interface Dog : NSObject

{

    @public

    int weight;

}

- (void)eat;

@end

// Dog的定义

@implementation Dog

- (void)eat {

    NSLog(@"吃吃吃-体重:%d", weight);

}

@end

l 有相同的属性和行为,抽出一个父类Animal(先抽取weight属性,再抽取eat方法)

// Animal的声明

@interface Animal : NSObject

{

    @public

    int weight;

}

- (void)eat;

@end

// Animal的定义

@implementation Animal

- (void)eat {

    NSLog(@"吃吃吃-体重:%d", weight);

}

@end

l 子类在父类的基础上拓充属性和方法

// Bird的声明

@interface Bird : Animal

{

    @public

    int height;

}

- (void)fly;

@end

// Bird的定义

@implementation Bird

- (void)fly {

        NSLog(@"飞飞飞-高度:%d", height);

}

@end

// Dog的声明

@interface Dog : Animal

{

    @public

    int speed;

}

- (void)run;

@end

// Dog的定义

@implementation Dog

- (void)run {

        NSLog(@"跑跑跑-高度:%d", speed);

}

@end

l 子类方法和属性的访问过程:如果子类没有,就去访问父类的

l 父类被继承了还是能照常使用的

l 父类的静态方法

l 画继承结构图,从子类抽取到父类

l NSObject的引出:全部OC类的最终父类,包含了一些常用方法,比如+new

2. 继承的专业术语

l 父类\超类  superclass

l 子类  subclass\subclasses

3. 继承的好处

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

l 建立了类与类之间的联系

l 抽取了公共代码

l 坏处:耦合性强

#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:10];

    NSLog(@"age=%d", [d age]);

    return 0;

}

4. 继承的细节

l 单继承

l 子类和父类不能有相同的成员变量

l 方法的重写

/*

1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法

2.注意

1> 父类必须声明在子类的前面

2> 子类不能拥有和父类相同的成员变量

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

2.坏处:耦合性太强

*/

#import <Foundation/Foundation.h>

// Person

@interface Person : NSObject

{

    int _age;

}

- (void)setAge:(int)age;

- (int)age;

- (void)run;

+ (void)test;

@end

@implementation Person

+ (void)test

{

    NSLog(@"Person+test");

}

- (void)run

{

    NSLog(@"person---跑");

}

- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

    return _age;

}

@end

// 不允许子类和父类拥有相同名称的成员变量

// Student

@interface Student : Person

{

    int _no;

// int _age;

}

+ (void)test2;

@end

@implementation Student

// 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法

- (void)run

{

    NSLog(@"student---跑");

}

+ (void)test2

{

    [self test];

}

@end

int main()

{

    [Student test2];

//    Student *s = [Student new];

//    

//    [s run];

    return 0;

}

5. 继承的使用场合

l 它的所有属性都是你想要的,一般就继承

l 它的部分属性是你想要的,可以抽取出另一个父类

/*

1.继承的使用场合

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

2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类

A

{

    int _age;

    int _no;

 }

B : A

{

    int _weight;

 }

 // 继承:xx 是 xxx

 // 组合:xxx 拥有 xxx

2.组合

A

 {

     int _age;

     int _no;

 }

 B

 {

     A *_a;

     int _weight;

 }

@interface Score : NSObject

{

int _cScore;

int _ocScore;

}

@end

@implementation Score

@end

@interface Student : NSObject

{

// 组合

    Score *_score;

//    int _cScore;

//    int _ocScore;

int _age;

}

@end

@implementation Student

@end

6. super关键字

l 分别调用父类的对象方法和类方法

/*

僵尸

跳跃僵尸、舞王僵尸、铁桶僵尸

 */

#import <Foundation/Foundation.h>

/*

 super的作用

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

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

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

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

 */

// 僵尸

@interface Zoombie : NSObject

- (void)walk;

+ (void)test;

- (void)test;

@end

@implementation Zoombie

- (void)walk

{

    NSLog(@"往前挪两步******");

}

+ (void)test

{

    NSLog(@"Zoombie+test");

}

- (void)test

{

    NSLog(@"Zoombie-test");

}

@end

// 跳跃僵尸

@interface JumpZoombie : Zoombie

+ (void)haha;

- (void)haha2;

@end

@implementation JumpZoombie

+ (void)haha

{

    [super test];

}

- (void)haha2

{

    [super test];

}

- (void)walk

{

// 跳两下

    NSLog(@"跳两下");

// 走两下(直接调用父类的walk方法)

    [super walk];

//NSLog(@"往前挪两步----");

}

@end

int main()

{

//[JumpZoombie haha];

    JumpZoombie *jz = [JumpZoombie new];

    [jz haha2];

return 0;

}

二、 多态

1. 多态的基本概念

l 某一类事物的多种形态

l OC对象具有多态性

2. 多态的体现

Person *p = [Student new];

p->age = 100;

[p walk];

l 子类对象赋值给父类指针

l 父类指针访问对应的属性和方法

3. 多态的好处

l 用父类接收参数,节省代码

4. 多态的局限性

l 不能访问子类的属性(可以考虑强制转换)

5. 多态的细节

l 动态绑定:在运行时根据对象的类型确定动态调用的方法

三、 NSString的简单使用

1. 字符串的快速创建

NSStirng *str = @“Hello”;

2. 使用静态方法创建

3. 使用%@输出字符串

NSString *name = @”mj”;

NSLog(@“我的名字是%@”,  name);

时间: 2024-11-12 16:41:41

05-面向对象语法04的相关文章

面向对象语法

//类的声明#import <Foundation/Foundation.h>@interface Car : NSObject  //NSObject让Car类具备有创建对象的能力{   @public   int wheels;   int speed; }- (void)run;@end //类的实现@implementation Car- (void) run{   NSLog(@"@%i个轮子,%i世俗的车子跑起来了",wheels,speed);}@end //

【黑马程序员】————面向对象语法2

一.      set方法和get方法 1.          set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 成员变量尽量不要用@public 2.          set方法 1)       作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤 2)       命名规范: 1> 方法名必须以set开头 2> set后面

【黑马程序员】————面向对象语法1

一.  面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 常用术语 面向过程 Procedure Oriented 面向对象 Object Oriented,简称OO 面向对象编程 Object Oriented Programming,简称OOP 二.  类和对象的关系 面向对象中有2个非常重要的概念:类和对象 OC中的面相对象 1)      OC中的类相当于图纸,用来描述一类事物.也就是说,要想创建对象,必须先有类 2)      OC

05面向对象基础

总结一下这两天的学习笔记,正所谓温故而知新嘛,希望能够更好的学习后面的新知识 1.面向对象概念面向对象三大特征:封装.继承.多态 2.类对象是引用传递把一个对象传递到方法中,传递的也是这个对象本身的引用,修改这个对象会影响外面的对象 3.null表示变量没有指向任何对象值类型(ValueType):数值类型(int.long.double等).boolean等基本类型,枚举.结构体的值是复制传递,不能为null;String不是值类型 4.局部变量和成员变量(1)局部变量必须初始化,成员变量声明

面向对象语法-02

接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 定义OC的类和创建OC的对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现(定义).跟函数类似,函数有分声明和定义 类的声明 代码编写 定义一个Car类,拥有2个属性:轮子数.时速,1个行为:跑 类名\属性的命名规则:标示符的规则 类名的命名规范:有意义.驼峰标识.首字母大写 #import <Foundation/Foundation.h> // 类的声明 @interfa

java基础学习05(面向对象基础01--类实例分析)

面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过setter和getter设置和取得4.如果需要可以加入若干构造方法 5.再根据其它要求添加相应的方法6.类中的所有方法都不要直接输出,而是交给被调用处调用 Demo 定义并测试一个名为Student的类,包括属性有"学号"."姓名"以及3门课程"数学".

java基础学习05(面向对象基础02)

面向对象基础02 实现的目标 1.String类的使用 2.掌握this关键字的使用3.掌握static关键字的使用 String类 实例化String对象一个字符串就是一个String类的匿名对象,就是已经开辟了堆内存空间的并可以直接使用的对象.1.采用直接赋值的方式进行操作. String name = "zhangsan"; 使用这种方式,如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明时,就不会再开辟内存空间.2.直接调用String类的构造方法(public S

OC中的面向对象语法

一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电脑中的歌曲 关闭电脑 b) 面向对象(不是相亲的“对象”) 电脑 ² 开机 ² 播放歌曲 ² 关机 2) 区别分析 面向过程关注的是解决问题需要哪些步骤:面向对象关注的是解决问题需要哪些对象 没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样 想打电话\发短信 à 

15-01-02 C# 语法 04

异常:语法上没有错误,在程序运行过程中,由于某些原因程序出现了错误,不能再正常运行. 如果想要程序变得健壮些,应该在代码中经常用try-catch来捕获异常 哪行代码有可能出现异常,你就try它一下,try{} catch{} 执行过程:如果try中的代码没有出现异常,那么catch中的代码不会执行,如果try中的代码出现了异常,哪怕这行出现异常的代码后面还有100行代码都不会执行了而是直接跳到catch中执行代码 变量的作用域就是你能够使用到这个变量的范围,变量的作用域一般从声明它的那个大括号

javascript高级编程笔记05(面向对象)

面向对象设计 es中有两种属性:数据属性和访问器属性 数据属性: 数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性 [[Configurable]]:表示能否通过delete删除属性从而重新第一属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true [[Writable]]:表示能否修改属性的值,默认为true [[Value]]:包含这个属性的数据值默认