理解java和python类变量以及类的成员变量
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
最可怕的不是犯错而是一直都没发现错误,直到现在我才知道自己对类变量的理解有问题。
大概可能也许是因为不常用类变量的原因吧,一直没有发现这个问题。最近在看C++时才知道了类变量到底是什么?
以前我一直觉得类变量和成员变量的唯一区别是类变量可以通过类名直接访问,是静态的。而成员变量需要实例化一个类后通过实例来访问。
万万没想到忽视了类变量在一个类中只有一个,各个实例中的都是同一个的,在一个实例中修改会影响其他实例中的类变量...(虽然平常也没有因为这个而引起什么bug,但是还是要补上认知的漏洞)。
这里有用java和python写的2个例子:
public class OO{ public static String s; public String m; static{ s = "Ever"; } public static void main(String[] args){ OO o1 = new OO(); OO o2 = new OO(); o1.m = "Once"; //不同实例中的类变量值/地址相同 System.out.println(o1.s); System.out.println(o2.s); System.out.println(o1.s.hashCode()); System.out.println(o2.s.hashCode()); o1.s = "123"; System.out.println(o2.s);//更改类变量后影响了其他实例 System.out.println(o1.m.hashCode()); System.out.println(o2.m.hashCode());//NullPointerException //成员变量具有不同的地址 } }
#!/bin/python class B: def whoami(self): print("__class__:%s,self.__class__:%s"%(__class__,self.__class__)) class C(B): count = 0 def __init__(self): super(C,self).__init__() self.num = 0 def add(self): __class__.count += 1 self.num += 1 def print(self): print("Count_Id:%s,Num_Id:%s"%(id(__class__.count),id(self.num))) print("Count:%d,Num:%d"%(__class__.count,self.num)) i1 = C() i2 = C() i1.whoami() i2.whoami() #i1的成员变量增加了1次,i2的成员变量增加了2次,类变量共增加了3次 i1.add() i2.add() i2.add() i1.print() i2.print()
以上就是本文的全部内容,明天假期就结束了,希望大家积极地投入到工作中,继续关注小编为大家分享的文章。
相关文章
spring security 5.x实现兼容多种密码的加密方式
spring security针对该功能有两种实现方式,一种是简单的使用加密来保证基于 cookie 的 token 的安全,另一种是通过数据库或其它持久化存储机制来保存生成的 token。这篇文章主要给大家介绍了关于spring security 5.x实现兼容多种密码的加密方式,需要的朋友可以参考下。2018-01-01SpringBoot+Maven 多模块项目的构建、运行、打包实战
这篇文章主要介绍了SpringBoot+Maven 多模块项目的构建、运行、打包实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05
最新评论