类体中包括成员变量和局部变量,而成员变量又可以细分为实例变量和类变量,在声明成员变量的时候,用static给予修饰的称作类变量,否则称作实例变量。(类变量也称为static变量,静态变量)
那么,类变量和实例变量有什么区别呢?
我们知道,一个类通过使用new运算符可以创建多个不同的对象,这些对象将被分配不同的成员变量,说的更精确写就是:分配给不通对象实例变量咱有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量。
然而,如果类中有类变量,当使用new运算符创建多个不同的对象时,分配给这些对象的这个类变量占有相同的一出内存,改变其中一个对象的这个类变量,那么将会影响到其他对于下部分的这个类变量,也就算说不同的对象共享类变量。
既然这样,那么我要要怎么访问类变量呢?
不仅仅可以通过某个对象访问,也可以直接通过类名访问。而实例变量不同,只能用某个对象访问。
对象调用实例方法
当类的字节码文件被加载到内存是,类的实例方法不会被分配到入口地址,只有该类创建对象后,类中的实例方法才分配入口地址。从而实例方法可以被创建的任何对象调用执行。这里需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址。也就是说,方法的入口地址被所有的对象共享,当所有的对象不存在时,方法的入口地址才会被取消。
实例方法中不仅可以操作实例变量,也可以操作类变量,当对象调用实例方法时,该方法中出现的实例变量就是分配给该对象的实例变量,该方法中出现的类变量也是分配给该对象的变量,只不过这个变量和所有其他的对象共享而已。
类名调用类方法
对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址,从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用,类方法的入口地址知道程序退出了才会被取消。需要注意的是实例方法不能通过类名调用,只能由对象调用。
和实例方法不同的是,类方法不可以操作实例变量,这是因为在类创建对象之前,实例成员变量还没有分配内存。
关于设计类方法的原则
对于static方法,不必创建对象就可以用类名直接调用它(创建对象会导致类中的实例变量被分配到内存空间中)。如果一个方法不需要操作类中的任何实例变量,就可以满足程序的需要的话,就可以考虑将这样的方法设计为一个static方法。
相关文章
- 定义Person类包含两个成员变量,结构体构造方法---Java
- Object类中equals,hashCode和toString方法的学习
- Java中Object类的equals()和hashCode()方法深入解析
- JAVA中Object类 equals()方法和“==”怎样区别
- cmd命令行执行java程序的编译和执行的方法及可能出现找不到或无法加载主类的错误的解决
- 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第2节 抽象类_16-抽象方法和抽象类的使用
- JUC之Atomic系列12大类实例讲解和原理分解
- 对于Java静态成员变量和非静态成员变量的一些学习方法
- Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法
- python中的静态成员方法 和 类成员方法