黑马程序员-构造方法

一、构造方法的作用

用来初始化对象的成员变量值,当我们在创建对象时,需要一些成员变量具有一定的初始值,这个时候就要用到构造方法。利用类的new方法可以创建一个对象,这个new方法其实是分两步来完成创建对象的。

1> 调用+alloc来分配存储空间  Person *p1 = [Person alloc];

2> 调用-init进行初始化,Person *p2 = [p1 init];

这样我们就可以重写-init方法进行一些成员变量的初始化了。看下面实例

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4 @property int age;
5 @end
 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (id)init
 6 {
 7     if ( self = [super init] )
 8     { // 初始化成功
 9         _age = 10;
10     }
11
12     // 3.返回一个已经初始化完毕的对象
13     return self;
14 }
15
16 @end
1 #import "Person.h"
2
3 @interface Student : Person
4 @property int no;
5 @end
 1 #import "Student.h"
 2
 3 @implementation Student
 4
 5 // 学生对象初始化完毕后,年龄就是10,学号就是1
 6
 7 - (id)init
 8 {
 9     if ( self = [super init] )
10     {
11         _no = 1;
12     }
13     return self;
14 }
15
16 @end

需要注意的是:一定要调用super的init方法来初始化父类中声明的一些成员变量和其他属性,在进行子类内部成员变量的初始化。

二、自定义构造方法

有时我们需要在创建某个对象的同时给对象一个和其他对象不同的成员变量初始值,此时需要自定义构造方法。

自定义构造方法的规范
1> 一定是对象方法,一定以 - 开头
2> 返回值一般是id类型
3> 方法名一般以initWith开头

看下面的实例:

 1 #import <Foundation/Foundation.h>
 2
 3 @interface Person : NSObject
 4 @property NSString *name;
 5 @property int age;
 6
 7 - (id)initWithName:(NSString *)name;
 8
 9 - (id)initWithAge:(int)age;
10
11 - (id)initWithName:(NSString *)name andAge:(int)age;
12
13 @end
 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (id)init
 6 {
 7     if ( self = [super init] )
 8     {
 9         _name = @"Jack";
10     }
11     return self;
12 }
13
14 - (id)initWithName:(NSString *)name andAge:(int)age
15 {
16     if ( self = [super init] )
17     {
18         _name = name;
19         _age = age;
20     }
21     return self;
22 }
23
24 @end
 1 #import "Person.h"
 2
 3 @interface Student : Person
 4 @property int no;
 5
 6 - (id)initWithNo:(int)no;
 7
 8 - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no;
 9
10 @end
#import "Student.h"

@implementation Student
- (id)initWithNo:(int)no
{
    if ( self = [super init] )
    {
        _no = no;
    }
    return self;
}

// 父类的属性交给父类方法去处理,子类方法处理子类自己的属性
- (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
{
    // 将name、age传递到父类方法中进行初始化
    if ( self = [super initWithName:name andAge:age])
    {
        _no = no;
    }

    return self;
}

@end

自定义子类构造方法的时候,如果需要重新初始化父类传下来的一些成员变量,应该首先看父类中有没有这些成员变量的构造函数,如果有的话就调用父类的构造函数。也就是说我们应该遵循这种原则:父类的属性应该交给父类方法去处理,子类方法处理子类自己的属性。上面student子类构造方法的实现如果如下这样写的话会显得很不专业。

 1 #import "Student.h"
 2
 3 @implementation Student
 4 - (id)initWithNo:(int)no
 5 {
 6     if ( self = [super init] )
 7     {
 8         _no = no;
 9     }
10     return self;
11 }
12
13 - (id)initWithName:(NSString *)name andAge:(int)age andNo:(int)no
14 {
15      if ( self = [super init] )
16      {
17         _no  = no;
18         self.name = name;
19         self.age = age;
20         //[self setName:name];
21         //[self setAge:age];
22    }
23
24     return self;
25 }
26 @end

这样写的缺点在于

1> 父类的属性应该交给父类方法去处理,子类方法处理子类自己的属性

2> 如果此时修改父类的成员变量名称,就需要修改对象的子类的构造方法,会造成一定的麻烦。

时间: 2024-12-09 17:50:11

黑马程序员-构造方法的相关文章

黑马程序员-OC的类的构造方法

构造方法:用来初始化对象的:首先分解一下创建对象的过程: Person *p = [Person new]; // new方法是alloc 和 init 这两个方法的组合: 完整的创建可用对象的过程: 1:分配存储空间:  就是调用的  +alloc 方法,这个方法是类方法,返回的是一个分配好存储空间的 对象: 2:初始化:-init 方法,对象方法,由alloc方法返回的对象调用init对对象进行初始化: 所以创建一个对象的规范和常用的方式:  Person *p = [[Person all

黑马程序员——网络编程篇

------- android培训.java培训.期待与您交流! ---------- 概述   1.网络模型        (1).OSI参考模型        (2).TCP/IP参考模型   2.网络通讯要素         (1).IP地址        (2).端口号         (3).传输协议    3.过程        1,找到对方IP. 2,数据要发送到对方指定的应用程序上.为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识. 为了方便称呼这个数据,叫做端口(逻

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员_API

------- android培训.java培训.期待与您交流! ---------- ======================API========================================= 看api的步骤: 1.看类的说明.其所属的包以及出现的版本. 2.看其构造函数. 3.看普通的方法.看时注意参数,和返回值类型. Object类 1. private static native void registerNatives (); 见到本地关键字修饰的方法,这个方

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员——I/O流基础知识

I/O流 Io流 代表有能力产生数据的数据源对象或者有能力接收对象的数据接收端对象.字节流和字符流.中文字符也转编码表,jbk2万多中文字.unicode全世界的字符收录.乱码,两种不同形式的编码表.字符流里面的对象融合了编码表,以便别人使用的使用用你指定的编码方式. 基类:读和写~ 字节流 InputStream,OutputStream 字符流 Reader,Writer Writer 主力方法是writer().既然IO流是操作数据的,而数据的最常见体现形式是:文件. 需求:准备在硬盘上创

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

黑马程序员——IO篇

------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 1.IO流用来处理设备之间的数据传输 2.Java对数据的操作是通过流的方式 3.Java用于操作流的对象都在IO包中 4.流按操作数据分为两种:字节流与字符流 . 字符流的数据字节流其实都能处理,因为无论什么在计算机上最后都是以字节存在的,但是其中有一部分数据它是以文本形式存在的,所以为了方便有了字符流,字符流里融合了编码表,而只有文字用到了编码表,所以字符流用来处理文本

黑马程序员——【Java高新技术】——代理

一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理等等,如何去做? 解答:编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码. 2.代理原理图,如下: 3.代理的优点 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类.还是代理类,这样以后很容易切换.例如,想要日志功能时就