正确理解静态Static关键字

与其他语言不通,C#没有全局变量和全局函数的感念,C#的所有字段和方法都出现在一个类的上下文中,在C#中与全局字段或函数等价的就是静态字段或方法。“全局字段或方法”与“C#的静态字段或方法”没有功能上的差别,只是静态字段和静态方法可以加上“访问修饰符”如Private,从而可以对访问进行限制,提供更好的封装。
    首先来看静态字段 
    直接在类名之后访问静态字段如(ClassName.StaticField)在类的所有实例中都共享静态字段的存储位置,静态字段是全局的。打个比方我们有一套5元人民币的模具(最好还是不要有),这个模具就是类,用这个模具印出来的纸币就是实例,虽然这些纸币基本相同,但是他的编号肯定不同,(如果编号相同,基本可以肯定是假币,假币的制造模具和真币的模具是两个不同的类)。每张纸币(实例)的编号就可以理解是模具(类)中的静态字段,因为Static决定了它所修饰的字段是全局的。静态字段属于类本身,而不属于类构造出的实例。
    静态方法
    直接在类名之后访问静态方法如(ClassName.StaticMethod)当然这种访问方式不需要一个实例,由于静态方法不是通过一个具体的实例访问的,所以在静态方法内使用this是无效的。
    静态构造器
    静态构造器设计为对类(不是类实例)进行初始化的一种方式。在运行时访问类时自动调用静态构造器。
例如
Class Emp
{
static Emp
{
ID= Rand(1,100);
}
public static int ID = 112;
}
    我们在首次使用Emp.ID时,ID的值是不是112,而是1到100的随机数。
    静态类
    如果一个类中仅有方法,没有实例字段,那我们就没有必要使用这个类的实例,这种类最好设计为静态类。所以静态类不能被实例化。既然我们不想要这个类的实例,这个静态类的内部也不应该有实例字段或方法。而且静态类不能被扩展。在C#1.0中不能声明静态类,是通过私有构造器实现的。

单例模式的目的是为了在程序中提供类的唯一实例,而且仅提供唯一的访问点。静态不需要实例,仅提供一个全局功能。使用单例可以继承,实现接口,而静态类不能。静态方法不能访问类中的实例字段,因为静态方法不是通过实例来访问的。而单例中的方法却可以访问那个唯一实例中的实例字段。静态方法在执行后,会释放掉它所创建的所有对象。而单例中的方法却可以保留。静态字段仅是提供全局的功能,大家共享同一内存位置。访问单例中的字段是类的唯一实例中的字段,大家只能访问这个实例的字段。

时间: 2024-10-28 16:26:28

正确理解静态Static关键字的相关文章

java基础---17. 静态static关键字

1 static关键字概述 2 静态static关键字修饰成员变量 2.1 定义一个学生类 public class Student { private String name; private int age; static String room; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { r

java中的静态static关键字

类的静态成员函数不能访问非静态的成员函数以及非静态的成员变量, 但是反过来却是成立的. 即:非静态成员函数可以访问静态成员函数和静态成员变量. 这个可以从静态成员的特点来解释,因为静态成员属于类,因此即便是没有类的对象我们也能访问类的静态成员. 但是非静态成员函数由于只能通过类的对象来访问,所以其必须要有对象才行. 那,反证法: 假如,类的静态成员函数可以访问非静态的成员函数:示例代码如下, class Test { public static int i; private int j; pub

阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第6节 static静态_13_静态static关键字修饰成员方法

static关键字 用来修饰方法的情况 任何使用这个静态方法呢? 可以直接通过对象名称的方式进行调用. 更好的写法是通过类名称进行调用. 分别定义成员变量和静态变量 静态方法里面不能用this 原文地址:https://www.cnblogs.com/wangjunwei/p/11206517.html

Java 静态static 关键字作用

静态的方法1.可以通过类名打点访问2.不能使用this关键字3.不能访问非静态的属性和方法 /* * 静态的方法: * 1.属于类的方法,可以通过类名打点访问 * 2.方法中不能使用this关键字 * 3.方法中不能访问非静态的属性和方法 * 4.static方法不能被非静态方法重写 */ public static void study(){ //不能访问非静态的属性 //name = "abc"; //不能访问非静态的方法 //introduce(); //静态方法中可以访问静态的

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

static关键字以及字符串常量的理解

一.作用域.链接属性以及存储类型: 1.      作用域:常见作用域有代码块.文件.函数以及原型作用域(只适用于在函数原型中声明的参数名). 2.      链接属性: a)        链接可以将多个目标文件链接生成最后的目标文件.链接属性则是决定如何处理在不同文件中出现的标识符. b)        链接属性总共有三种:external(外部).internal(内部)以及none(无).默认情况下标识符一般是外部或者无属性,但是,通过static关键字,则可以改变标识符的属性,将外部属

数据持久化、单例、重载【添加对不可访问的成员的操作】、魔术方法、类常量、static关键字对self的补充【静态延迟绑定实现$this的效果】、参数类型约束【参数前加类名】、遍历【iterator接口】、快速排序

1.数据持久化过程[传输(例如表单提交或php交互mysql)和保存过程] 使用的是字符串形式的流数据. 数据流就是为了传输[按照序列的形式进行传输] [http://baike.baidu.com/link?url=0MtUQMhFzc_EwJc09rXZV8KlfOL4jis6XNbRfmGA3rQhDcGwOp8togLVQjXBV34M] 所以将其他类型数据转化为字符串的过程也是序列化的过程 [这个概念和图片.视频的流媒体的区别?] [注意点] 另外mysql中sql语句中的某些关键词为

07_面向对象(成员变量和局部变量区别、类作为形式参数的问题、匿名对象、封装、private关键字、this关键字、构造方法、成员方法、static关键字、静态变量和成员变量、main方法)_02

7:构造方法(掌握)    (1)作用:用于对对象的数据进行初始化    (2)格式:        A:方法名和类名相同        B:没有返回值类型,连void都不能有        C:没有返回值                思考题:构造方法中可不可以有return语句呢?        可以.而是我们写成这个样子就OK了:return;        其实,在任何的void类型的方法的最后你都可以写上:return;    (3)构造方法的注意事项        A:如果我们没写构

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

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