静态
类的静态成员,
静态成员合非静态成员区别,前者属于类,不属于实例,因此调用必须通过类名,而不能通过类的实例去调用,后者总是与特定的对象相关联
实际中,当类的成员所引用的操作合类有关,但是合实例化对象无关时就可以定义为静态成员
如:想统计同类对象的数量,就可以使用静态字段,和静态方法去实现
public class Student{
private static int males; // 女 人数
private static int females; // 男 人数
private static int number; // 总数
public string name;
public int age ;
public char sex ;
public Student(string name , int age,char sex ){
this.name = name ;
this.age = age ;
if(sex== 'w')females++;
if(sex== 'm') males++;
}
static Student() {
males = 0; females = 0 ;number = 0;
}
public static void GetNmb(out int males ,out int females )
{
males = Student.males; // this.males
点不出来,不属于任何对象
females = Student.females;
}
}
class MainClass
{
public static void Main (string[] args)
{
Student a = new Student ("小明", 1, 'w');
Student a1 = new Student ("小王", 1, 'm');
Student a3 = new Student ("小雷", 1, 'm');
int m;
int f;
Student.GetNmb (out m, out f);
Console.Write ("男生{0},女生{1}", m, f); // 男生 2 女生 1
}
}
}
非静态方法和静态方法
非静态方法也叫实例方法,可以直接访问静态成员,也可以直接访问非静态成员(把静态数据和非静态数据相互关联)但静态方法中,只能访问静态字段,不可以访问实例成员,调用实力方法(只需要管理好自己的类中的静态信息)
类构造函数和静态构造函数:
1类构造函数
为了实例化对象而生的,构造函数重载时为里实例化对象时,必须赋特定的初始值,或者方便实例化对象时,同时给类的字段赋值而存在的
Public 函数名(){};
//重写默认构造函数,之后实例化的对象都会按这样的默认初始值赋值,同时系统自带的会消失(没消失前,实例化的对象都是按系统默认的初始值赋值,如 int a = 0 ; bool b = false;)
Public Student(){
Name = “”;
Age = “13”;
}
//方便赋值
Public Student(string name,int age){
this.name = name;
this.age = age;
}
2 静态构造函数
则是只为了初始化静态字段存在的,别不对类的特定实例进行操作。所以有全局构造函数,共享构造函数的说法
Static 函数名(){}
Public class Student{
Private static int males; // 女 人数
Private static int females; // 男 人数
Private static int number; // 总数
// 注意静态构造函数不支持重载,不允许定义多个静态构造函数;()
Static Student() {
males = 0; females = 0 ;number = 0;
}
}
3 什么时候会调用静态构造函数?
(1)如果当前的类是静态类,当我们第一次访问这个类的静态成员的时候,就会调用静态构造函数 , 只有在第一次访问静态成员的时候调用,之后的访问不再调用
(2)如果当前的类不是静态类
1.通过类名.静态成员名 第一次访问类成员的时候,会自动调用静态构造函数
2.当第一次实例化该类对象的时候,会自动调用静态构造函数
3.只能执行上面2种情况中的一种,哪一种先满足,就先执行
4.不管静不静态只要是使用 静态成员/或实例化的时候都会先调用一次默认的构造函数
5.静态构造函数要先于默认构造函数执行,
6. 一个普通的类中,当存在静态成员的的时候,系统就会默认添加一个静态构造函数
7.静态构造函数必须是无参数的
静态类
当类只有静态成员的时候,通常把类改为静态类
静态类多用于保存工具使用;
如 .net 中的Console Math 类
静态类,占用了静态区,可以直接使用,且运行时一直占用的内存。
非静态类中的静态成员也是如此