一、、有无static修饰的区别
static修饰 | 无static修饰 | 备注 | |
---|---|---|---|
归属 | 类 | 单个对象 | |
属性 | 类属性、类变量 | 实例属性、实例变量 | |
方法 | 类方法 | 实例方法 | |
调用方法 | 类名.属性;类名.方法;对象.属性;对象.方法 | 对象.属性;对象.方法 | 创建对象时,数据存储空间才可以被分配,才可以外界调用 |
二、基本知识点
(一)使用
(1)将static关键字放在定义之前,就可以将字段或方法设定为静态变量或静态方法。
eg:
class Person{
static int age = 18;//就是将age这个字段定义成了静态变量
Static void NewYear{
Person.age++;}
}
Person p1 = new Person();
Person p2 = new Person();
(2)引用static变量:
可以类名直接引用:Person.age
可以对象进行定位:p1.age,p2.age
(3)引用static方法:
可以类名.方法()直接引用:Person.NewYear()
可以对象进行定位:p1.NewYear(),p2.NewYear()
(二)存储空间
(1)类变量
在类中,使用static声明的成员变量称为静态成员变量,是该类的公用变量,在第一次使用时进行初始化,对于该类的对象来说,static成员变量只有一份。字符串常量和静态变量均存放在数据区。
(2)实例变量
个人理解:
static变量-静态变量:就像图书馆中供同学们传阅的一本书籍一样,如一个人对书籍进行了笔记则影响到后来看的每一位同学。
非static变量-成员变量:可理解每位同学上课均有一本自己的教科书,每一个人都可以在自己课本上进行笔记,对其他同学没有影响。
(三)应用场景
当遇到如下情况需要使用static:
1.只想为特定域分配单一存储空间;
例如签到系统,定义静态变量sumPerson,可以每来一个人就++
//定义初始值为0
public static sumPerson =0;
public void person(string name){
this.name = name;
id = sumPerson++;
}
则每当调用一下person,sumPerson将进行+1操作
2.即使没有创建对象,可以被调用;(非static域和方法必须与某一特定对象关联,才可以访问数据或方法)。
三、静态与非静态实例对比
(一)静态变量实例
(1)非静态变量
(2)静态变量
静态变量的对象引用
静态变量的类引用
(二)静态方法实例
(1)非静态方法
此处特意引用上面创建的A类静态变量,以此来说明在不同类中变量,静态变量也可以通过ClassName.VariableName的方式进行调用。
(2)静态方法
静态方法不再针对某一对象进行调用,故不能访问非静态变量。
(三)静态代码块实例
由上可以看出静态代码块在类加载的时候就执行了,即静态代码具有最高执行的优先级。