对static静态成员的理解

一直乱跑的熊 一直乱跑的熊     2022-08-01     679

关键词:

疑惑:

数据成员可以分静态变量、非静态变量两种. 
 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.
 
 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..
 
 一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..
 
 对于winApp来说,静态成员对于程序员本身省了很多事,而且因为静态成员驻留内存,在方法与方法之间传递共享数据的时候,所以静态成员成了我的首选..但是不要因为方便,大量使用,尤其是在内存紧张或者
 用静态方法操作一些共享值的时候.或者要写多用户系统的时候,要慎之又慎.比如:
 static int id = 0;
 sql = "select * from table where id=" + id;
 
 如果这样写的话,在单机测试的时候没有问题,但是在多人同时对数据进行测试的时候,就会有问题了.假如,A用户访问他的id是20,则id的值在内存中为20,而此时B用户访问,他的id是30,则id在内存中的值是30..A用户的id值则被更改了..如果此时你将这个方法用非静态成员来写,则不会出现这样的情况..因为非静态成员是你声明的时候,实例化的时候才会分配内存..所以A用户访问的时候,App会因为A实例化而给A用户的请求分配内存..而B用户访问的时候也一样会因为B用户的访问而分配内存..所以两个用户访问的是不同的内存块..所以不会出现数据覆盖和错乱的现象...
 
我想这样的情况应该能很好的说明静态变量和非静态成员的区别..
  
相对于webApp而言,在winApp下使用static的时候要比webApp下考虑的因素要少的多,因为webApp本来就是一个多用户的系统,所以使用static的时候更应该小心..

而我对static在webApp下的使用存在一个疑问,如果一个静态方法,例如:

static string aa(string str){
 //经过一系列操作..
 return str;
}

或者返回一个DataSet的静态方法
static DataSet aa(string str){
 //经过一系列操作..
 return DataSet;
}

这个时候,在访问量大的时候,程序出现了并发,会不会发生错乱??我以前的项目使用的公用函数类中使用了大量的静态方法,不过好在访问量不大,一直没有问题..在发这个文章之前,我查找了MSDN,CSDN,搜索了一些关于静态成员的文章,但是都没有一个明确的说明..虽然,自己在项目中也测试了这么长时间也没有问题..但是总觉得有这个可能发生..

不知道大家是否在项目中碰到类似的疑惑呢??请有过这方面经验的朋友指教..


答案:
不说是否滥用,如果你出现冲突,说明你没有理解静态成员变量和静态方法的区别,静态方法本身只是一段代码,不管怎么调用他都不会出现问题。但静态成员变量就不行了,他被所有用户共享,如果一个用户改变了他,肯定会影响到别人,这就是常说的并发冲突问题,一般来说在修改共享成员变量时要lock! 


关于静态方法和实例方法的一些误区。 

一、    静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
 
    事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
 
 
二、    静态方法在堆上分配内存,实例方法在堆栈上。
 
    事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
 
 
三、    实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单。
    事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可。
    有些方法看似与所在的实例无关,如IComparer.Compare方法,但实际上每一个实现这个接口的类都只会负责自己类型实例的比较,这是C#1.x规范中没有泛型所带来的历史遗留问题。
    大部分静态方法是与类的实例有关的,如各种Parse方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。

javastatic深入理解

static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它... 查看详情

static详谈

Static静态代码块:static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。静态成员变量:静态成员变量对所有对象所共享的,在内存中只... 查看详情

对象创建static关键字静态变量和成员变量的区别文档

1.对象创建??Students=newStudent();??步骤:????(1)加载Student。class文件进内存;????(2)在栈内存中为s开辟空间;????(3)在堆内存为学生对象开辟空间;????(4)对学生对象的成员变量进行默认初始化;????(5)对学生对象的成... 查看详情

java中static作用详解

有要详解,那我找资料给你吧static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。... 查看详情

c语言中static是做啥用的?

...外定义变量不是也可以整个程序通用么?有两种用法:1、static修饰局部变量,成为一个局部静态变量。static修饰局部变量(静态局部变量)与普通局部变量相比,它的优势在于:①静态局部变量作用域与连接属性与普通局部变量一... 查看详情

c++static静态变量&静态成员函数

  静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。   静态成员的值对所有的... 查看详情

java中static作用是啥?

参考技术Astatic表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它... 查看详情

static与final修饰符

static被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可... 查看详情

java中static关键字的意义

它的意义是什么?我只知道static定义了一个变量,它能在整个程序中使用。请高手们举个简单点的例子,最好形象点。我是菜鸟上述代码块运行的结果为:上述代码块运行的结果为:1.static关键字:静态的意思。可以修饰成员变量... 查看详情

static不能与this,super并存的理解(java)

众所周知,static静态的,不变的在java中static修饰成员属性,方法时,表示该属性/方法可以被类名直接调用,如工具类等而this代表本类对象的引用,通常用与成员变量与局部变量重名时。super代表子类对父类满参构造函数的初始... 查看详情

8_对象创建static关键字静态变量和成员变量的区别文档

...生对象初始化完毕,把对象地址赋值给s变量。 二、static关键字1、特点:(1)随着类的加载而加载;(2)优先于对象存在;(3)被类的所有对象共享;(4)可以通过类名直接调用。2、注意事项:(1)在静态方法中没有this... 查看详情

java啥是类和对象的静态属性

所谓静态属性,就是用static修饰的变量,例如:publicstaticStringtest="测试字符串";这种属性访问时只能是:类名.变量名--它不能用对象访问另外,类中的方法也可以声明为static(静态的),访问规则一样凡是用static声明的成... 查看详情

浅谈static

A:使用场景  static可以修饰成员变量和成员方法。   什么时候使用static修饰成员变量?  加static修饰成员的时候,这个成员会被类的所有对象所共享。一般我们把共性数据定义为静态的变量  什么时候使用static修饰成员... 查看详情

java中static与private的用法

1:详叙java中static和private的用法?2:static变量能不能是private变量?(希望举例说明下)  private是访问权限修饰符,用于控制外界对类内部成员的访问,表明对象成员是完全私有的,不容许外界的任何访问。  static是静态成... 查看详情

static静态数据成员

类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:1.C++静态数据成员的定义。&... 查看详情

java中static与private的用法

参考技术Astatic修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量;一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。如果一个成员变量是static... 查看详情

static关键字静态代码块

1、static关键字(1)使用static关键字修饰的内容,不再属于对象自己,而是属于类的,凡是本类的对象,都共享同一份;(2)无论是成员变量还是成员方法,如果用static修饰,在其他类访问时,推荐使用类名称进行调用;(静态... 查看详情

深入理解c#静态类与非静态类静态成员的区别

...用new关键字创建静态类类型的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,它防止在类的内部声明任何实例字段或方法。静态类是自C#2.0才引入的,C#1.0不... 查看详情