实例变量和类变量
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出一个对象,即:对象.实例方法。
网友评论