static 的使用
1、概念
使用static 修饰成员变量,此时该成员变量又对象层级提升到类层级,被所有对象共享 该成员变量随着类的加载而准备就绪,与是否创建对象无关.
总之:类存在的时间比对象早
2、修饰的范围
static 修饰符表示静态的,可修饰字段、方法、代码块、内部类,其修饰的成员属于类,也就是说 static 修饰的资源属于类级别,而不是对象级别
3、静态属性
属性可以用类来调用,也可以用对象来调用,所有的实例共享这个静态属性。
/** * * 一、静态变量修饰属性 * 1、属性可以用类来调用,也可以用对象来调用,所有的实例共享这个静态属性。 * 2、静态变量随着类的加载而加载,类的加载比对象早 * 3、静态变量加载比对象早 * 4、由于类的加载只会有加载一次,则静态变量在内存中也一份,存在方法区的静态域中 * * */ public class Persion { private String name; private int age; private static String country = "china"; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static String getCountry() { return country; } public static void setCountry(String country) { Persion.country = country; } public void print(){ System.out.println("name="+this.getName()+"age="+this.getAge()+"country="+Persion.getCountry()); } } public class Test1 { public static void main(String[] args) { Persion persion = new Persion(); persion.setAge(23); persion.setName("guanyu"); persion.setCountry("蜀国"); System.out.println("=================="); persion.print(); Persion persion1 = new Persion(); persion1.setAge(25); persion1.setName("zhangfei"); System.out.println("=================="); persion1.print(); } } //这里可以看到country 这个属性是共享的,任何一个对象改了后所有的别的对象都改了 ================== name=guanyuage=23country=蜀国 ================== name=zhangfeiage=25country=蜀国
3、静态方法
静态方法可以通过类名和对象来调用,建议使用类名
public class Persion { private static Map<String, String> conMap = new ConcurrentHashMap<String, String>(); private String name; private int age; private static String country = "china"; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static String getCountry() { return country; } public static void setCountry(String country) { Persion.country = country; } public void print(){ System.out.println("name="+this.getName()+"age="+this.getAge()+"country="+Persion.getCountry()); } public static void test12(String key,String value){ if(StringUtil.isNotEmpty(conMap.get(key))){ System.out.println("buweikong"); }else { conMap.put(key,value); } System.out.println(conMap.get(key)+"====="); } } public class Test1 { public static void main(String[] args) { Persion persion = new Persion(); persion.test12("12","sss"); Persion persion1 = new Persion(); persion1.test12("12","sss1222"); } } sss===== buweikong sss==== 特别注意下上面的结果哈。第一次已经放了值 了,第二次就不会放了
4、静态代码块
后面跟着一段代码,这段代码只会初始化一次,且在类被第一次装载时。
static { System.out.println("======static========"); }
5、方法或者属性什么时候用static
/** * * 方法或者属性什么时候需要使用static修饰 * 1、如果属性是所有对象共享的那么就是用static。例如设置常量的时候 * 2、工具类中的方法使用static,方法中操作常量这个方法也要设置为static. * * */