DotNet中静态成员、静态类、静态构造方法和实例构造方法的区别与联系
在面向对象的C#程序设计中,关于静态的概念一直是很多人搞不明白的。下面介绍这些带“静态”的名称。
1.静态成员:
定义:静态成员是用static关键字修饰的成员(包括字段属性和方法)
所属:静态成员是属于类的,只能通过类名.对象名的形式访问,而不能通过对象名访问
存储:静态成员是存储在内存空间的静态存储区中,而不是存储在栈或者堆中
生存周期:静态成员的生存周期是从类第一次被加载到整个程序运行结束才被释放,和垃圾回收器GC没有关系
何时使用:当这个类中的某些属性要被共享,某些方法要被反复调用,这个时候才将这些成员设置为静态,只需要加载一次
//类加载:什么是类加载,这个概念和java中的类加载时一样的。类的代码存放在代码段中,只要类被访问一次就会加载一次,我的理解是只要程序中出现了类名 类就被加载一次,类一旦被加载,那些静态成员立即被加载到静态存储区中。
2.实例成员
相比于静态成员。实例成员就是静态成员的反面,
1.实例成员没有static关键字修饰,是属于对象的,在对象创建的时候才被创建
2.实例成员只能通过对象名来访问,因为他属于对象,对象有多少分,他就有创建多少份
3.实例成员是存放在堆内存中的(成员变量存放在堆中,而方法的局部变量就定义在栈中)
4.实例成员的生命周期是从对象被创建(new)到对象失去引用,被垃圾回收器回收
3.静态类
定义:被static关键字修饰的类就是静态类
说明:
1.静态类中只能定义静态的成员,不能定义实例的成员。至于为什么:通过查看static的IL代码,他是一个抽象类和密封类,抽象类是不能被实例化的,他只是众多类的一个抽象,是堆类的共同点的归纳,实例化没有意义
2.静态类不能被继承,因为他是一个密封类(abstract),密封类是无法被继承的,但是静态的类可以继承别的类
3.静态类中的所有成员都只能通过类名.成员名访问
何时定义:当类中所有成员属性都要被共享,所有方法都要被反复调用,这个时候不如将类设置为静态类,类的一切都存储在静态存储区中,这样就能提高开发效率
实例类
相比于静态类,就有了实例类
定义:实例类就是没有static关键字修饰的类
说明:实例类就是我们一般见到的类
1.实例类中所有的实例成员是存储在堆中的,从对象被创建(new)到对象失去引用被垃圾回收器回收为止
2.实例类可以被继承也可以继承其他类,当然也可以实例出一个对象。这个自然不用说
3.实例类中可以定义静态成员 和静态构造方法,但是在静态类中不能定义实例成员和实例构造方法
介绍完静态类和实例类,静态成员和实例成员的区别,接着讲一下静态构造方法和实例构造方法
静态构造方法:
1.静态构造方法:就是被static关键字修饰的构造方法(构造方法名和类名相同)
2.说明:静态构造方法是一个“三无产品”:即:无参数 无返回值 无重载
只要是构造方法本来就没有返回值,而静态构造方法没有没有参数,没有参数自然就没有重载,静态构造方法是被系统自动调用 的,不需要手动调用,因此就不需要手动选择重载。
3.调用时机:静态构造方法和其他静态成员一样,都是在第一次类加载就被加载到静态存储区的。但是静态构造方被自动的调用时机就 是在该类的成员第一次被访问之前。
4.什么是成员第一次被访问:这个问题曾经困扰我多时,经过查找资料,反复试验现在终于可以确定下来,类的成员第一次被加载分为方法和静态属性的第一 次被访问。至于方法第一次访问,就是在创建对象,实例构造函数被调用。这叫成员第一次被调用,至于静态属性,不是说类加载的时候为这个成员开辟空 间的同时赋初始值叫静态成员的访问,类加载的时候为成员赋初始值不叫成员访问。成员访问时在其他地方通过类名.静态成员名 访问才叫访问。在第一次 访问实例构造方法和第一次访问静态属性之前,静态构造方法才能被调用!
5.其他:当然静态构造方法也属于静态成员,自然符合静态成员的一些特性,比如他也不属于对象,属于类,存储在静态存储区中,从类第一次被加载从程序 完全退出,一直存在
实例构造方法
1.实例构造方法:就是我们常见的构造方法
2.说明:实例构造方法在对象中是默认存在的,如果程序员没有手动定义实例构造方法,那么编译器会自动帮我们生产一个无参数的并且为空方法体的方法构造方法,当然方法名和类名一样,这点可以在通过反编译查看,如果程序员手动创建了一个构造方法,那么编译器就不再为我们创建默认的构造方法
3.实例构造方法的一些特性:实例构造方法是没有返回值的,甚至连void都不用写,一般的实例构造方法必须为public,最少也要protected和internal否则根本无法创建对象。
4.实例构造方法之间的调用:实例构造方法不能被普通的方法调用,更不能被静态方法调用(静态方法不能调用实例成员,因为当静态方法存在的时候,实例成员还不一定存在),但是实例构造方法可以互相调用,通过 :this()方式调用
class Person()
{
public string Name{set;get;}
public int Age{set;get;}
public bool Gender{set;get;};
//通过this关键字调用其他的构造方法重载
public Peson():this(int age)
{
cw("我是构造方法1");
} public Peson(int age)
{
cw("我是构造方法2" + age);
}
}
DotNet中静态成员、静态类、静态构造方法和实例构造方法的区别与联系的更多相关文章
- 解析Java中静态变量与实例变量的区别
java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量:另一种没有static修饰,为实例变量. 在语法定义上的区别:静态变量前要加static关键字,而实例 ...
- Java笔记_静态变量和实例变量的区别
这里简单做一下笔记,区分Java全局变量里的静态变量与实例变量. 1.Java里的全局变量 首先了解Java里的全局变量,也叫成员变量. 特点: (1).一个类中既不在方法体内,也不在程序块内定义的变 ...
- Java中静态变量和实例变量的区别
静态变量属于类的级别,而实例变量属于对象的级别. 主要区别有两点: 1,存放位置不同 类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存中. 2,生命周期不同 类变量的生命周期 ...
- 【Java面试题】4 静态变量和实例变量的区别?详细解析
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加.在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量.静态变 ...
- Django 中 app_name (应用命名空间) 和 namespace (实例命名空间) 的区别
转自:https://www.jianshu.com/p/404500a0408a 补充理解: 先把官网上对应用命名空间(app_name)和实例命名空间(namespace)的解释贴上: app_n ...
- Java中静态变量与实例变量
知识回顾 上一篇总结了java中成员变量和局部变量的区别,这一篇将总结静态变量和实例变量的一些特性和区别. 示例代码 package Variable; public class VariableDe ...
- 关于java中构造方法、实例初始化、静态初始化执行顺序
在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...
- C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...
- 【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...
随机推荐
- Docker - ubuntu 镜像安装网络工具
概述 给 ubuntu 镜像, 安装一些基本的网络工具 背景 尝试学习的时候, 需要检测网络的连通性 没有这些工具, 绕了不少弯路 工具们 ping ip a 环境 docker 18.09 ubun ...
- 【Python】计算圆的面积
代码: r=29 area = 3.1415*r*r print(area) print("{:.2f}".format(area)) 结果:
- 【C语言】已知三角形三边长,求三角形面积
一. 数学基础: 已知三角形的三边,计算三角形面积,需要用到海伦公式: 即p=(a+b+c)/2 二. 算法: 输入三个边长,套用海伦公式计算面积,并输出. 可以先判断是否可以构成三角形,即任意两边之 ...
- C++ split分割字符串函数
将字符串绑定到输入流istringstream,然后使用getline的第三个参数,自定义使用什么符号进行分割就可以了. #include <iostream> #include < ...
- C语言数据结构——第三章 栈和队列
三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...
- 深入理解JDK、JRE(两套)、JVM、以及不同目录下的java.exe
内容来自:http://blog.sina.com.cn/s/blog_7ffb8dd501011sgc.html 1.jdk下bin目录里的java.exe与外部jre中的java.exe的秘密 ...
- 1.4 Eclipse 自动补全功能
1.访问Content Assit 菜单项 window--preferences --Java---Editor--Content Assit 2. auto activation delay : ...
- 前端——语言——Core JS——《The good part》读书笔记——第九,十章节(Style,Good Features)
第九章节 本章节不再介绍知识点,而是作者在提倡大家培养良好的编码习惯,使用Good parts of JS,避免Bad parts of JS.它是一篇文章. 本文的1-3段阐述应用在开发过程中总会遇 ...
- Day1 面向对象编程与Java核心类
this变量 在方法内部,可以使用一个隐含的变量this,它始终指向当前实例.如果没有命名冲突,可以省略this. 但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this. 构造方 ...
- 排序:ORDER BY
1.按照字段值进行排序: 语法:order by 字段 升序|降序 (asc|desc) 默认情况下为“升序” asc.asc=ascending 升 desc=descending 降 2.允许多字 ...