理解java和python类变量以及类的成员变量
作者:Shy泠 发布时间:2023-09-14 19:42:55
标签: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";
//不同实例中的类变量值/地址相同
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()


猜你喜欢
- 上传临时文件被删除引起报错的解决1.前言在项目中使用到了SpringBoot的上传实现了一个excel导入功能,上线后稳得一批,但突然有一天
- 添加Hibernate配置文件提示 解压hibernate.jar包 在org\hibernate目录下找到hibernate-config
- java.math包提供了java中的数学类。包括基本的浮点库、复杂运算以及任意精度的数据运算提供用于执行任意精度整数算法 (BigInte
- Pull解析方法给应用程序完全的控制文档该怎么样被解析。Android中对Pull方法提供了支持的API,主要是org.xmlpull.v1
- 要点有另一种方法来完成语句映射。 它们映射的语句可以不用 XML 来配置,而可以使用 Java 注解来配置。使用注解来映射简单语句会使代码显
- String对象是不可变的:意思就是无论是对String的新增或修改,出现一个全新的String内容时,都意味着诞生了一个新的对象。但是如果
- 什么是异步调用?异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等
- 在项目开发上,hibernate提供的经验简化了不少工作量和兼容性,但这些绝对需要有经验后才能明白,对于新手来说使用起来很困难。hibern
- java执行xshell命令实例import java.io.BufferedReader;import java.io.IOExcepti
- 本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下一、SpringMVC专门提供了CommonsMu
- ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序每一个应用程序都会运行在它独立的进程里,
- 这篇文章主要介绍了Spring整合MyBatis图示过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 前言使用了flutter一段时间,越来越喜欢flutter了,flutter比我们想象中的强大。这篇文章介绍了怎么使用flutter来展示一
- 使用代码特别注意 :拼接条件时,所使用到的条件strID,strBir必须是独立的var predicate = PredicateBuil
- 引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在
- 平时开发的工作中, 自己组内的很多大佬经常使用Optional的用法, 自己问他们, 这个到底有什么好处呢,他们说可以很好的规避好空指针的问
- Flutter中的生命周期类似于Vue、React中的生命周期一样,有初始化、状态更新、停用、销毁等。在React中,组件分为函数式组件和类
- System类的常用用法1,主要获取系统的环境变量信息public static void sysProp()throws Exceptio
- 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件
- 最近接触到一个需求要求压缩导出文件,于是乎便要致力于研究一下工具类啦,故也诞生了此篇文章。下面代码中,溪源也将import导入的依赖也贴出来