`
凌川__
  • 浏览: 84039 次
  • 性别: 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  

分享到:
评论

相关推荐

    C语言程序设计-易晓梅.zip

    如Fibonacci、杨辉三角第 6 章 变量的作用与存储类别第 6 章 变量的作用与存储类别考点i++与的++i区别习题选择题1、3、4变量的存储类型static和6.3实例剖析, 6.3实例剖析第 7 章 编译预处理//todo。未做要求第 8 章 ...

    java基础知识学习教程-6对象类基础.pptx

    本课堂笔记主要讲解Java基础知识中的对象类基础,涵盖面向对象编程的基本概念、类和对象的定义、成员变量和成员方法、权限修饰符、局部变量、对象的销毁、方法的定义和重载、this关键字等内容。 6.1 接触面向对象...

    redhat linux 6.3安装oracle RAC 11g

    在Red Hat Linux 6.3 x64操作系统上部署Oracle RAC 11g是一项复杂的任务,涉及到多个步骤和配置。以下将详细讲解这个过程: ### 1. 安装前的准备 在开始安装之前,确保系统满足Oracle 11g RAC的所有硬件和软件需求...

    精易模块6.3

    - **调试工具**:包括断点设置、单步执行、变量查看等调试功能,帮助开发者定位和解决问题。 - **项目管理**:提供项目创建、管理及版本控制,便于团队协作。 - **资源管理**:内置资源编辑器,可处理图像、音频...

    FLUENT 6.3 UDF Manual

    8. **后处理和数据输出**: 用户可以利用UDF定制后处理工具,如生成自定义的输出变量、绘制特定的图形或者记录特定时刻的数据。 9. **错误处理和调试**: 手册会指导用户如何处理编译错误和运行时错误,以及如何使用...

    rhel6.3下安装oracle11.2

    4. **修改环境变量**:在`/etc/profile`文件中为Oracle用户添加特定的环境变量,例如: ```bash if [ $USER = "oracle" ]; then export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/...

    PCS7结构变量应用指南.pdf

    这类结构变量通常由两个元素构成:Value(信号的数值)和ST(信号状态)。这种固定格式的设计使得用户能够方便地获取信号的当前状态及其对应的数值。 ###### 2.1.1 信号状态用于OS显示 信号状态可以直观地在操作站...

    OOPC类成员PPT学习教案.pptx

    `this`可用于访问当前对象的成员变量,使得在成员函数中区分实例变量和局部变量成为可能。 **6.3 成员对象**是类中包含其他类的实例的情况,这允许类的复合,提高了代码的复用性。成员对象可以访问其所属类的成员,...

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

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

    C#标准规范经典

    类中的实例变量随每个实例一起创建。 **5.1.2.2 结构中的实例变量** 结构中的实例变量也随每个实例一起创建。 **5.1.3 数组元素** 数组元素是数组中存储的值。 **5.1.4 值参数** 值参数按值传递,即传递的是...

    ORACLE 11.2.0.3 RAC FOR REHL6.3(64BIT)安装文档

    - **环境变量配置**:设置 `ORACLE_HOME`, `ORACLE_SID`, `PATH` 等环境变量,确保命令行工具可正确执行。 - **关闭防火墙**:防火墙可能干扰集群间的通信,因此在所有节点上关闭。 - **配置 NTP**:时间同步是 ...

    JAVA基础知识精华总结(强烈推荐)

    - 类中的成员变量和方法应当合理设置访问级别。 - 在类定义中,如果不指定访问修饰符,默认为`package-private`,即仅在同一包下的其他类可以访问。 #### 3.2 成员变量的访问级别 - 每个成员变量只能有一个访问级别...

    CentOS6.3安装TimesTen

    在CentOS 6.3上安装TimesTen涉及一系列步骤,包括创建用户和组、设置环境变量、解压缩安装包、运行安装脚本,以及后续的配置和启动操作。确保遵循正确的步骤,并根据你的具体需求进行适当的定制。TimesTen数据库的...

    易语言变量教程,有图哦,下载不后悔

    6.3 变量的命令操作: 易语言提供了简单的赋值命令,允许程序员将值赋给变量。例如,“变量 1=100”将整数100赋给变量1。此外,还有连续赋值命令,可以一次性将多个值赋给一个或多个变量,例如“连续赋值(‘全中文全...

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

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

    java学习笔记.pdf

    - **实例变量和类变量的区别**:类变量使用static修饰,与类相关联而不是与单个对象相关联。 - **通过类名直接访问类变量**:无需创建对象即可访问。 - **实例方法和类方法的区别**:类方法也称为静态方法,使用...

    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 添加加速键 ...

Global site tag (gtag.js) - Google Analytics