- 相關(guān)推薦
理解java和python類變量
最可怕的不是犯錯(cuò)而是一直都沒發(fā)現(xiàn)錯(cuò)誤,直到現(xiàn)在我才知道自己對(duì)類變量的理解有問題。
大概可能也許是因?yàn)椴怀S妙愖兞康脑虬,一直沒有發(fā)現(xiàn)這個(gè)問題。最近在看C++時(shí)才知道了類變量到底是什么?
以前我一直覺得類變量和成員變量的唯一區(qū)別是類變量可以通過類名直接訪問,是靜態(tài)的。而成員變量需要實(shí)例化一個(gè)類后通過實(shí)例來訪問。
萬萬沒想到忽視了類變量在一個(gè)類中只有一個(gè),各個(gè)實(shí)例中的都是同一個(gè)的,在一個(gè)實(shí)例中修改會(huì)影響其他實(shí)例中的類變量...(雖然平常也沒有因?yàn)檫@個(gè)而引起什么bug,但是還是要補(bǔ)上認(rèn)知的漏洞)。
這里有用java和python寫的2個(gè)例子:
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"; //不同實(shí)例中的類變量值/地址相同 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);//更改類變量后影響了其他實(shí)例 System.out.println(o1.m.hashCode()); System.out.println(o2.m.hashCode());//NullPointerException //成員變量具有不同的地址 }}
#!/bin/pythonclass 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()
【理解java和python類變量】相關(guān)文章:
Java常量和變量03-29
Java入門教程:常量和變量03-18
java常量和變量入門教程03-28
最新的Java容器類的深入理解04-02
java設(shè)置path環(huán)境變量04-01