静态变量与非静态变量的区别

2023-11-03

静态变量的类型说明符是static,非静态变量反而类型说明符就不是static了。本文主要介绍静态和非静态变量的区别,希望对你有帮助,一起来看。

AD:

静态变量:静态变量使用 static 修饰符进行声明在所属类被装载时创建通过类进行访问所属类的所有实例的同一静态变量都是同一个值非静态变量:不带有 static 修饰符声明的变量称做非静态变量在类被实例化时创建通过对象进行访问同一个类的不同实例的同一非静态变量可以是不同的值。

对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。

下面介绍静态变量与非静态变量的区别如下:

1.内存分配

静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;而非静态变量需要被实例化后才会分配内存。

2.生存周期

静态变量生存周期为应用程序的存在周期;非静态变量的存在周期取决于实例化的类的存在周期。

3.调用方式

静态变量只能通过“类.静态变量名”调用,类的实例不能调用;非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。

4.共享方式

静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
非静态变量是局部变量,不共享的。

5.访问方式

静态成员不能访问非静态成员;非静态成员可以访问静态成员。

静态变量在类装载的时候分配内存,以后创建的对象都使用的该内存,相应的操作也就是对这块内存进行操作。也可以看作是另类的全局变量。

在WebSerivice中想只进行一次初始化,而不用每次都进行初始化这样占用大量资源。还可以对调用的服务进行管理,比如想把每次调用的服务进行排队执行,可以将想应信息放到Arraylist中,静态时钟中排队执行。

C#静态构造函数及静态变量

静态构造函数:

(1)用于对静态字段、只读字段等的初始化。              

(2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。        

(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数

(4)静态构造函数是不可继承的,而且不能被直接调用。            

(5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。    

(6)任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。  

(7)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。

经典例子:

 
 
  1. /*  
  2. * 静 态 构 造 函 数 练 习  
  3. * (1)①②③……为执行顺序  
  4. * (2)输出结果: static A()  
  5. * static B()  
  6. * X = 1, Y = 2  
  7. */ 
  8. using System;  
  9. class A  
  10. {  
  11. public static int X;  
  12. static A() //④ 执行完后返回到③  
  13. {  
  14. X = B.Y + 1;  
  15. Console.WriteLine("static A()");  
  16. }  
  17. }  
  18. class B  
  19. {  
  20. public static int Y = A.X + 1; //③ 调用了A的静态成员,  
  21. // 转到A的静态构造函数---->  
  22. static B() //② 如果带有初始值设定项的静态字段,  
  23. // 执行该类的静态构造函数时,  
  24. // 先要按照文本顺序执行那些初始值设定项。  
  25. // 转到初始值设定项---->  
  26. {  
  27. Console.WriteLine("static B()");  
  28. }  
  29. static void Main() //① 程序入口,  
  30. // 如果类中包含用来开始执行的 Main 方法,  
  31. // 该类的静态构造函数将在调用 Main 方法之前执行。  
  32. // 转到B的静态构造函数---->  
  33. {  
  34. Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果  
  35. Console.ReadLine();  
  36. }  

关于C#静态构造函数的几点说明:

静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。

 
 
  1. class SimpleClass  
  2. {  
  3. // Static constructor  
  4. static SimpleClass()  
  5. {  
  6. //  
  7. }  

在使用静态构造函数的时候应该注意几点:

1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。

2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

3、一个类只能有一个静态构造函数。

4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

5、最多只运行一次。

6、静态构造函数不可以被继承。

7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态变量与非静态变量的区别 的相关文章

随机推荐

  • 线上CPU飙升排查

    背景 cpu idle下降50 full gc触发线上报警 处理 1 top命令 查看所有进程占用CPU的排序 第一个就是我们的java服务进程 或者jps命令直接查看java服务进程 2 top Hp 46845 查看进程下所有线程占用C
  • 区块链入门之windows 安装以太坊 ethereum 客户端 (win7-64)

    以太坊 Ethereum 是一个运行智能合约的去中心化平台 Platform for Smart Contract 平台上的应用按程序设定运行 不存在停机 审查 欺诈 第三方人为干预的可能 以太坊平台由 Golang C Python 等多
  • Tomcat部署服务器添加多个<Host>就加载多次项目问题《解决方案》

    如题 项目部署到阿里云服务器之后 配置tomcat一个域名同时又可以使用IP直接访问项目 配置是如下
  • vue-router详解 - 从使用到扩展

    1 认识路由 1 1 后端路由 早期的网站开发整个HTML页面是由服务器来渲染的 服务器直接生产渲染好对应的HTML页面 返回给客户端进行展示 但是 一个网站 这么多页面服务器如何处理呢 一个页面有自己对应的网址 也就是URL URL会发送
  • Pychram:踩坑记录/窍门分享

    Debug Console 当使用PyCharm的Debug模式时 最好用的莫过于Debug Console 它与断点相配合可以实现类似于Jupyter Notebook的逐块运行代码的效果 但是今天我突然发现Debug Console无法
  • 用户体验式UI设计

    用户体验式UI设计 1 什么是用户体验式设计 产品的业务化和易用性始终是我们追求的目标 随着 Net Framework 3 0的推出 Windows Presentation Foundation WPF 组件库把用户UI
  • openGL之API学习(三十七)如何从FBO中读取颜色、深度信息

    方法一 保存成图片 QImage img new QImage WINDOW WIDTH WINDOW HEIGHT QImage Format ARGB32 uchar tmpBIT img gt bits 从颜色缓冲区中读取数据 int
  • C++整型(short,int,long,longlong)

    C 整型数据类型 整型就是没有小数部分的 C 基本整型有char short int long long long 由于char 类型比较特殊 下面只关于char int long long long 1 整型short int long
  • 使用verilog实现4选1数据选择器的几种方法

    第一种方法module mux d1 d2 d3 d4 se1 se2 dout input d1 input d2 input d3 input d4 input se1 input se2 output dout reg dout al
  • 一目了然凉哥为大家倾力打造的付费专栏

    写在前面 大家好 我是几何心凉 欢迎来到我的付费专栏系列 本专栏将深入介绍 Vue 3 和 Vite 以及如何在 TypeScript 的帮助下构建现代化的 Web 应用程序 Vue 是一个流行的 JavaScript 框架 它允许开发人员
  • 【AntDesign】图片自定义上传组件 超详细含代码及解读~

    技术栈 AntDesign 版本 3x 效果图如下 官网示例给的是标准上传模式 此处用的是自定义上传模式 customRequest 代码 子组件代码 import React useState useImperativeHandle fr
  • 初识微服务框架ServiceComb

    https blog csdn net zengdongwen article details 93486257 后续跟进学习 转载于 https www cnblogs com chaojizhengui p 11586398 html
  • C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性

    问题 字段初始值设定项无法引用非静态字段 方法或属性的问题 下面代码出错的原因 在类中定义的字段为什么不能用 public class Test public Test public int Age 23 public int temp A
  • 隐马尔科夫模型 (HMM) 算法介绍及代码实现

    Table of Contents Hidden Markov Model 隐马尔科夫模型 定义 基本问题 前向算法 算法流程 实现代码 后向算法 算法流程 实现代码 Viterbi算法 算法流程 实现代码 Baum Welch 算法 单观
  • 网络布线的基础知识

    目录 网络布线的基础知识 1 信号 1 1什么是信号 1 2信号的分类 1 3数字信号的优势 2 双绞线 2 1双绞线 2 2双绞线标准与分类 3 光纤概述 3 1光纤的特点 3 2光纤分类 3 3光纤的优点 4 传输介质的连接与布线 4
  • 各种代理IP背后的原理

    讲解各种代理IP背后的原理 知道代理IP的人越来越多了 不管是单纯的换IP 还是进行大量的数据采集 或者是游走于灰色之中 都是离不开代理IP这个工具的 但是很少人会关注各种代理IP背后的原理 今天就听小编来给大家普及下吧 一 代理类型代理I
  • Python 数组教程 – 定义、索引、方法

    在本文中 您将学习如何使用 Python 数组 您将了解如何定义它们以及对它们执行操作常用的不同方法 本文介绍了您通过导入array module 我们不会在这里讨论 NumPy 数组 目录 什么是 Python 数组 Python 列表和
  • 【单目标优化算法】杂草优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 杂草算法代码简单 易于实现 具有较强的自适
  • postman系列-使用变量

    事先声明 以下内容 均来自于postman官网 仅做学习会用 侵删 如果想系统的学习postman 也推荐官网直接学习 谢谢 作用 在请求中和脚本中 使用变量可以存储值和重用值 将值存储在变量中 就可以在collections enviro
  • 静态变量与非静态变量的区别

    静态变量的类型说明符是static 非静态变量反而类型说明符就不是static了 本文主要介绍静态和非静态变量的区别 希望对你有帮助 一起来看 AD 静态变量 静态变量使用 static 修饰符进行声明在所属类被装载时创建通过类进行访问所属