一、从类中创建对象
类Class定义的实例方法Class#new将创建接受者对应的类的对象。这个是通过调用classexpr.allocate来完成的。可以重载 这个方法,但是必须返回正确的类的对象。然后调用新创建的对象的initialize,并将传递给new的参数传递给initialize。
注意:
1、如果类定义中重载了类方法new,并且new没有调用super,那么将无法创建该类的对象,并调用new将返回nil
2、通常initialize应当调用super,用于对父类进行初始化。
二、类和对象之间的交互
1、简单对象
如图:
其中klass用于指向对象的类引用,用于指向class对象的。super是用于指向父类。
2、类对象
在类定义中我们提到了,类定义是一段可执行的代码,并且是在某个对象作为上下文中执行,这样每个类本身就是一个对象。下图中展示了类和对象的全局图。每个类对象的klass都会隐含的指向一个虚拟类metaclass,所有类定义的类方法都是放到这个metaclass中的,当方法的接受者是类对象时,ruby就会直接到该metaclass中查找相应 的方法。可以这样理解,metaclass就是类对象的类。
既然类是对象,那么类对象就可以有自己的实例变量和实例方法。
类对象的实例方法,即,类定义中的类方法定义
- class Test
- def Test.to_s
- puts 'This is class method'
- end
- end
等价:
ruby 代码
- class Test
-
- class << self
- def to_s
-
- .......
- end
- end
- end
类实例变量是定义在metaclass中的变量。所以,必须在metaclass中定义访问函数。可以通过以下几种方式定义
ruby 代码
-
- class Test class Test
- @a='ffd' @a='ffd'
- end class <<self
- attr_reader:a
- class <class << Test <=>
- end
- def a() end
- @a <=> attr_reader:a
- end
- end end
-
- print Test.a => ffd