用static修饰的东西都会在最开始就执行,并且只执行一次,称之为静态
用static来修饰属性,该属性称为静态属性
用static来修饰方法,该方法称为静态方法
假如一个类中的一个方法是静态(static)的,那么在调用这个静态方法时,可以直接进行调用
假如一个类中的一个方法是非静态的,那么调用的时候只能通过new出一个具体的对象来进行调用
举例说明:
public class Person {
private String name;//非静态变量
private static int age;//静态变量
//非静态方法
public void testOne(){
System.out.println("testOne!");
}
//静态方法
public static void testTwo(){
System.out.println("testTwo!");
}
public static void main(String[] args) {
//age属性是静态的,和类同时创建了,所以可以直接使用
System.out.println(age);
//由于name属性是非静态的,所以只能创建对象的方式进行使用
System.out.println(new Person().name);
//同理:
//由于testOne方法是非静态的,所以只能创建对象的方式进行调用
new Person().testOne();
//testTwo方法是静态的,和类同时创建了,所以可以直接进行调用
testTwo();
}
}
如果main()函数与静态方法不在同一个文件中,只需导入一个静态方法包就可以像示例中的testTwo();
一样直接调用
import static com.oop.staticDemo.Person.testTwo;
补充示例
public class Test {
//构造方法
public Test() {
System.out.println("构造方法!");
}
//代码块 - 可用来赋初值
{
System.out.println("匿名代码块!");
}
//静态代码块 - 同类一起产生,所以哪怕多次创建对象,也仅仅执行一次
static {
System.out.println("静态代码块!");
}
public static void main(String[] args) {
System.out.println("第一次创建对象:");
Test test1 = new Test();
System.out.println("第二次创建对象:");
Test test2 = new Test();
}
}
运行的结果为:
其中可以看出,虽然代码的书写顺序为
构造方法
匿名代码块
静态代码块
但是实际运行时,静态代码块是第一个生效的,甚至早于main方法中第一句System.out.println(“第一次创建对象:”);
这就是因为它与类是同时加载的,并且由于静态,只需要执行一次,在第二次创建对象时并没有被再次执行
而匿名代码块的执行时间也在构造方法之前!一般可以用来赋初值。