static修饰符使用情形
- 静态导包
- 修饰类(静态内部类)
- 修饰方法(静态方法)
- 修饰代码块(静态代码块)
- 修饰成员变量
1:静态导包(较少使用)
com.demo.utils
包是我自己的测试工具包
package com.demo.utils.StringUtil;
public class StringUtil {
public static boolean isBlank(String str){
return str == null || "".equals(str.trim());
}
..........
}
如果使用下面导包方式,如果要调用方法则需要以类名.方法名方式调用
import com.demo.utils.StringUtil.*; //StringUtil.isBlack(str);
如果使用static导包方式,如果要调用方法则只需要以方法名方式调用
import static com.demo.utils.StringUtil.*; //isBlack(str);
2:修饰类(静态内部类)
内部类分为四种
- 有成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
能用static修饰的内部类有两种(如下代码)
public class StaticClassDemo {
//一级静态内部类
public static class innerClassA{
//二级静态内部类
public static class innerClassB{
}
}
}
- static内部类详解
3:修饰方法(静态方法)
使用static来修饰方法,相比于修饰成员变量,修饰方法对于数据的存储方面并没有多大的变化,因为方法本身就是存放在类的定义当中的,既方法区类的信息中。类可以使用类名.方法名
的方式操作方法,避免了要new对象的资源消耗,静态方法的应用在工具类中经常被使用到,同时在JDK8新特性(接口的增强)中,可以在接口中使用static去修饰的具体方法,从而使得接口拥有具体的方法。
public class StringUtil {
public static boolean isBlank(String str){
return str == null || "".equals(str.trim());
}
}
注:
1.可以使用类名.方法名
去调用方法。
2.静态方法不允许直接调用非静态成员,因为在类的加载中,静态成员在类加载时优先 级高于非静态成员(实例变量,非静态方法等)。所以不能在静态方法已经被JVM加载识别的时候,方法体内存在着一个没有被JVM所加载识别的东西。
3.静态方法体内不允许使用this,super关键字。因为静态方法属于类的范畴,是通过类名.方法名
进行调用的,不需要实例化出对象来调用,所以不存在对象这个概念.但this和super是属于对象的概念范畴。
4:修饰代码块(静态代码块)和修饰成员变量
static
修饰的代码块必须得在类中且在方法体外,class文件
被加载在jvm
里,static
资源就开始加载(用于初始化类和对象等)- 静态代码块和静态成员变量加载优先级是一样的,根据代码先后顺序加载
- 程序运行期间有且仅加载一次
public class Demo{
static int num;
static {
num = 1;
System.out.println(num);
}
}