由static关键字修饰的变量、常量和方法被称作静态变量、静态常量和静态方法。还可以用static来修饰代码块,static修饰的代码块叫静态代码块。
静态变量、静态常量和静态方法称为静态成员。静态成员属于类所有,区别于个别对象,可以在本类或其他类使用类名和“.”运算符调用静态成员。
使用静态成员的作用通常是为了提供共享数据和方法。
静态成员都存放在“静态区”,具有全局作用范围,内存中静态区在程序运行结束之后才会释放。
注意:1、static只能修饰在类里定义的成员部分,包括成员变量、方法、内部类和初始化块,不能将局部变量使用static修饰。
2、静态变量属于类,随类的初始化而初始化(静态代码块中);实例变量属于对象,随对象的初始化而初始化(构造方法或代码块中)。
静态变量
静态变量又叫类变量,属于类所有,类的所有对象共享同一个类变量,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
例如:
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
System.out.println(a1.num);
System.out.println(a2.num);
a1.num = 9;
System.out.println(a1.num);
System.out.println(a2.num);
}
}
class A {
static int num = 0;
}
运行结果:
从运行结果可以看到,类A中定义了一个static修饰的静态变量num,初始值为0,并且实例化了两个类A的对象a1和a2,一开始a1和a2调用num打印的值都是0,执行了a1.num = 9;之后a1和a2调用num打印的值都是9了。
注意:不建议使用对象来调用类变量,建议使用类名和“.”运算符调用,例如:A.num。
静态常量
静态常量由static和final共同修饰,其值在程序运行过程中不可改变,并且必须在定义的时候显示初始化。静态常量和静态变量一样属于类,类对象共享。
静态方法
静态方法是类中由static修饰的方法,静态方法中不可以调用非静态成员变量和非静态方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
例如:
class A {
static int num = 0;
static final int NUM = 99;
private int number =999;
public static void show() {
System.out.println("num:" + num);
System.out.println("NUM:" + NUM);
System.out.println("number" + number);//不能调用非静态常量
}
}
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
main()方法
main()方法是Java类中的一个特殊的静态方法,其声明为:
public static void main(String[] args) {}
main()方法是程序的入口,程序在运行的时候,第一个执行的方法就是main()方法,方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数。