OC 第三讲 继承初始化方法
来源:互联网 发布:a 算法原理 编辑:程序博客网 时间:2024/05/17 01:48
在我们生活中,有很多的继承关系,其实继承我们可以理解为它是什么什么的一种。比如:汽车是交通工具的一类,也就是汽车类继承于交通工具类。
继承的上层:父类:superclass;
继承的下层:子类:subclass;
是单向的,不能相互继承,具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为。 A是子类, B是父类
例:父类 Person
#impor<Foundation/Fundation.h>
@interface Person : NSObject {
NSString *_name;
NSString *_sex;
NSInteger _age;
}
@end
例:子类 Student
# import<Person.h>
@interface Student : Person {
// 学生特有的成员变量
NSString *_school;
NSInteger _number;
}
oc中 只允许单继承; 没有父类的类称为根类;oc中的根类是NSObject;
继承的内容:所有的成员变量和方法;也可以重写父类的方法:
super 的用法:
super 是编译器指令,在方法实现的内部使用;
作用:给super 发送消息,可以执行从父类继承下来的方法。
继承中的初始化方法:
self = [super init];
初始化过程: 1.执行父类中实现的初始化方法。
2.从根类NSObject开始执行初始化方法。
3.判断父类中的初始化是否成功,就是判断self是否存在。
4.若存在初始化子类成员变量
5.完成对象的初始化设置,返回对象。
例:建立一个Person类,在建立Student类继承于Person,建立UniversityStudent类继承于Student;
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject {
NSString *_name;
NSString *_sex;
NSInteger _age;
@private
float _money;
}
/// 指定(指派)初始化
- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;
/// 其他自定义初始化方法
- (id)initWithSex:(NSString *)sex;
- (id)initWithName:(NSString *)name age:(NSInteger)age;
- (id)initWithName:(NSString *)name sex:(NSString *)sex;
- (void)sayHi;
@end
Person.m
#import "Person.h"
@implementation Person
/// 自定义初始化
- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age
{
NSLog(@"Person类初始化开始");
self = [super init]; //父类是NSObject,用init!
if (self) {
_name = name;
_sex = sex;
_age = age;
}
NSLog(@"%@", self);
NSLog(@"Person类初始化结束");
return self;
}
/// 其他自定义初始化方法 ,需要调用上面的指派初始化方法
- (id)initWithSex:(NSString *)sex
{
self = [self initWithName:nil sex:sex age:0];
return self;
}
- (id)initWithName:(NSString *)name age:(NSInteger)age
{
self = [self initWithName:name sex:nil age:age];
return self;
}
- (id)initWithName:(NSString *)name sex:(NSString *)sex
{
self = [self initWithName:name sex:sex age:0];
return self;
}
- (void)sayHi
{
NSLog(@"Hi");
}
@end
#import "Person.h"
@interface Student : Person
{
/// 学生特有的成员变量
NSString *_school;
NSInteger _number;
}
/// 自定义初始化方法
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number;
/// 自我介绍方法
- (void)introduce;
@end
Student.m
#import "Student.h"
@implementation Student
/// 自定义初始化方法
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number
{
/*
_name = name;
_sex = sex;
_age = age;
*/
NSLog(@"Student类初始化开始");
self = [super initWithName:name sex:sex age:age]; //父类是initWithName等等,必须先初始化父类的,再初始化子类的
if (self) {
_school = school;
_number = number;
}
NSLog(@"Student类初始化结束");
return self;
}
/// 自我介绍方法
- (void)introduce
{
NSLog(@"I am a Student, my name is %@, sex is %@, age is %ld.", _name, _sex, _age);
}
/// 子类重写父类得方法(无需声明)
- (void)sayHi
{
[super sayHi]; // 继承父类,先输出父类
NSLog(@"Hi, I am a second student, my name is %@, What's your name?", _name);
}
@end
UniversityStudent.h
#import "Student.h"
@interface UniversityStudent : Student {
NSString *_major; //专业
}
/// 完整初始化方法
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number
major:(NSString *)major;
@end
#import "UniversityStudent.h"
@implementation UniversityStudent
/// 完整初始化方法
- (id)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
school:(NSString *)school
number:(NSInteger)number
major:(NSString *)major
{
// 调用从Student类继承下来的初始化方法
NSLog(@"UniversityStudent类初始化开始");
self = [super initWithName:name sex:sex age:age school:school number:number];
if (self) {
// 对持有的成员变量--赋值
_major = major;
}
// 返回自身对象
NSLog(@"UniversityStudent类初始化结束");
return self;
}
/// 重写父类方法
- (void)introduce
{
NSLog(@"我是一名高富帅%@ %@ %ld %@ %ld %@",
_name, _sex, _age, _school, _number, _major);
}
@end
#import <Foundation/Foundation.h>
#import "Student.h" // 只需导入子类
#import "Teacher.h"
#import "UniversityStudent.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 子类使用父类继承下来的方法
Student *p = [[Student alloc] initWithName:@"Vivian" sex:@"women" age:18];
[p introduce]; // Student定义的方法
[p sayHi]; // Person定义的方法, 当子类重写父类得方法,先执行子类的方法。
NSLog(@"main: %@", p); // 打印自身地址
Teacher *q = [[Teacher alloc] initWithName:@"bobo" sex:@"man" age:45];
[q sayHi];
NSLog(@"main: %@", q); // 打印自身地址
UniversityStudent *un = [[UniversityStudent alloc] initWithName:@"李敏镐" sex:@"男" age:22 school:@"我家" number:110 major:@"搞不清"];
[un introduce];
}
return 0;
}
我们在写类时,都需要完整的初始化方法。12点太晚类,明天来写。。
- OC 第三讲 继承初始化方法
- OC基础第三讲):继承 初始化方法 便利构造器
- OC第三讲(Inherit 继承)
- OC - 第三章 继承、初始化方法、便利构造器
- OC第三讲继承-动物类
- OC之继承,初始化方法
- OC之继承、初始化方法
- OC第三讲继承-模拟打僵尸
- OC-----第三讲
- OC----第三讲作业
- OC的继承 初始化
- oc基础知识2:继承、初始化,方法重载,方法覆盖
- OC基础初始化方法,Set get方法,继承父类
- OC之继承,初始化方法,便利构造器
- [Objective-C] 03.OC中的继承和初始化方法
- OC基础:继承.初始化方法,便利构造器
- OC-继承-初始化方法-便利构造器(练习题-打僵尸)
- OC学习-继承,便利构造器,初始化方法
- 易学设计模式看书笔记(7) - 代理模式
- GVim中以十六进制方式打开文件
- perl
- UVa 769 - Magic of David Copperfield 解题报告(思维)
- 数据库的增删改查操作
- OC 第三讲 继承初始化方法
- 某高校教务系统登录验证码的识别 (2)
- Socket 粘包 封包 拆包
- poj2828 Buy Tickets
- HTML知识
- <引爆点>感悟
- level-list
- onActivityResult会执行onCreate()生命周期
- TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT选择