ruby中实例变量、类变量、实例方法、类方法区别

实例变量和类变量

1、实例变量可以理解为类属性,能被类方法访问,不能被实例方法调用不能被继承,子类中赋值不会影响父类。
2、类变量可以理解为类内的全局变量,可以在类方法和类实例方法中访问,也能被子类继承,并且子类修改之后,父类的值也会更改。

class Test
  @@class_var = 10
  @class_instance_var  = 1
  #类方法: 两种变量都可以访问
  def self.outclass_var
      p "访问类变量: #{@@class_var}"
  end
  def self.outclass_instance_var
      p "访问实例变量:#{@class_instance_var}"
  end
  #类实例方法: 不能访问类实例变量
  def outclass_var
      p "访问类变量: #{@@class_var}"
  end
  def outclass_instance_var
      p "访问实例变量:#{@class_instance_var}"
  end
end

#如果两个变量不初始化,这里就打印不出来。不知道是不是版本的问题
puts Test.class_variables #=>@@class_var
puts Test.instance_variables #=>@class_instance_var

#类变量,可以被子类共享且修改
class SubCls < Test
  @@class_var = 12
end

#可以看到现在类变量值都被修改了
Test.outclass_var #=>12
SubCls.outclass_var #=>12

#子类无法继承父类的实例变量
Test.outclass_instance_var #=>1
SubCls.outclass_instance_var #=>空

#类实例方法不能访问实例变量
Test.new.outclass_var #=>12
Test.new.outclass_instance_var #空

#再看一下子类,和父类的情况相同
SubCls.new.outclass_var #=>12
SubCls.new.outclass_instance_var #空

实例方法和类方法

1、在类方法中不能调用实例方法,只能访问和自己一样的类方法,但实例方法可以访问类方法和实例方法。

2、在类方法中不能引用[实例变量](用static修饰的变量),但实例方法可以引用成员变量和实例变量。

3、在类方法中不能使用super、this关键字。

4、类方法不能被覆盖,但实例方法可以被覆盖。

5、类方法的调用是:类名.类方法,而实例方法的调用必须new出一个对象,即:对象.实例方法。

你可能感兴趣的:(ruby中实例变量、类变量、实例方法、类方法区别)