一、关于static的特点:
static是修饰静态的标识符,使用得当,能提高程序的运行性能,并且简洁程序结构。
它有五种使用场景:变量、方法、代码块、内部类、包内导入;并且程序启动,首先执行包含static修饰符的内容,且只执行一次。它可以当作字典数据,全局变量,来使用;
1、static变量:类加载它加载。类消失它小时,它的存在可用减少对对象的创建。存储在perm gen区域;使用场景:类中全局定义static变量,该类的所有方法都可以使用,减少代码冗余和频繁创建对象;注意点:类中的静态变量是一个整体,共享给所有对象,一个对象对其值改动,那么所有该静态变量都会跟着变动,牵一发而动全身;
--字典数据
private static final String appType = "phone";
--类全局定义:日志采集
private static Logger LOGGER = LogFactory.getLoggger(MyClass.class);
--最终打印出来的是最后一次赋值结果;
public class TestStaticDemo {
private static int age;
public static void main(String[] args) {
TestStaticDemo td =new TestStaticDemo();
td.age =20;
TestStaticDemo td1 =new TestStaticDemo();
td1.age =30;
System.out.println(td.age);//30
System.out.println(td1.age);//30
}
}
2、static方法:静态方法其成员也是静态的;且无法使用对象的关键字,如this、super、也无法通过关键字访问对象资源,因为静态成员的级别高于对象;但:非静态方法可访问(静态方法、非静态方法)。存储在Java独立的内存空间的方法区(Method Area);使用场景:定义一个静态方法表示
public class Student{
private String name;
private static String oldName;
private static String newName;
public static String getName(){
String aa = name;//直接报错,因为静态方法,访问不了 非静态类下的非静态成员;
return a;
}
public static String getNameTwo(){
String aa = oldName;//访问成功,因为oldName是静态的;
return a;
}
}
--典型例子比较:
--直接定义为静态方法
public static int min(int a, int b);
--创建类的对象来实现,创建对象会占用java的堆内存,如果使用频繁,会内存溢出
int min = YourClass.min(1, 2);
3、 static代码块:static代码块在加载一个类的时候最先执行,且只执行一次;使用场景:平常工作中,遇到读取配置文件、服务器参数、冷数据的加载、字典数据等等,这个时候可以使用static代码块,避免重新查询数据或创建对象。只需一次办卡,终身会员制;
public class TestStaticDemo {
public static void main(String[] args) {
System.out.println("初始化2");
}
static {
System.out.println("初始化1");
}
}
//打印结果:初始化1 初始化2
4、static内部类:一个内部类,加上static,成为static内部类;static只能修饰内部类,不能修饰顶级类;使用场景不广泛;
public static void main(String[] args) {
//创建静态内部类实例
StaticInnerClass staticInnerClass = new StaticInnerClass();
//调用静态内部类方法
staticInnerClass.getMessage();
//创建静态内部类实例
StaticCouter.StaticInnerClass staticInnerClass1 = new staticCouter.StaticInnerClass();
//调用静态内部类方法
staticInnerClass1.getMessage();
//创建普通内部类实例
StaticCouter.NormalInnerClass normalInnerClass = new StaticCouter().new NormalInnerClass();
//调用普通内部类方法
normalInnerClass.getMessage();
}
6、static包导入:使用场景:在工作中遇到多次关键字需要导入类,然后发现他们的命名空间一致,这个时候可以直接 如:import java.util.*