static最突出的特点是在没有创建对象的情况下来就可以调用方法或变量。被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量,也可以编写static代码块来优化程序性能。下面对这些特性进行讲解:
1、静态变量
static变量也称作静态变量,静态变量和非静态变量的区别是:
静态变量被所有的对象所共享,在内存中只有一个副本,被所有的实例共享。
非静态变量是某个对象单独拥有,在创建对象的时候被初始化,各个对象拥有的非静态变量互不影响。
如下例:
class Student {
static String schoolName; // 定义静态变量schoolName
}
public class Example12 {
public static void main(String[] args) {
Student stu1 = new Student(); // 创建学生对象
Student stu2 = new Student();
Student.schoolName = "传智播客"; // 为静态变量赋值
System.out.println("我的学校是" + stu1.schoolName); // 打印第一个学生对象的学校
System.out.println("我的学校是" + stu2.schoolName); // 打印第二个学生对象的学校
}
}
输出:
我的学校是传智播客
我的学校是传智播客
public class Student {
public void speak() {
static int num=12; //不能用于修饰局部变量,即使speak也定义为static
}
}
2、静态方法
被static修饰的方法称作作静态方法,不创建对象就可以调用静态方法,静态方法可以使用“类名.方法名的方式来访问”。
但也因为这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
class Person {
public static void sayHello() { // 定义静态方法
System.out.println("hello");
}
}
class Example {
public static void main(String[] args) {
Person.sayHello(); // 调用静态方法,最后直接输出hello
}
}
3、静态代码块
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,只会执行一次(只会在类第一次使用时才会被加载)也因此static关键字形成静态代码块可以优化程序性能。
class Person {
static String country;
static { //一个静态代码块
country = "china";
System.out.println("Person类中的静态代码");
}
}
class Example2 {
static { // 静态代码块
System.out.println("测试类静态代码");
}
public static void main(String[] args) {
Person p1 = new Person();// 创建对象p1
Person p2 = new Person();// 创建对象p2
}
}
结果:该方法中创建了两个对象,但在两次实例化的过程中,静态代码只执行了一次,这说明类在第一次使用时才会被加载