类的初始化分析要点代码

分析要点:

1、初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程

2、初始化的主要目的:对内部的存储属性赋值

3、结构:如果不自觉添加初始化,会自动添加默认init和memberwise init

类的初始化:代码如下

class YY

{

var i:int// 会报错,因为没有初始值(存储属性)

}

//NN没有构造器

class NN{

var i:int

init(a:int){i=1}

}

//黄金规则1:实例化之后所有的存储属性必须有值(两种赋值方法)

//专门(特定)的初始化器designated initiliazer

//作用:给本类的所有存储属性赋值

class AA{

var m:int()

var n:int

init(mm:int,nn:int)

{

m=mm

n=nn

}

init()

{

m=111

n=22

//这里会报错,表明特定的init之间不能相互调用

//所以建议:实际每个类只写一个特定的初始化器

//self.init(mm:111,nn:222)

}

//便利的初始化器需要调用专门的初始化器(直接或间接都可以)

convenience init (mm:int)

{

self.init(mm:mm,nn:1)

}

convenience init(nn: Int){
//self.init(mm:1,nn:2)
self.init(mm:nn)
}

}

//**************有了继承****
//class Parent {
// var i:Int = 1
// // var m: String? //只有可为nil的类型会有默认值
//
// var m: Int
// init(m: Int) {
// self.m = m
// }
//}
//
//class Child :Parent {
// var n: Int
// init(n: Int) {
// //阶段一
// self.n = n //先把自己的活干完
// super.init(m: 1)//在叫父类干
// //阶段二
// m = 2//不满意父类的,就自己干
//
// }
//
//}
/**
专门初始化器:
1.可以有多个
2.互相不能调用,每一个负责实现所有本类存储属性的初始化
3.负责处理继承过来的存储属性的初始化。
3.1 相信别人,所以表现就是调用父类的特定初始化器(不能
调用父类的便利初始化器)
便利的初始化器:
1.可以有多个
2.可以调用本来其它的便利初始化器,也可以调用本类的特定初始化器
3.最终一定是调用本类的特定初始化器
*/

//*******初始化器的继承***********

class P{
var m: Int
init(m: Int) {
self.m = m
}
init(m: Int,f: Bool) {
self.m = m
}
convenience init() {
self.init(m: 1)
}

}
class C: P{
var n: Int = 1
override init(m: Int) {
super.init(m: m)
}
override init(m: Int, f: Bool) {
super.init(m: m, f: f)
}

// init(n: Int) {
// self.n = n
// super.init(m: 1)
// }
}
/*默认情况下,子类不会继承父类的构造器
如果想让子类继承父类的构造器,有以下几个条件
1.自己的属性必须已经赋值(声明时)
2.会继承父类的特定初始化器
3.如果子类把父类所有的特定初始化器都实现了,
那么子类也会继承父类的所有便利初始化器

*/

//let ins = C(

//***********可失败的
class FailureClass {
var name:String
init?(name:String) {

self.name = name
if name.isEmpty { return nil}

}
}
//返回的是一个可为nil的类型
let ins = FailureClass(name: "dasf")
ins?.name
if let xx = ins {
xx.name
}
ins!.name

时间: 2024-10-05 23:27:10

类的初始化分析要点代码的相关文章

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺

class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法.子类也是这样,然后继承之后,关于程序打印输出的结果.涉及到Java类的各种成员的初始化顺序.经测试,得到如下结论: 1.父类[静态成员]和[静态代码块],按在代码中出现的顺序依次执行.2.子类[静态成员]和[静态代码块],按在代码中出现的顺序依次执行.3.父类的[普通成员变量被普通成员方法赋值]和[普通代码块],按在代码中出现的顺序依次执行.4.执行父类的构造方法

《Java编程思想》学习01:普通类的初始化加载顺序分析

<Java编程思想>学习01:普通类的初始化加载顺序分析 本文根据控制变量法,分析普通类(没有extends,implement)初始化的加载顺序: 参考<Java编程思想>第五章 源码 StaticClass1类 package com.tyj.study.thinkinjava; /* * *@Description: *@Author:TYJ *@Date: create in 2019/7/9 17:22 */ public class StaticClass1 { { S

Red5源代码分析 - 关键类及其初始化过程

原文地址:http://semi-sleep.javaeye.com/blog/348768 Red5如何响应rmpt的请求,中间涉及哪些关键类? 响应请求的流程如下: 1.Red5在启动时会调用RTMPMinaTransport的start()方法,该方法会开启rmtp的socket监听端口(默认是1935),然后使用mina(apache的io操作类库)的api将RTMPMinaIoHandler绑定到该端口. 2.RTMPMinaIoHandler上定义了messageReceived.m

Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析

上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. 直入正题,我们打开CCScheduler.h文件看下里面都藏了些什么. 打开了CCScheduler.h 文件,还好,这个文件没有ccnode.h那么大有上午行,不然真的吐血了, 仅仅不到500行代码.这个文件里面一共有五个类的定义,老规矩,从加载的头文件开始阅读. #include <funct

C++ 静态成员的类内初始化

一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: 1 //example.h 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 6 class Example{ 7 public: 8 static double rate = 6.5; 9 static const int vecSize =

CCTextureCache类源码分析 (1)

CCTextureCache类源码分析(1): 1. CCTextureCache类: 这个类跟纹理缓存有关,我们跟着代码分析下这个类是怎么对纹理进行缓存的. /** Returns the shared instance of the cache * 单例 */ static CCTextureCache * sharedTextureCache(); 2.我们在创建精灵的时候会调用 CCTextureCache::sharedTextureCache()->addImage(pszFilen

自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 更有开发效率地使用CSV文件 为了更有效率地使用CSV文件,我制作了一个工具:Code代码生成器. 这个工具可以对CSV文件进行简单地配置,自动生成这个CSV文件对应的C++数据结构和字段类型解析函数代码. 工程项目只要加入这些自动生成的代码,就可以更方便地使用来自CSV配置文件的数据. 用工具自动生代码,可以省去了手工编写.手工维护那些大量的.无聊繁琐的类型定义.数据转换的代码的过

VS C++工程类成员初始化检测脚本

最近项目中出现由类成员未初始化而进行读写而造成的问题,于是想将项目中所有的为初始化的地方找出来,优化一下代码,维护了这么多年的程序已有百万余行且VS2015还尚未支持检查类成员初始化的方法.,于是想写一个小工具帮助我们检查这些纰漏,于是向老大请示后开写,之前没有用过什么脚本写过工具,听说python挺火,于是我要上岸. 现学现用写了2天,写出来一个完全op的搓诞的玩意儿,太丑了,因为不能花太多时间在上面还有其他任务.不过能用来分析一个工程中所有的cpp与h文件效果还不错. 以下是代码,以此为戒

C++语言学习(十四)——C++类成员函数调用分析

C++语言学习(十四)--C++类成员函数调用分析 一.C++成员函数 1.C++成员函数的编译 C++中的函数在编译时会根据命名空间.类.参数签名等信息进行重新命名,形成新的函数名.函数重命名的过程通过一个特殊的Name Mangling(名字编码)算法来实现.Name Mangling算法是一种可逆的算法,既可以通过现有函数名计算出新函数名,也可以通过新函数名逆向推导出原有函数名.Name Mangling算法可以确保新函数名的唯一性,只要命名空间.所属的类.参数签名等有一个不同,那么产生的