静态和非静态

原创 2015年03月16日 10:11:19

一、引言

在自定义类和.NET Framework类库中都可以发现,类中大部分是一个类,很少是静态类,那到底静态类是否真的需要?
其实程序上的设计都是必须的,所有的设计都是来源于生活,来源于客户分析。在程序设计初期,需要业务逻辑,明确编写流程,以防后期各种修改。
比如设计个学校的管理软件,记录每个学生的信息,包括班级、学校、成绩、年龄。因为每个学生是不同的,可以为建立学生类,其中因为每个学生年龄、成绩不同,所以这两个特征设为非静态字段。但是很多学生的班级是一样的,所以班级这个字段可以设为静态的字段。至于静态类,可以就是定义学校为静态类,因为所有的学生的学校是相同的。
综上所述,静态还是很管用的,这么做的目的其实很是节省资源。静态类和静态字段,在内存中只分配一次内存。非静态的每次初始化,则要重新分配内存。

二 、静态特征和非静态特征的区别

  • 1、静态类和非静态类

• 静态类和非静态类在定义是一样的,就是在静态类定义是前面添加static修饰符。
• 非静态类中只能包含静态成员、静态函数。而非静态类中可以包含静态成员和非静态成员。当然静态方法中只能用静态成员。
• 静态类要记得不能实例化,其中成员访问只能通多类来访问。

  • 2、静态构造函数和非静态构造函数

• 在非静态类中可以有静态构造函数,用于初始化静态成员。
• 静态构造函数可以与的实例构造函数同时存在,且静态构造函数只有一个,实例构造函数可以重载多个。
• 静态构造函数在CLR加载类时执行,且只被执行一次,然而实例构造函数在每次实例创建时都会执行
• 静态构造函数只能对静态成员初始化,不能对非静态成员进行初始化操作,然而实例构造函数,既可以初始化实例成员也可以初始化静态成员,但静态只读字段除外

  • 下面引用个构造函数执行顺序。
  • 这里写图片描述

  • 3、静态字段、属性、方法和非静态字段、属性、方法

• 类中包含静态字段和属性时,字段一般设置为private,属性设置为public,体现类的封装性。例如:
Private string name;
Public string Name
{
Get
{
Return name;
}
}
• 访问性:静态中字段、属性、方法只能通过类中访问,非静态中则通过实例来访问。
• 内存分配:内存中静态的成员只分配一份,而实例化对象每次实例化时都要分配一块内存区域。
• 方法内部访问:静态方法只能访问静态成员和方法,也可通过实例对象间接访问实例字段、方法。
• 方法调用:在类中内存访问时,静态不能通过this,这个类似实例指针。
• 派生性:
• 静态方法不能被标识为virtual、abstract或override,静态方法可以被派生访问,但是不能被派生类重写
三、总结
在程序设计中一定要善于应用静态变量和静态类,静态变量和静态类从流程图可以得到其存存活时间是比实例长,可以有效的节省内存,其实静态类型在一定程度上get应用较多,set较少。

Java中静态跟非静态的区别总结

静态变量跟实例变量的区别,静态方法跟实例方法的区别
  • HaydenYu
  • HaydenYu
  • 2017年06月19日 10:05
  • 1304

静态变量和非静态(实例)变量的区别

静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是...
  • tx16bing
  • tx16bing
  • 2014年10月21日 08:54
  • 1443

静态锁和非静态锁

如何保证线程安全,这个问题并不陌生,通过使用synchronized和volatile关键字,又或者使用concurrent包里提供的Lock ====相关链接====== synchronized和...
  • bj262948
  • bj262948
  • 2017年07月17日 17:20
  • 216

Static 静态与非静态的区别

Static 解释 :用static关键字修饰的静态类或者静态变量主要的一个优点是写在栈中的,在内存中占有实际位置,可以安全稳定的快速调用,因此常用static修饰那些需要频繁调用的函数或变量,以此...
  • afanyusong
  • afanyusong
  • 2015年03月07日 12:54
  • 856

C++静态成员和非静态成员的区别

1.数据成员可以分静态变量、非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会...
  • developerof
  • developerof
  • 2016年04月14日 10:03
  • 2989

不能对非静态字段/方法进行静态引用

如图所示,分别在第5行与第10行删除了static,则程序报错。 原因: 非静态常量是随着对象实例化才分配内存赋值的,运行main时只加载了类,内存中还没有变量值,而类加载时首先为static成员分配...
  • WenDong1997
  • WenDong1997
  • 2017年10月21日 18:45
  • 164

php 静态与非静态的区别

静态与非静态的区别 1.    设置出发点:静态是给类使用,非静态是给对象使用 2.    对象不能访问静态属性(对象访问属性只会去对象的内存区域(堆)找,而静态属性在代码区),对象能够访问静...
  • qq_18674153
  • qq_18674153
  • 2016年01月22日 22:07
  • 328

C#静态字段与非静态字段(静态方法与非静态方法与之类似)

1 静态字段 (1)声明:用static修饰符声明其为静态字段。     [修饰符] static 数据类型 字段名     在fruits类中声明三个静态字段(变量)——name、...
  • liyongliang_2012
  • liyongliang_2012
  • 2012年09月03日 11:18
  • 3270

无法从静态上下文中引用非静态变量,非静态方法

java初学者经常会遇到的问题:无法从静态上下文中引用非静态变量 non-static variable mainframe cannot be referenced from a stati...
  • cynhafa
  • cynhafa
  • 2011年10月25日 10:51
  • 26182

什么时候使用静态

什么时候使用静态? 要从两方面下手: 因为静态修饰的内容要有成员变量和函数。   什么时候定义静态变量(类变量)呢? 当对象中出现共享数据时,该数据被静态所修饰。 对象中的特有数据要定义成...
  • l55iuming
  • l55iuming
  • 2015年07月09日 16:02
  • 584
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:静态和非静态
举报原因:
原因补充:

(最多只允许输入30个字)