用static修饰的属性和方法是属于类而不属于对象,推荐使用类名去调用。
例如:
public class Human {
static String home = "earth"; //地球
Human(){
System.out.println("一个人从世界上诞生了...");
}
public static void worldPeace(){
System.out.println("我们都住在"+home+",维护世界和平...");
}
public static void main(String[] args) {
System.out.println(Human.home); //通过类名调用静态属性
Human.worldPeace(); //通过类名调用静态方法
Human h = new Human();
h.worldPeace(); //也可以使用对象调用静态方法和属性,但是并不推荐这样调用。
}
}
简单理解就是静态属性和方法是属于类的,所以应该使用类名去调用使用。但是静态属性和方法又可以被所有类的对象所共享使用,所以也可以使用对象调用。但是如果使用对象调用,就很难从代码层面区分调用的究竟是成员属性还是静态属性。所以,一般推荐使用类名调用。比如:Human.home,由于Human是大写字母开头,自然理解为home是Human类的静态属性。可是如果是通过对象调用:h.home,我们很难判断home是静态属性还是成员属性。
==注意:静态方法中只能使用静态属性,所以this/super关键字是不能出现在静态方法中。==
static关键字还有一个比较关键的作用就是用来形成静态代码块以初始化类。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
例如:
public class Human {
static String home = "earth"; //地球
static{
System.out.println("我们的地球诞生了...");
}
Human(){
System.out.println("一个人从世界上诞生了...");
}
public static void worldPeace(){
System.out.println("我们都住在"+home+",维护世界和平...");
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
new Human();
}
}
}
运行结果:
我们的地球诞生了...
一个人从世界上诞生了...
一个人从世界上诞生了...
一个人从世界上诞生了...
一个人从世界上诞生了...
一个人从世界上诞生了...
静态导入的语法必须是import static,后面跟你想导入的static成员的完全限定名称,或者通配符。意思是导入这个类里的所有静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。
静态导入后,我们无需使用类名调用静态方法,可以直接调用静态方法。
例如:
import static java.lang.Math.*; //导入Math类中的所有静态方法
public class Test {
public static void main(String[] args) {
System.out.println(sqrt(100)); //无需使用类名, Math.sqrt(100);这样调用
}
}
在内部类章节中详情讲解。
static关键字有以下四种用法:
1)定义静态属性
2)定义静态方法
3)定义静态代码块
4)定义静态内部类