一、static作为变量的前缀关键字
1、被static修饰的变量又被称为静态变量,那什么是静态变量呢?我们知道当一段程序运行结束之后,其中所有的内存都会被释放,程序中的变量数据都会丢失,所以很多情况下我们都会将数据保存在数据库中。所谓的静态变量顾名思义就是在一次程序结束之后这个变量的数据仍然会被保存在内存之中可以在下一次程序运行时直接调用这个变量保存的数据或者修改其中的数据。
public class Person {
static int data = 10;
int getData() {
return data;
}
void setData(int data) {
this.data = data;
}
}
这里是一个简单的类,其中包含了一个初始定义好的静态整形变量data并且默认值为10。
public static void main(String[] args) {
Person p1 = new Person();
//注意这里是p1对象调用的data变量
int space = p1.getData();
System.out.println(p1.getData());
p1.setData(99);
//这里是另外一个对象调用的Data变量
Person p2 = new Person();
System.out.println(p2.getData());
}
注意这里我们新建了2个对象,如果是一般的变量,那么2个对象之间的成员是相互独立不会互相影响的,也就是说第二个对象p2调用的变量应该是10,而不会受到第一个对象的set方法修改data变量数据的影响。结果是这样的吗?
我们可以看到,在第一个对象修改了变量之后第二个对象调用这个变量再输出出来,变量值已经发生了改变,所以这里的2个对象调用的变量是同一个数据,不会随着对象的改变而改变是一直存在的。
2、值得注意的是static关键字的使用中Java和c++不同,Java中只能在类中使用,并且常和final关键字一起使用,C++中可以在非类成员变量中使用这个关键字,常和const关键字一起使用。
二、static作为方法(函数)的前缀关键字
1、当static来修饰方法的时候我们常常将这种方法(函数)称为静态方法(类方法),而没有添加static关键字的方法我们称为实例方法。
2、类方法和实例方法的区别:
类方法相当于一个方法的模板,不需要有具体的实例化对象就可以调用(常用类名来直接调用类方法),但是如果方法添加了private的关键字只用类名还是无法直接调用,此时要使用具体实例化的对象才行。
public class Person {
private static void fun(int a) {
System.out.println("This is the static function!");
}
}
public static void main(String[] args) {
Person.fun(1); // error!
Person p = new Person();
p.fun(1); //correct!
}
而如果没有关键字(这里指的是private)或者只有public的关键字时,可以直接使用类名来进行调用,那么这是上面显示error的部分就是正确的调用方式,而且我们注意到这里是可以传递参数的,但是不能再静态方法里面使用成员变量\方法(实例变量\方法),因为实例变量\方法是需要有实例化的对象才能够调用的,在未实例化的静态方法中无法调用,因为静态方法就是一个模板并没有实例化对象。
三、静态代码段中static的使用
静态代码段一般很少用因为这样会显得程序比较混乱,但是静态代码段可以保证其中的内容一定会被执行,但只会加载一次不会重复进行。
public class Person {
static int data = 10;
int getData() {
return data;
}
void setData(int data) {
this.data = data;
}
static {
data++;
System.out.println("static codes have been used!"+data);
}
}
想这样在类中用static和2个{ }括在一起的就是静态代码段,在每次main程序中涉及这个类时这里的静态代码段就会自动执行,但无论之后再对这个类进行多少次操作,这个静态代码段都不会再次执行。
public static void main(String[] args) {
new Person();
}
这里无论再次调用set方法或者是get方法都不会再次调用静态代码段。
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
int space = p1.getData();
p2.setData(99);
}
以上就是我认识到的static关键字的各种功能。