06-自定义构造方法
1、自定义构造方法的规范
(1)一定是对象方法,一定以 - 开头
(2)返回值一般是id类型
(3)方法名一般以initWith开头
以Person类为例,初始化姓名和年龄属性
Person.h代码
1 #import <Foundation/Foundation.h> 2 @interface Person : NSObject 3 @property NSString *name; 4 @property int age; 5 //初始化_name 6 - (id)initWithName: (NSString *)name; 7 //初始化_age 8 - (id)initWithAge: (int)age; 9 //同时初始化_name和_age 10 - (id)initWithName: (NSString *)name andAge: (int)age; 11 @end
注意第6 8 10行代码:符合自定义构造方法的规范: 1>以 - 开头; 2>返回值类型为id类型; 3>方法名以 initWith开头
Person.m代码
1 #import "Person.h" 2 @implementation Person 3 - (id)initWithName: (NSString *)name 4 { 5 if(self = [super init]) 6 { 7 _name = name; 8 } 9 return self; 10 } 11 - (id)initWithAge: (int)age 12 { 13 if(self = [super init]) 14 { 15 _age = age; 16 } 17 return self; 18 } 19 20 - (id)initWithName: (NSString *)name andAge: (int)age 21 { 22 if(self = [super init]) 23 { 24 _name = name; 25 _age = age; 26 } 27 return self; 28 } 29 @end
上述代码分别对3种自定义构造方法进行实现。
牢记格式:
1 - (id)initWithName: (NSString *)name andAge: (int)age 2 { 3 if(self = [super init]) 4 { 5 _name = name; 6 _age = age; 7 } 8 return self; 9 }
main.m代码
1 #import <Foundation/Foundation.h> 2 #import "Person.h" 3 int main(int argc, const char * argv[]) 4 { 5 Person *person1 = [[Person alloc] initWithName: @"玲玲"]; 6 Person *person2 = [[Person alloc] initWithAge:20]; 7 8 Person *person3 = [[Person alloc] initWithName:@"宁宁" andAge:24]; 9 10 NSLog(@"person1名字:%@", person1.name); 11 NSLog(@"person2年龄:%i", person2.age); 12 13 NSLog(@"person3名字叫:%@, 年龄:%i", person3.name, person3.age); 14 return 0; 15 }
运行,输出结果为:
2、假如在创建一个子类Student
Student.h
1 #import "Person.h" 2 @interface Student : Person 3 @property int no;//学号 4 //同时初始化姓名 年龄 学号 5 - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no; 6 @end
Student.m
1 #import "Student.h" 2 @implementation Student 3 - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no 4 { 5 //将name age传递到父类方法中进行初始化 6 if(self = [super initWithName:(NSString *)name andAge:(int)age]) 7 { 8 _no = no; 9 } 10 return self; 11 } 12 @end
这里值得注意的是第6行,我们将name age传递给父类方法进行初始化,而不是在子类中初始化。以后要尽量这么写,体会编程思想。
3、总结
(1)牢记规则:
1>一定是对象方法,一定以 - 开头
2>返回值一般是id类型
3>方法名一般以initWith开头
1 //初始化_name 2 - (id)initWithName: (NSString *)name; 3 //初始化_age 4 - (id)initWithAge: (int)age; 5 //同时初始化_name和_age 6 - (id)initWithName: (NSString *)name andAge: (int)age;
(2)构造方法的结构
1 - (id)initWithName: (NSString *)name andAge: (int)age 2 { 3 if(self = [super init]) 4 { 5 _name = name; 6 _age = age; 7 } 8 return self; 9 }
(3)父类中存在的属性,尽量传递给父类方法来初始化。
转载于:https://www.cnblogs.com/xdl745464047/p/4002259.html
06-自定义构造方法相关推荐
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- 七:构造方法与自定义构造方法
一.构造方法 1.在OC中构造方法是init开头的方法, 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值. 构造方法属于对象方法,以"-"开头 例如:在创建对象的时候 ...
- 不写默认无参构造方法,调用自定义构造方法时报错No constructor found in com...
如果在实体类里面自定义构造方法,没有写默认无参构造方法,然后初始化类的对象,调用自定义构造方法的时候,就会报如下错误: 解决办法是:在实体类中加入无参数构造方法即可,如下图
- 06 类与对象、封装、构造方法
更多文章请见:黑马Java基础笔记大纲 第1章 面向对象思想 1.1 面向对象思想概述 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使 ...
- 自定义依赖注解无效_关于Apt注解实践与总结【包含20篇博客】
超详细!安卓巴士开发者大会嘉宾及主题介绍 目录介绍 00.注解系列博客汇总 01.什么是apt 02.annotationProcessor和apt区别 03.项目目录结构 04.该案例作用 05.使 ...
- oc35--自定义构造方法
// // Person.h#import <Foundation/Foundation.h>@interface Person : NSObject@property int age; ...
- id、构造方法、Category 分类、类的本质、description方法、SEL
1.id: 万能指针id :id对象不能用点语法.id对象本身已经有 * 了 因此变量名不能有 * . 可以吧id理解为 NSObject * 类型数据! int main() { @autorele ...
- 杨校老师课堂之Java类与对象、封装、构造方法
杨校老师课堂之Java类与对象.封装.构造方法 本篇文章内容如下: 面向对象 类与对象 三大特征--封装 构造方法 教学目标 能够理解面向对象的思想 能够明确类与对象关系 能够掌握类的定义格式 能够掌 ...
- Android 系统(264)---android进阶——自定义View
android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性 https://www.jianshu.com/p/48944aad200 ...
最新文章
- SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
- 组件化开发和模块化开发概念辨析
- 从硬件到框架,30+巨头参与的AI基准竞争结果公布(第一回合)
- 水晶报表自定义函数(替换并截取特殊字符后内容)
- 知道Google map上面街景怎么来的吗?-相当强大
- 在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
- python excel数据框_python – 熊猫数据框到Excel表
- 详细分析 Sonlogger 任意文件上传漏洞 (CVE-2021-27964)
- markdown与latex:书写单边大括号左边或右边即在没有括号的一端加点
- BigInteger简单使用及方法总结
- 【设计模式】适配器模式
- 花书《深度学习》代码实现:01 线性代数:基本概念+代码实现基本运算
- python显示实时时间校对_Python实现系统时间自动校正
- PMP考纲解读 |【人】任务3—支持团队绩效(二)
- java的try后面跟括号
- Java设计模式之装饰器模式 (转)
- 使用tree生成目录树结构
- hdu4489 The King’s Ups and Downs
- 小猿圈python之练习小例子
- Python Cerberus
热门文章
- python总结简短_Python简单的基础总结
- python 手机自动化脚本_iOS python自动化出包脚本
- html点击计数器的实现,点击计数器_Servlet 教程_w3cschool
- HTML画笔移出画布停止,html5 canvas画布无法清除
- 电脑电池修复_笔记本电脑充不进去电如何修复
- 微信小程序选择框问题 小程序picker点击显示object range-key=这里写要显示的字段
- element tree树组件default-expand-all属性设置默认展开的节点
- vue中使用原始html插值,VUE.JS中的插值表达式、v-cloak、v-text、v-html、v-bind:、v-on:...
- shell正则表达式截取字符串_从CVE20208816聊聊shell参数扩展
- c++ string 数组_PHP数组与字符串之间相互转换的方法