对static静态成员的理解

疑惑:

数据成员可以分静态变量、非静态变量两种. 
 静态成员:静态类中的成员加入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方法,他做成静态的原因是他没有实例作为参数。其他的大多是出于语义或者其他目的的考虑。

时间: 2024-10-12 23:46:26

对static静态成员的理解的相关文章

C++学习10 static静态成员变量和静态成员函数

一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际开发中很少使用全局变量. 如果想在同类的多

java中static关键字的理解(转载)

static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin05

关于Abstract,static,final的理解

Abstract,static,final理解 一 . Abstract 抽象 1> 修饰类 一个类被Abstract修饰之后,就不能new对象了,修饰父类 被Abstract修饰的说明是一个不是一个具体的类型,是一个类别,是一个父类,不应该被具体化 说明这个类不完整,不够具体,抽象类无法独立存在 为子类输出共性 作用: 1> 可以被子类继承,提供共性属性和方法 2> 可声明为引用,强制使用多态 3> 抽象父类可以是子类的组成部分,依附于子类对象的存在 4> 由父类共性+子类

Coding之路——重新学习C++(2):static的详细理解

一.C中的static关键字 1. static 局部变量 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量 在函数内定义它的生存期为 整个程序生命周期,但是其 作用域仍与 自动变量相同 ,只能在定义该变量的函数内使用该变量.退出该函数后,尽管该变量还继续存在,但不能使用它.(2)对基本类型的静态局部变量若在声明时未赋以初值,则系统自动赋予0值 .而对自动变量不赋初值,则其值是不定的. 根据静态局部变量的特点,可以看出它是一种生存期为整个程序生命周期.虽然离开定义它的函数后不能

static静态成员

一.静态数据成员 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态数据成员还具有以下特点: 1.静态数据成员的初始化 静态数据成员实际上是类域成员,在类内定义,类外初始化.类被可以定义常量静态变量,不能定义非常量静态变量. 1 #include <iostream> 2 class S{ 3 public: 4 static int static_i;

对static的再次理解

随着做技术工作的不断深入,能在常见的语法和对象使用中获取更深的理解,我想,这大概就是孔老夫子说的"温故而知新"吧. 言归正传,java中的static大概分4中用法吧(漏掉的请大神在评论补充). 修饰成员变量和成员方法.这应该是对static的最初印象. 修饰代码块.这大概是在开始做项目的时候就会遇到.栗子就不举了. 修饰内部类. 静态导入.import static静态导入是JDK1.5中的新特性.虽然使用的比较少,但是知不知道应该可以作为检验真爱粉的一项标准吧 . 能使用第一点是作

static和extern理解

C语言static修饰函数详细解析(http://www.jb51.net/article/40520.htm) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条.介绍它的第一条也是最重要的一条:隐藏.当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话,我举例来说明.我们要同时编译两个源文件,一个是a.c,另一个是main.c. 下面是a.c的内容 char a = 'A'; // global variable void

34)static 静态成员和静态成员函数

1) static修饰的方法,只能在这个文件中使用,比如你是多文件编程,别的文件即使引入了我的 .h文件  但那时我的static方法也是不能用 2)C++的static的成员变量   比如  static int a:这个a变量属于包含他的类  而不属于类实例化出的对象. 只要你在类内定义了一个静态变量,  那么就立刻 在类外给他初始化,不然,就忘了 3)比如 在类内定义了   static  int  a:  在类外,我初始化    int   类名::a=10: 4)当你的编译器进行编译的

对c语言中static函数的理解

先看看前两篇博客:个人对头文件的理解.对声明和定义的理解. static 函数只在定义该static函数的cpp中可见,在其他cpp中是不可见的. 举个例子,我建立了一个project,该project中有三个文件,一个头文件,和两个cpp文件.文件内容如下: 在build该project时会出错,错误提示是fun()函数声明了却未定义. 为什么编译器没有找到fun()函数的定义呢?我明明在Source.cpp中定义了fun()函数呀. 原因很简单:static函数的作用域很小,只在本cpp中有