糯米文學吧

位置:首頁 > 計算機 > java語言

理解java和python類變數

java語言1.94W

最可怕的不是犯錯而是一直都沒發現錯誤,直到現在我才知道自己對類變數的理解有問題。

理解java和python類變數

大概可能也許是因為不常用類變數的原因吧,一直沒有發現這個問題。最近在看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"; //不同例項中的類變數值/地址相同 tln(o1.s); tln(o2.s); tln(Code()); tln(Code()); o1.s = "123"; tln(o2.s);//更改類變數後影響了其他例項 tln(Code()); tln(Code());//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__() = 0 def add(self): __class__t += 1 += 1 def print(self): print("Count_Id:%s,Num_Id:%s"%(id(__class__t),id())) print("Count:%d,Num:%d"%(__class__t,))i1 = C()i2 = C()mi()mi()#i1的成員變數增加了1次,i2的成員變數增加了2次,類變數共增加了3次()()()t()t()

標籤:JAVA Python 變數