OC:继承、初始化方法、便利构造器
A继承 的作用就是为了,节省代码。
继承 :子类会继承父类 里面所有的内容
思想 :凡是继承过来的实例变量和方法 都是自己的(是从父类遗传过来的)
继承的使用场景 : 当我们多个类有部分相同特征和行为时,我们就可以把相同的部分放到同一个类里面,让下一个类继承即可
对于方法,只要声明了方法的接口,外部都可以访问到
父类 :基类 就是没有父类的类,就是继承的上层(superclass),就叫做基类 祖宗类 OC里面 NSObject。继承的下层是子类(subclass)
B.重写父类的方法: 如果在子类里面出现和父类方法重名的方法,系统就会认为他是对该方法的重写
代码demo
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "CollegeStudent.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Person *per = [[Person alloc]init];
// [per test];//验证出来 self
NSLog(@"%@",per);
Person *per2 = [[Person alloc]init];
// [per2 test];
NSLog(@"%@",per2);
//测试 Student 继承于 person
Student *stu = [[Student alloc]init];
[stu name];
//父类里的方法、行为子类也会继承过来
// [stu test];//这里的 test 方法就是自己的方法了
[stu test];//子类对父类的重写
CollegeStudent * col = [[CollegeStudent alloc]initWithName:@"我" gender:@"男" age: num: score: academy:@"大学本科" majory:@"软件工程"];
NSLog(@"%@",[col name]);
} return ;
} #import <Foundation/Foundation.h> @interface Person : NSObject
{
@protected
NSString *_name;
NSString *_gender;
NSInteger _age;
}
-(void)setName:(NSString *)name;
-(void)setGender:(NSString *)gender;
-(void)setAge:(NSInteger)age;
//getter
-(NSString *)name;
-(NSString *)gender;
-(NSInteger)age;
//
-(id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age;
-(void)test;
@end #import "Person.h" @implementation Person
-(void)setName:(NSString *)name{
_name = name;
}
-(void)setGender:(NSString *)gender{
_gender = gender;
}
-(void)setAge:(NSInteger)age{
_age = age;
}
//getter
-(NSString *)name{
return _name;
}
-(NSString *)gender{
return _gender;
}
-(NSInteger)age{
return _age;
}
//
-(id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age{
_name = name;
_gender = gender;
_age = age;
return self;
}
-(void)test{
NSLog(@"我是Person");
}
@end #import <Foundation/Foundation.h>
#import "Person.h" @interface Student : Person
{
/*
继承 的作用就是为了,节省代码。
继承 :子类会继承父类 里面所有的内容
思想 :凡是继承过来的实例变量和方法 都是自己的(是从父类遗传过来的)
继承的使用场景 : 当我们多个类有部分相同特征和行为时,我们就可以把相同的部分放到同一个类里面,让下一个类继承即可
对于方法,只要声明了方法的接口,外部都可以访问到
父类 :基类 就是没有父类的类,就是继承的上层(superclass),就叫做基类 祖宗类 OC里面 NSObject。继承的下层是子类(subclass)
*/
NSInteger _num;
CGFloat _score;
}
//setter getter
//- (void)setName:(NSString *)name;
//- (void)setGender:(NSString *)gender;
//- (void)steAge:(NSInteger)age;
- (void)setNum:(NSInteger)num;
- (void)setScore:(CGFloat)score;
- (void)test;//系统会识别为子类重写父类的方法
//
//- (NSString *)name;
//- (NSString *)gender;
//- (NSInteger)age;
- (NSInteger)num;
- (CGFloat)score;
//
-(id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
num:(NSInteger)num
score:(CGFloat)score;
@end #import "Student.h" @implementation Student
//- (void)setName:(NSString *)name{
// _name = name;
//}
//- (void)setGender:(NSString *)gender{
// _gender = gender;
//}
//- (void)steAge:(NSInteger)age{
// _age = age;
//}
- (void)setNum:(NSInteger)num{
_num = num;
}
- (void)setScore:(CGFloat)score{
_score = score;
}
- (void)test{
//重写父类的方法: 如果在子类里面出现和父类方法重名的方法,系统就会认为他是对该方法的重写
/*
重写从父类继承过来的方法:
1. 完全以子类的实现为主,父类的实现内容就被丢弃
2. 完全以父类的实现为主,没有子类的实现内容
3. 既有父类里面的实现内容,又有子类的实现内容
*/
//对于 3
[super test];//这是从父类里继承 super 继承父类里对该方法的实现内容
NSLog(@"这是Student类的重写方法");
}
//
//- (NSString *)name{
// return _name;
//}
//- (NSString *)gender{
// return _gender;
//}
//- (NSInteger)age{
// return _age;
//}
- (NSInteger)num{
return _num;
}
- (CGFloat)score{
return _score;
}
//
-(id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
num:(NSInteger)num
score:(CGFloat)score{
_name = name;
_gender = gender;
_age = age;
_num = num;
_score = score;
return self;
}
@end #import "Student.h" @interface CollegeStudent : Student
{
NSString *_academy;//学院
NSString *_major;//专业
}
- (void)setAcademy:(NSString *)academy;
- (void)majory:(NSString *)majory;
- (NSString *)academy;
- (NSString *)majory;
//
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
num:(NSInteger)num
score:(CGFloat)score
academy:(NSString *)academy
majory:(NSString *)majory; @end #import "CollegeStudent.h" @implementation CollegeStudent
- (void)setAcademy:(NSString *)academy{
_academy = academy;
}
- (void)setmajory:(NSString *)majory{
_major = majory;
}
- (NSString *)academy{
return _academy;
}
- (NSString *)majory{
return _major;
}
- (id)initWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
num:(NSInteger)num
score:(CGFloat)score
academy:(NSString *)academy
majory:(NSString *)majory{
//1.继承父类的初始化方法里的实现内容
self = [super initWithName:name gender:gender age:age num:num score:score];//继承 // initWithName:name 有一个ID类型返回值
// self 在这里指代一个 类的对象
//如果在父类的方法 initWithName:name 里面没有实现 则会崩溃 此时self 里面就会是空的
// if (self != Nil) {//判断前面几个实例变量赋值成功
//2. 对 self 的判断。如果 self 不为空 说明弗父类的初始化方法已经成功
//self 不为空,意味着对象已经创建,赋值成功 ??,在对象已经存在的前提下才能为其赋值
if (self) {
_academy = academy;
_major= majory;
}
//3. 如果在 OC里面如果只声明,没有实现,就会崩溃
// _name = name;
// _gender = gender;
// _age = age;
// _num = num;
// _score = score;
return self;
}
@end
类的继承
1.在初始化方法里调用 super 需要当前类的对象去接收。 如;self = [super initWithName:name gender:gender age:age num:num score:score]; self 指代当前的对象,存储当前对象的地址
对象都是用指针去指向。
2.if (self) {//这里的判断只是一种安全处理(在这讨论了 if 究竟有没有意义,已经证明是必要的,if()是一种安全处理,如果在父类的赋值方法里,返回为 Nil 这里把if 语句注释 下面的赋值语句 就会 崩溃)
_academy = academy;
_major= majory;
}
3.注意:CollegegStudent * stu1;//这一句并没有创建对象,因为对象的 创建首先要开辟内存,然后初始化,这都是在堆中 操作,而 改代码是在栈中操作,仅仅是一个指针而已。我们通常叫 stu1 是对象,是因为他指向堆中的内存,实际上他是一个指针。有的时候,我们可以写一个临时的指针用来存放一些类的对象。
4.注意:对象的实例变量、 方法在使用前,必须保证对象的存在。
+ (id)teacherWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
salary:(NSString *)salary
hobby:(NSString *)hobby;
+ (id)teacherWithName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age
salary:(NSString *)salary
hobby:(NSString *)hobby{
Teacher * tea = [[Teacher alloc]initWithName:name gender:gender age:age salary:salary hobby:hobby];
return tea;
}
Teacher * tea = [Teacher teacherWithName:@"张老师" gender:@"男" age:24 salary:@"一月6000¥" hobby:@"吃饭、睡觉、打豆豆"];
NSLog(@"%@ %@ %ld %@ %@",[tea name],[tea gender],[tea age],[tea salary],[tea hobby]);
OC:继承、初始化方法、便利构造器的更多相关文章
- OC基础:继承.初始化方法,便利构造器 分类: ios学习 OC 2015-06-16 19:27 84人阅读 评论(0) 收藏
继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的 ...
- Object_C初始化方法, 遍历构造器
//版本1 //- (id)init //{ // work = @"工作"; // return self; //} // // //版本2:调用父类的init ...
- OC语言中如何在便利构造器中利用便利初始化进行初始化
因为利用便利初始化在便利构造器中进行初始化,所以要利用便利初始化的声明及实现部分,可与前篇做比较: 1. 主函数部分: 2. 接口部分: 3. 实现部分: 4. 打印结果: 感兴趣的朋友们可自己与前面 ...
- oc实例变量初始化方法
1 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx 2 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3 使用实例初始化方法 ...
- Swift中的便利构造器和构造器链
import UIKit // 1.一个类中至少有一个指定构造器, 其必须负责初始化类中所有的实例存储属性 // 2.便利构造器属于次要的, 辅助性的构造器 // 3.类中可以不定义便利构造器, 便利 ...
- iOS学习之Object-C语言继承和初始化方法
一.继承 1.面向对象的三大特性:封装,继承,多态. 面向对象提供了继承特性.把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法即可.继承既能保证类的完整,又能简化代码. ...
- OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理
代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...
- 初始化方法,init,构造器
1.继承于NSObject class student: NSObject { var name : String? var age : Int = var friend : Int = init(n ...
- [swift]初始化方法自己主动继承
子类默认不会继承父类的初始化方法,然而,假设某种条件满足的话.父类的初始化方法还是能够继承给子类.在通常情况下,这意味着你不必复写父类的初始化方法.在安全的前提下能够以最低的代价继承父类的初始化方法. ...
随机推荐
- 第三集 欠拟合与过拟合的概念、局部加权回归、logistic回归、感知器算法
课程大纲 欠拟合的概念(非正式):数据中某些非常明显的模式没有成功的被拟合出来.如图所示,更适合这组数据的应该是而不是一条直线. 过拟合的概念(非正式):算法拟合出的结果仅仅反映了所给的特定数据的特质 ...
- Excel 之查找与替换
Excel查找与替换 1,一旦学会查找,替换就简单了. 2,查找下面有一个选项,里面有对查找的范围进行限制 3,你可以选中一个区域,然后再查找,查找只会在你选择的区域里面进行 4,查找只能找特定值,而 ...
- 【转】使用Python的IDE:Eclipse+PyDev
原文网址:http://www.crifan.com/try_with_python_ide_eclipse_pydev/ 之前已经介绍过了一些基本知识: [整理][多图详解]如何在Windows下开 ...
- unity, sprite atlas
一, Sprite Packer 可以直接在unity里放碎图,只要将Texture Type选为Sprite(2D and UI),Sprite Mode选为Single,再把想打在一张大图里的碎图 ...
- MySQL基础之第14章 存储过程和函数
避免编写重复的语句 安全性可控 执行效率高 14.1.创建存储过程和函数 14.1.1.创建存储过程 CREATE PROCEDUREsp_name ([proc_parameter[,...]]) ...
- myeclipse 8.5最新注册码(过期时间到2016年)
myeclipse 8.5最新注册码(过期时间到2016年) 这几天myeclipse弹出注册码过期,去网上一搜,要么已过期,要么就剩一两个月.倒腾了半天,自己申请了几个注册码,给大家分享一下 Sub ...
- Xcode5 支持 SVN 1.7
Xcode升级了之后出现了各种问题,SVN升级到subversion 1.7后,Xcode自带有svn,版本是1.6,所以svn的1.6和1.7不兼容. 解决的办法,要么是降低系统的svn 版本,要么 ...
- Provider 错误 '80004005' 未指定的错误 的最终解决方法
今天在配置公司的香港WEB服务器Server2003系统,建好应用程序池后,发现远行程序经常出现下面的错误,刷新几下又可以,但过不了多久又是出现下面的错误!! 在网上查找相关问题得知,这是2003SP ...
- 45个有新意的Photoshop教程和技巧
图形制作者和网页设计师已经准备好迎接新的Adobe Photoshop 教程了.在大家喜欢背后有许多它的理由,诸如Adobe Photoshop很容易操作,学习起来十分简单,但最重要的一点是这款软件能 ...
- WS之cxf处理的复杂类型(Map)
一.服务端: 1.创建接口: package cn.tdtk.ws.dao; import java.util.List;import java.util.Map; import javax.jws. ...