赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
是实例变量~
所谓实例变量就是属于一个具体对象的变量,比如张三的体重,李四的体重,王五的体重,这些都可以说是定义在 Person (人)类中的实例变量,因为每个人的实例都有自己的一份体重变量(张三可能只有六十斤,李四却可能有八十斤)~
实例变量听起来可能很抽象,但把它看作一个对象的属性可能就比较容易理解了,名字、DNA、三围、血压这些都是属于一个具体的人的属性
这段脚本中就定义了一个类,类的名字叫人,于是我们把它称作“人”类……
但这样仅仅是一个抽象的空框架,它现在没有任何属性,即便实例化之后该对象也没有任何意义 =(
我们之所以要设计一个类,是因为我们经常反复用到一些抽象数据的实例,这些实例之间共享一些相同的特性,比如是“人”都应该有一个名字,于是我们在这个类中定义一个实例变量 @name,用来保存每个具体的人的名字~
但这里有个问题——任何实例变量或者类变量的访问权限都是私有的,所以在类的外部无法直接访问。如果我们要想在类的外部访问这个实例变量,就需要定义一个公有访问权限的方法来获取和修改这个属性。所以这里在“人”类中定义了两个方法,一个用来获取 @name(def name),一个用来修改 @name(def name=)
name 方法的内容很简单,直接 return 把 @name 的值返回给调用者,所以当用“人”类的一个对象直接调用 name 方法时,该方法就能够把 @name 这个实例变量返回给调用者使用;name= 这个方法则是把 @name 的值赋为调用者传递给 name= 的参数(括号中的 name,可以看作一个临时/局部变量)……这种方法名称的定义是 Ruby 的特性之一,虽然方法名是 “name=”,但实际上在调用时等号“=”左右可以包含空格符,而后面的参数括号也是可以省略的,所以调用的时候 obj.name = "张三" 这种形式看起来像是在直接操作一个属于 obj 的属性 name,但实际上是利用了 name= 函数来操作内部的 @name 变量~
最后,在“人”类中还定义了一个方法 Hello,我们可以把它看作一个行为,这个行为就是普通“人”都应该会的一个行为——自我介绍~
这个行为会输出一段文字,让别人知道这个“人”的实例的名字,如果之前用 name= 给 @name 赋了一个 "张三",这里就会输出“我是张三”,因为在赋值的时候 "张三" 被保存到了实例变量 @name 中,而 hello 方法又把这个变量的内容打印了出来~
到此为止一个“人”类的最基本的属性和行为(名字和自我介绍)就定义完毕了,下面三行就是实际生成一个名字叫艾力克斯的“人”的对象:alex = Person.new
alex.name = "艾力克斯"
alex.hello 首先调用了类的一个静态方法 new,实例化一个“人”的对象,并把这个对象的地址保存在了一个局部引用变量 alex 中;
之后就可以通过 alex 这个引用变量来访问之前生成的这个“人”的对象,于是我们调用 name= 方法给这个人起了个名字“艾力克斯”;
名字起了,这个人还能干啥呢?哦,他还会打招呼,那我们就让他打招呼吧:“小伙子,自我介绍下~”于是调用“他”的 hello 方法,输出了一段文字:“我是艾力克斯”……
…… 版主对此帖的认可:『辛苦你了,请再接再厉...』,积分『+350』。 系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~ |
|