OC语言学习 (六) 继承、多态,构造方法,description方法

声明父类Animal继承自NSObject

Animal.h

#ifndef oc_Animal_h
#define oc_Animal_h
@interface Animal : NSObject {
    @public
    int weight;
}
- (void)eat;

//重写默认构造方法
- (id) init;
//自定义构造方法
- (id) initWithWeight:(int)newWeight;

@end

#endif

Animal.m

#import <Foundation/Foundation.h>
#import "Animal.h"

@implementation Animal

- (void)eat {
    NSLog(@"体重:%d", weight);
}

//id 是万能指针,可指向任何对象, 不要再加上*
//重写默认构造方法init  构造方法:初始化对象
- (id) init
{
    if (self = [super init]) { //!=nil   先初始化父对象,再赋给self, 再初始化自有成员, 最后return self
        weight = 20;
    }
    return self;
}

//自定义构造方法
- (id) initWithWeight:(int)newWeight
{
    if (self = [super init]) {
        self->weight = newWeight;
    }
    return self;
}
@end

子类Dog,继承自Animal

Dog.h

#ifndef oc_Dog_h
#define oc_Dog_h
#import "Animal.h"
@interface Dog : Animal {
    @public
    int speed;
}

@property int speed; //自动声明 get set方法

- (void)run;

//id 是万能指针,可指向任何对象, 不要再加上*
//重写init  构造方法:初始化对象
- (id) init; //重写 NSObject的init

- (id) initWithWeightSpeed:(int)newWeight:(int)newSpeed;

- (NSString*)description; //对象描述   //重写 NSObject的description
+ (NSString*)description; //类对象描述

@end

#endif

Dog.m

#import <Foundation/Foundation.h>
#import "Dog.h"

@implementation Dog

@synthesize speed; //编译器自动生成get、set的实现方法

- (void)run {
    NSLog(@"跑-速度:%d", speed);
}

//id 是万能指针,可指向任何对象, 不要再加上*
//重写init  构造方法:初始化对象
- (id) init
{
    if (self = [super init]) { //!=nil
        speed = 15;
        //self->speed = 15;
    }
    return self;
}

//自定义构造方法,调用父类自定义构造
- (id) initWithWeightSpeed:(int)newWeight:(int)newSpeed
{
    if (self = [super initWithWeight:newWeight]) {
        speed = newSpeed;
    }
    return self;
}
- (NSString*)description //对象描述   //重写 NSObject的description
{
    return [NSString stringWithFormat:@"weight=%d,speed=%d", weight, speed];
}
+ (NSString*)description //类对象描述
{
    return [NSString stringWithUTF8String:"<Dog : Animal>"];
}

@end

main.m

#import "Animal.h"
#import "Dog.h"
int main()
{
        Animal* animal = [[Animal alloc] init]; //默认构造
        [animal eat];
        animal = [[Animal alloc] initWithWeight:17]; //自定义构造
        [animal eat];

        Dog* adog = [[Dog alloc] init];//默认构造
        [adog run];
        [adog eat];
        adog = [[Dog alloc] initWithWeight:16];//父类的自定义构造
        [adog eat];
        adog = [[Dog alloc] initWithWeightSpeed:16:13];//Dog自身的 自定义构造
        [adog run];
        [adog eat];

        //多态创建对象
        Animal* xdog = [[Dog alloc] initWithWeightSpeed:33 :55];
        [xdog eat];
        Dog* mdog = xdog;
        [mdog run];

        //description方法调用
        NSLog([mdog description]); //调用对象方法
        NSLog(@"%@", mdog);//输出对象%@  默认调用description对象方法
        NSLog([Dog description]); //调用类方法
        NSLog([[Dog class] description]); //默认调用 description类方法  这里省略了@"%@"的format       

        return 0;
}
时间: 2024-12-29 11:54:25

OC语言学习 (六) 继承、多态,构造方法,description方法的相关文章

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性

黑马程序员—oc语言学习心得—block

黑马程序员—oc语言学习心得—block -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,程序一般用typedef定义一个block类型 然后调用 typedef void(^xxx)(); 可使用助记符 inlineblock 2,Block内部可以访问外部变量:默认情况下,Block内部不能修改外部的局部变量 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改. 3,block的作用: 利用block封

黑马程序员——oc语言学习心得----NSFileManager

黑马程序员——oc语言学习心得----NSFileManager -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 自己总结了下NSFileManager的简单几个用法 : // 首先要创建文件管理器 NSFileManager *fm=[NSFileManager defaultManager]; 1,判断文件是否存在 fileExistsAtPath: 2,判断文件是否是目录 fileExistsAtPath: 3, 判断文件是否可读

oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍

一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类的方法,绝对不是再写一个自己类的方法. 代码中原话叫:子类重写父类方法. 因为父类定义的方法不一定适用于子类. 注意:如果有重写,那么调用的是自己重写后的方法,如果没有重写,那么就调用的是父类的方法. 所以我们方法有一个执行的过程: 1.先去自己类里面找这个方法,如果找到就执行. 2.如果没找到,就

oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造成内存泄露 全局区:所有的全局变量和静态变量 常量区:所有的常量 代码区:程序编译后的指令集 类是模板,肯定需要存在内存里面,因为实例化对象的时候需要根据这个模板来创建,那么存在内存里面,存在哪呢?? 类模板存在:全局区! 存的是:类的描述,还有所有的方法实现 每个对象都会有一个系统给我们的isa指

有关Oc语言学习的一些感受及对面向过程和面向对象的理解

不得不说,接触编程过后,我的生活从来没有这么规律过,每天按时吃早中晚的饭,每天早九晚九的学习,我就在想我的大学生活怎么就没有这么认真过呢?算了还是不提大学了,惭愧的狠.       说正事吧,我学的ios软件开发,在这里之前的一个星期,把我曾经仅学了其三分之一的C语言基本完整的学了一遍,七天学习加复习相当于我曾经的一学期!这意味着什么,还是意会吧.然而C语言只是学习ios开发的桥梁,通过C语言过度到Object-c语言简称Oc,Oc才是进入ios开发大门的钥匙和基石.之前老师一再强调,基础一定要

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

21-黑马程序员------OC 语言学习笔记---点语法和作用域

1    合成存取方法为成员变量实现setter和getter方法,虽然并不难,但如果一个类中包含10个甚至更多的成员变量,为每个成员都编写setter.getter方法將是一件令人反胃的事情.OC语言提供了自动合成setter和getter方法,而且如果开发者需要自己控制某个setter和getter方法的实现,开发者依然可以提供setter和getter方法,这个由开发者自定义的setter和getter方法将会覆盖系统自动合成的setter和getter方法.系统自动合成setter和ge

20-黑马程序员------OC 语言学习笔记---多态

多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类.子类对象 4.局限性: 1> 父类类型的变量 不能 直接调用子类特有的方法.必须强转为子类类型变量后,才能直接调用子类特有的方法 @interface Animal : NSObject - (void)eat; @end @implementation Animal - (void)eat { NSLog(@"Animal-吃东西----");