`
凌川__
  • 浏览: 82269 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

6.3 实例变量、类变量、类方法

阅读更多
学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例外,这一节,我们继续深化理解变量。
先把 Ruby 放在一边,从编程语言的视角来探讨变量。
如果一个变量,第一次赋值后,就不再允许改变变量值,这样的变量称之为常变量,简称常量。就像数学分析中的常函数,y = 3 是一个平行于 x 轴,并且函数值总是为 3 的函数。常量名用大写字母开头。
如果一个变量,在其作用域上的每一个执行点,都可以改变变量值,这样的变量称之为可变量,简称变量。
如果一个变量,其作用域遍及在程序的任何位置,这样的变量称之为全局变量;与之相对,作用域仅限于在程序的某一单元的变量,称之为局部变量。
面向对象的编程,以类为单元模块。类是设计蓝图,具体的事物是实例对象。前面 5.3 节说到:“变量名,变量值,变量类型,变量的作用域,是我们学习命令式语言不可回避的几个要素”。对于面向过程的命令式语言,这四个要素已经够了;对于面向对象的命令式语言,还要加上变量的第五个要素——共享性。
如果一个变量,只能被某个实例对象使用,这样的变量称之为实例变量;如果一个变量,能被某个类的所有实例对象共享,这样的变量称之为类变量。
回到 Ruby 。常量可以定义在类和模块中,不能定义在方法中。如果在外部访问类或模块中的常量,要使用域作用符:: 。
全局变量用$ 开头。
实例变量,变量名用@ 开头;类变量,变量名用@@ 开头。
Ruby中所说的局部变量,可以是存在于类中、方法中、模块中、一个循环中、一个过程对象中。局部变量名用小写字母开头。
在4.3节,我们使用的@name(姓名)、@age(年龄)、@motherland(国籍),都是实例变量,被每个实例独享。程序 E4.3-1.rb 中,实例 p1与实例 p2的姓名不一样,年龄也不一样。
如果我们希望一类事物共享某个变量,比如:在 4.4节 Student 类中,需要有一个变量来代表班级人数,实例 p3与实例 p4假使在一个班级里,班级人数这个属性应该是相同的,当然,随着 Student 类的实例不断生成,班级人数也要不断增加,如何解决呢?
类变量能够很好地实现这个需求,看程序 E6.3-1.rb:
#E6.3-1.rb 
class StudentClass 
  @@count=0

  def initialize( name )
    @name = name
    @@count+=1
  end   
 
  def talk
    puts "I am #@name, This class have #@@count students."
  end  
end

p1=StudentClass.new("Student 1 ")
p2=StudentClass.new("Student 2 ")
p3=StudentClass.new("Student 3 ")
p4=StudentClass.new("Student 4 ")
p3.talk         # =>  I am Student 3 , This class have 4 students.
p4.talk         # =>  I am Student 4 , This class have 4 students.

与全局变量和实例变量不同,类变量在使用前必须要初始化;全局变量和实例变量如果没有初始化,其值为 nil 。
如果教务主任想知道某个班级现在有多少人数,不需要到这个班级去问学生,应该可以通过其它途径来获取信息。这里要用到类方法——不依赖于任何特定实例对象的方法。类方法与实例方法的定义方式不同,定义类方法要在方法名前加上类名和一个点号“.”。看程序 E6.3-2.rb:
#E6.3-2.rb  
class StudentClass 
  @@count=0  

  def initialize
    @@count+=1
  end    

  def  StudentClass.student_count
    puts "This class have #@@count students."
  end  
end

p1=StudentClass.new
p2=StudentClass.new
StudentClass.student_count   # =>  This class have 2 students.

p3=StudentClass.new
p4=StudentClass.new
StudentClass.student_count   # =>  This class have 4 students.

调用一个类方法,与定义类方法一样,要在方法名前加上类名和一个点号“.”。类方法提供了一个途径,在类的外部访问类变量,无须通过类的实例方法。
类变量,类方法在 Java 里与之相对应的是 static变量,static方法。
在Java里,你写一个类,是在画设计图纸,当你 new 的时候,才生成一个实例对象。Ruby语言中,一切都是对象,单个实例(具体事物)是对象,类(蓝图)也是对象。你拿着设计图纸可以生产出很多汽车,而设计图纸对于纸来说,只是纸这类事物的一个具体实例。 Ruby里,有元类的概念,通过关键字self 与类方法的灵活使用,程序代码可以产生很多变化,这里不再展开叙述。可以思考用类方法来实现《设计模式》一书中的单子模式。


完整阅读,请看我写的 Ruby语言中文教程all in one  

分享到:
评论

相关推荐

    Objective-C2.0程序设计

    3.7 实例变量的访问以及数据封装 3.8 小结 3.9 练习 第4章 数据类型和表达式 4.1 数据类型和常量 4.1.1 int类型 4.1.2 float类型 4.1.3 double类型 4.1.4 char类型 4.1.5 限定词:long、long long、short、unsigned...

    delphi部件开发

    2.3.2 TPersstent类方法及其功能描述 2.4 TComponent类属性和方法 2.4.1 TComponent概述 2.4.2 TCOmponent属性 2.4.3 TComponent方法 2.5 TControl类属性、方法及事件 2.5.1 TControl类概述 2.5.2 TContTol类属性 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

     《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发...

    c#4.0语言规范

    1.6.6.3 静态方法和实例方法 17 1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

     《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发...

    Flex新手教程_入门级学习笔记

    1.8实例方法,实例变量和静态方法,静态变量 4 1.9接口 Interface 4 1.10继承 Inheritance 5 2.ActionScript3.0常用类 6 2.1内容现实类 6 2.2 String 6 2.3 Array类 8 2.4 XML和E4X 9 2.5 事件处理 Event 12 2.6异常和...

    Visual C++ 6.0编程实例详解.part2

    第5章 文档类和视类 5.1 文档类 5.2 文档模板类 5.3 视类 5.4 文档/视结构 5.5 菜单和加速键 5.5.1 菜单 5.5.2 添加消息处理函数 5.5.3 CMenu类 5.5.4 创建快捷菜单 5.5.5 添加加速键 ...

    Visual C++ 6.0编程实例详解.part1

    第5章 文档类和视类 5.1 文档类 5.2 文档模板类 5.3 视类 5.4 文档/视结构 5.5 菜单和加速键 5.5.1 菜单 5.5.2 添加消息处理函数 5.5.3 CMenu类 5.5.4 创建快捷菜单 5.5.5 添加加速键 ...

    ios应用开发文档详解丛书事例

    4.3 实例变量、实例方法、类方法 26 4.4 类的实例化及方法的调用 27 4.5 类的初始化 29 4.6 属性 30 第5章 Objective-C中的数据类型 32 5.1 整型 32 5.2 浮点类型 33 5.3 字符型(char) 34 5.4 布尔类型 35 5.5 ...

    C#语法全解

    1.6.5.3 静态方法和实例方法 16 1.6.5.4 虚方法、重写方法和抽象方法 17 1.6.5.5 方法重载 19 1.6.6 其他函数成员 20 1.6.6.1 构造函数 21 1.6.6.2 属性 21 1.6.6.3 索引器 22 1.6.6.4 事件 22 1.6.6.5 运算符 23 ...

    Activiti5.13用户手册.zip

    15.87. 更新一个二进制的流程实例变量 - 响应码 15.88. 获取一个分支 - URL参数 15.89. 获取一个分支 - 响应码 15.90. 对分支执行操作 - URL参数 15.91. 对分支执行操作 - 响应码 15.92. 获得一个分支的所有...

    突破程序员基本功的16课.part2

    2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象的实例变量 2.2.3 调用被子类重写的方法 2.3 父子实例的...

    Java编程艺术 PDF

    8.6.3 Graphs类的final变量和实例变量 241 8.6.4 Graphs类的构造函数 242 8.6.5 paint()方法 244 8.6.6 bargraph()方法 247 8.6.7 scatter()方法 247 8.6.8 regplot()方法 248 8.7 一个统计表的应用 248 8.7.1 ...

    java 编程艺术

    8.6.3 Graphs类的final变量和实例变量 241 8.6.4 Graphs类的构造函数 242 8.6.5 paint()方法 244 8.6.6 bargraph()方法 247 8.6.7 scatter()方法 247 8.6.8 regplot()方法 248 8.7 一个统计表的应用 248 ...

    java编程基础,应用与实例

    5.6 静态变量与静态方法 70 5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固...

    javaSE代码实例

    6.3 成员变量 81 6.3.1 成员变量的开发与使用 81 6.3.2 成员变量的初始值 82 6.3.3 对象引用变量的比较 84 6.4 方法 85 6.5 变长参数 86 6.6 引用问题 87 6.6.1 调用不存在的方法或成员变量 87 ...

Global site tag (gtag.js) - Google Analytics