Objective c类的初始化

Objective c中实现类的初始化要先重载父类的init方法:

1.首先调用[super init]使用父类的方法进行初始化。将对象赋给self

2.假设self不为nil即父类初始化成功,接着进行本类的初始化

3.返回self给调用者

@implementation Test
-(id)init
{
    if(self = [super init])
    {
        //本类的初始化代码
        //..........
    }
    return self;
    
}
@end

————————————————————————————————————————————————————————————————————————————

虚方法

1.调用时不看指针看对象。称为虚方法

2.OC中全部的方法都是虚方法

3.父类的指针能够指向子类对象

有两个类
card1.h
@interface Card1 : NSObject
{
    int money;
}
@property (nonatomic,assign) int money;

-(void)printAccount;

card2.h
@interface Card2 : Card1

- (void)printAccount;
@end

在main.m中

Card2 *card2=[[Card2 alloc] init];
card2.money=1000;
Card1 *card1=card2;
[card1 printAccount];

//父类指针指向子类对象,实际上仍然时调用子类card2中的打印方法,由于card1指针指向card2对象

这一点与C++里面也是非常类似的,OC中全部的对象都是通过指针来訪问的。这些指针对象拥有编译时类型和执行时类型。

编译时类型是静态类型,在编译阶段编译器仅仅是做简单地类型检查,宏替换,导入头文件等动作,与声明它时候的定义相关;执行时类型是动态类型。与它实际所指向的实例变量的类型有关,程序执行时才知道的类型。

编译器在编译阶段时会进行语法检查,因此尽管当父类指针指向子类的对象时,父类的.h声明文件里未声明的方法均不能直接调用。仅仅能通过OC的反射机制来訪问。如通过performSelector:@selector(SEL)来訪问,但编译器此时还是会有警告的。此时调用运行的均为子类的方法。当且仅当这种方法在子类中没有实现时才会调用父类自己的方法。

				
时间: 2024-08-04 13:55:11

Objective c类的初始化的相关文章

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

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

c++类与初始化

--c++类与初始化 --------------------------------2014/09/04 1. 类的定义(头文件.声明文件)看成类的外部接口,一般写成.h头文件. 2. 类的成员函数定义(源文件)看成类的内部实现,一般写成.cpp/.cc文件.   成员函数定义 返回值 类名::函数名(参数列表) { 函数体:} 类定义 class 类名 { 成员变量 成员函数 }; --注意这里有分号 看一个简单的例子: student.h #include<string> using n

Java类的初始化

Java提供了两种不同的初始化类型,分别是类的初始化和对象的初始化.类成员都是静态的,默认会设置一个值.对象的初始化会在构造函数里面进行.但如果想要赋给静态变量非默认值,或者是初始化一类共有的对象属性(不论调用哪个构造函数),那么就需要一些特殊的方法.提供了静态初始化块和非静态初始化块来处理这两种情况. 静态初始化块 静态初始化块是通过static{}来定义的.一个简单的代码示例如下: public class CorderStatic { staticint idx; static{ Syst

静态成员不能在类内初始化

为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样. class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的. #include <iostream> #include <cst

类的初始化分析要点代码

分析要点: 1.初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程 2.初始化的主要目的:对内部的存储属性赋值 3.结构:如果不自觉添加初始化,会自动添加默认init和memberwise init 类的初始化:代码如下 class YY { var i:int// 会报错,因为没有初始值(存储属性) } //NN没有构造器 class NN{ var i:int init(a:int){i=1} } //黄金规则1:实例化之后所有的存储属性必须有值(两种赋值方法) //专门(特定)的

《深入理解java虚拟机》:类的初始化

深入理解java虚拟机>:类的初始化 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中验证.准备.解析3个部分统称为连接.类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 加载.验证.准备.初始化和卸载这5个阶段的顺序时确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).另外注意这里的

类的生命周期(下)类的初始化【转】

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化.在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值.(2)在静态代码块处赋值,比如下面的代码,a就是第一种初始化,b就是第二种初始化 [html] view plaincopyprint? public

类的初始化&amp;实例化顺序

讲到类的初始化和实例化(见我的<Class的生命周期>),不得不提提初始化和实例化的顺序,我想这也是一直困扰了很大一部分人. 从大流程来说,类肯定是先初始化,再实例化的,这里得出第一个顺序: 静态域 --> 实例域 --> 构造函数.另外要符合任何子类的动作都会触发父类:父类 --> 子类.所以得出原则:[先静态后实例:先父类后子类] 而且同一个域的顺序可以分成两步: 创建-->赋值 对于静态域,其先经过链接创建静态变量,赋default值:再到初始化阶段给静态变量赋a