理解java和python類變量以及類的成員變量
最可怕的不是犯錯而是一直都沒發(fā)現(xiàn)錯誤,直到現(xiàn)在我才知道自己對類變量的理解有問題。
大概可能也許是因為不常用類變量的原因吧,一直沒有發(fā)現(xiàn)這個問題。最近在看C++時才知道了類變量到底是什么?
以前我一直覺得類變量和成員變量的唯一區(qū)別是類變量可以通過類名直接訪問,是靜態(tài)的。而成員變量需要實例化一個類后通過實例來訪問。
萬萬沒想到忽視了類變量在一個類中只有一個,各個實例中的都是同一個的,在一個實例中修改會影響其他實例中的類變量...(雖然平常也沒有因為這個而引起什么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()
以上就是本文的全部內容,明天假期就結束了,希望大家積極地投入到工作中,繼續(xù)關注小編為大家分享的文章。
相關文章
Java如何使用multipartFile對象解析Execl
本文介紹了如何使用Spring的MultipartFile類解析Excel文件(.xls和.xlsx),包括文件上傳、數(shù)據校驗、輸入流獲取、文件解析、數(shù)據保存和異常處理的詳細步驟2025-02-02
Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)
這篇文章主要為大家介紹了Java?C++題解leetcode801使序列遞增的最小交換次數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

