1、修饰成员变量
在一个person类中,一个成员变量例如 String name,当new2个person()对象时候,这2个对象在堆的位置是不同的,给name赋值张三、李四,这两个对象的name是互相不影响的。 当用static修饰时,例如static String name,这个变量是存在静态区,被堆中的对象所共享。如果依次赋值给2个对象name张三、李四。最终2个对象的name为李四(因为后一次的赋值在静态区中将前一次的赋值覆盖);
该修饰只会在特定情况下使用,例如给一个数量统计count一个初始化值0,后续根据代码逻辑增加。可以修饰为例如:private static int count=0;
2、修饰成员方法
static修饰方法后,最大的作用就是可以"类名.方法名"调用该方法。但是在实际开发中也少用到该方式,因为一是static修饰后的方法资源共享,在多线程场景不安全。二是静态资源常驻内存,很难被回收; static方法也是没有this的方法,this代表当前对象。而static方法不需要对象;
主要用在没有创建对象的时候调用方法/变量;
扩展:
构造器是静态方法么?
构造器中可以有"this",并且当创建对象时必须new Person();此时用到了构造器。而static方法没有this,也不属于任何对象,并且构造器也不是方法。所以构造器不是静态方法;
扩展:
构造器是静态方法么?
构造器中可以有"this",并且当创建对象时必须new Person();此时用到了构造器。而static方法没有this,也不属于任何对象,并且构造器也不是方法。所以构造器不是静态方法;
3、静态块
static修饰静态块后,将要修饰的成员同一放在一个static中。该静态化会在第一次使用类时,最先初始化static修饰的静态块。并且在程序运行过程中,只需要初始化一次,不会进行多次初始化;输出结果:
animal staticcat staticanimal constructor
cat constructor
加载顺序:首先运行main方法,但是在运行main方法之前会先加载类,发现Test继承Base类,所有先加载Base类,再加载Test类。加载类的时候运行静态代码块,所以依次输出animal static、cat static。加载完类后执行main方法,创建对象new Cat(),执行构造器,先执行父类,再执行子类,则依次输出animal constructor、cat constructor。(构造器在new对象后才会去初始化)
4、静态导包
静态导包指在导入包前用static修饰,作用是当使用静态导包后,引用导入类的方法(变量)时,可以不用XXX=类名.方法,直接XXX=方法();(变量也是一样);但是有一个缺点,如果频繁使用静态导包,会降低代码可读性。并且如果导入的不同类有相同方法名(或变量名),可能会冲突。
参考文章:https://www.cnblogs.com/dolphin0520/p/3799052.html
https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral
http://blog.csdn.net/qq_17864929/article/details/48006835