理解java和python类变量以及类的成员变量_java

最可怕的不是犯错而是一直都没发现错误,直到现在我才知道自己对类变量的理解有问题。
大概可能也许是因为不常用类变量的原因吧,一直没有发现这个问题。最近在看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()

以上就是本文的全部内容,明天假期就结束了,希望大家积极地投入到工作中,继续关注小编为大家分享的文章。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, python
类变量
python 成员变量、python 类成员变量、python 静态成员变量、python class成员变量、python 类的成员变量,以便于您获取更多的相关知识。

时间: 2024-10-02 13:56:56

理解java和python类变量以及类的成员变量_java的相关文章

Java中为什么访问了父类的成员变量而不是子类成员变量?

问题描述 publicclassFather{intnumber=3;Father(){super();show();return;}voidshow(){System.out.println("Fathershow..."+number);}}publicclassSonsextendsFather{intnumber=8;Sons(){super();//此处是分水岭,父类初始化完毕以后,才能轮到子类成员变量的显示初始化System.out.println("Sons's

c++的问题-关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ?

问题描述 关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ? 在堆上的对象作为一个类的一个成员变量,我了解到的至少有三种方式(如下所示): class A{ } class B{ A* m_pA1; auto_ptrm_pA2: shared_ptrm_pA3: } B::B():m_pA1(new A)m_pA2(auto_ptr(new A))m_pA3(shared_ptr(new A)){ } 针对这三种方案,在什么情况下选择哪

c#-C#点击按钮改变类的成员变量的值

问题描述 C#点击按钮改变类的成员变量的值 我在类里面定义了一个成员变量n,想用点击按钮来改变它的值,在按钮方法里面实现了,但是再在其他方法里面将n赋给其他变量的时候却不能实现. 解决方案 肯定也是可以实现的 比如 public void Foo(int a){ this.n=a; } 你调用这个方法不可能n的值不变吧? 解决方案二: 估计是你的对象是私有的,或者你在其它方法访问的时候又创建了一个.你可以把对象定义成static形式看看. 解决方案三: 总之就是 xxxx.n = xxx 解决方

myapplication-继承自MyApplication的类的成员变量会被释放,设置为Null吗

问题描述 继承自MyApplication的类的成员变量会被释放,设置为Null吗 分析统计数据,发现APP经常由于空指针错误发生崩溃,主要使用场景是因为APP切换到后台,内存被回收. 有两个问题: 1.Android APP在模拟器开发中怎么模拟内存不足? 2.继承自MyApplication的类的成员变量会被释放,设置为Null吗? 请问怎么解决,有相关的日志吗? 解决方案 application一般保存一些全局对象,不会被释放,除非你自己释放,模拟内存不足,模拟器中(比如创建时)是可以设置

c++-MFC怎么在普通的函数中操作窗口类的成员变量

问题描述 MFC怎么在普通的函数中操作窗口类的成员变量 例如我想在函数f中操作CtestDlg类的变量e.该怎么做? 解决方案 定义一个全局变量 CtestDlg dlg 创建对话框给它赋值 e定义成public的 用dlg.e 得到变量. 解决方案二: 类的普通成员函数的指针类普通成员函数与函数的区别类成员函数与普通函数的区别 解决方案三: 给函数传入形参,用引用&实现

java多线程编程之使用Synchronized块同步变量_java

下面的代码演示了如何同步特定的类方法: 复制代码 代码如下: package mythread; public class SyncThread extends Thread{ private static String sync = ""; private String methodType = "";  private static void method(String s) {  synchronized (sync)  {sync = s;System.ou

【Java】java使用反射访问对象方法和成员变量

虽然java是一门静态语言,但是java的反射机制却给java提供了很强大的动态特性,其特点是能让java支持在运行时才能得知名称与内部结构的类,并能访问其所有的方法和成员变量,包括私有方法和私有成员变量.下面我写了一个比较简洁的测试代码,供参考和使用. 测试类 //OBClass.java package com.obo.javaassistdemo; public class OBClass { public int publicField= 999; private int private

C++:类的成员变量 声明顺序 与 初始化顺序 相同

类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行; 否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量; 同时GCC, 也会发出警告, 如: 'class::m_xxx' will be initialized after [-Wreorder] 代码: /* * BInsertSort.cpp * * Created on: 2014年4月15日 * Author: Spike */ #include <ios

关于将socket对象作为单例类的成员变量

问题描述 业务场景:1.系统在初始化时创建Socket对象(客户端)2.将创建的Socket对象作为系统全局变量,共其他方法使用.我的实现思路方法大致如下://系统初始化类publicclassInitialize{publicvoidinit(){Socketsocket=newSocket(ipAddress,port);//创建socket连接SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();//将socket交由单