博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
static修饰的静态变量与实例变量的区别,及其在初始化和内存中的运行机制详解...
阅读量:5272 次
发布时间:2019-06-14

本文共 1642 字,大约阅读时间需要 5 分钟。

1. 静态变量的定义

静态变量Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。

说明:静态变量(用static修饰),它所被分配的空间是一直伴随程序运行的,空间将会保持到程序的结束关闭,才会被释放。

2.用static修饰的静态变量与普通变量的区别

假若在定义一个类的过程中,定义了一个static修饰的变量,那么这个类在被加载的同时,被static修饰的变量就存在于内存当中了,这样一来就独立于该类的所有对象,被该类所有对象共享,将对象相关的变成了类相关,基于此静态变量也可以称之为类变量。

static方法的一个重要中法就是在不创建任何对象的前提下就可以调用它(使用域名调用法直接调用)

代码说明:

class Person

{
     // 定义一个实例变量
     public String name;
     // 定义一个类变量
     public static int eyeNum;
}
public class PersonTest
{
     public static void main(String[] args)
     {
         Person p1 = new Person();
         Person p2 = new Person();
         p1.name = "王";
         p2.name = "向";
         p1.eyeNum = 2;
         p2.eyeNum = 3;
         System.out.println("p1变量的name变量值是:" + p1.name
             + " p1对象的eyeNum变量值是:" + p1.eyeNum);
         System.out.println("p2变量的name变量值是:" + p2.name
             + " p2对象的eyeNum变量值是:" + p2.eyeNum);
     }
}

运行结果:

分析:

在此程序中,我们将eyeNum定义为静态变量(即类变量),而name定义为普通的实例变量。

当运行Person p1 = new Person()时,代码第一次使用Person类,因此需要加载这个Person类,在类准备阶段,系统将会为该类的类变量分配内存空间,并对其指定初始值。Person初始化完成后,系统将在对内存中为Person类分配一块内存区域。

系统接着创建Person对象,并将Person对象赋值给p1变量,在此时,Person对象里会包含名为name的实例变量,并对其指定初始值。在此,可以看出eyeNum并不属于Person对象,而是属于Person类。

接着执行Person p2 = new Person(),代码创建第二个Person对象,因为在第一次创建Person时,已经对Person进行了初始化,Person已经存在于对内存中了,因此,在此创建时,不需要再次进行初始化操作,创建过程同p1,在此不做示意图解释。

当执行该段代码时

        p1.name = "王";

         p2.name = "向";

系统会向p1和p2所指向的实例变量分别赋值。

        p1.eyeNum = 2;

         p2.eyeNum = 3;

当执行到p1.eyeNum = 2 时,将2赋值给类变量eyeNum,当执行到p2.eyeNum = 3时,又将变量3赋值给eyeNum,由于eyeNum静态变量对该类所有对象共享的,因此在执行p2.eyeNum = 3时,会将之前的eyeNum值进行覆盖,因此,输出p1.eyeNum和p2.eyeNum两个值的时候,都会显示最后的赋值结果3.

 

 

引用static变量的两种方法:

1. 可以通过对象去定位它:如  p1.eyeNum;

2. 可以通过其域名直接引用:如 Person.eyeNum; (首选方法)

注意:静态方法的使用和相应机制与静态变量相同,在此不在解释

转载于:https://www.cnblogs.com/Leo-Xia/p/10291180.html

你可能感兴趣的文章
用Java编写自己的机器人,为你承担苦力
查看>>
第四章App4_3,懂得了抛出异常 throws Exception,read为读取键盘输入数,学会了switch循环...
查看>>
从零开始——MySql01
查看>>
基于线程池的线程管理(BlockingQueue生产者消费者方式)实例
查看>>
sqlmap
查看>>
给出随机存储器(RAM)和只读存储器(ROM)的差别
查看>>
CSS3 3D Transform
查看>>
js深拷贝
查看>>
http和socket之长连接和短连接区别(转)
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>
C++11 中的线程、锁和条件变量
查看>>
HDU 2485 Destroying the bus stations(!最大流∩!费用流∩搜索)
查看>>
Oracle关于用户信息的一些SQL语句
查看>>
2019-02-28处理公司同事无法上网事件记录
查看>>
cookie的过期时间
查看>>
HTCVive使用
查看>>
Javascript 浏览器检测
查看>>
Java程序员常用工具类库
查看>>
头文件有h和没有h的区别
查看>>