static的用法:
1、修饰成员变量,可以直接通过类名.属性名直接引用,而不需要直接new一个对象。
2、修饰成员方法,可以直接通过类名.方法名(参数)直接引用,而不需要直接new一个对象。(这也常常运用在单例模式)
从JVM的类加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。类的初始化早于类的new,比如Class.forName(“xxx”)方法,就是初始化了一个类,但是并没有new它,只是加载这个类的静态资源罢了。所以对于静态资源来说,它是不可能知道一个类中有哪些非静态资源的;但是对于非静态资源来说就不一样了,由于它是new出来之后产生的,因此属于类的这些东西它都能认识。
1、静态方法能不能引用非静态资源?不能,new的时候才会产生的东西,对于初始化后就存在的静态资源来说,根本不认识它。
2、静态方法里面能不能引用静态资源?可以,因为都是类初始化的时候加载的,大家相互都认识。
3、非静态方法里面能不能引用静态资源?可以,非静态方法就是实例方法,那是new之后才产生的,那么属于类的内容它都认识。
package test;
public class Learning {
public static void main(String arg[]) {
//同类中的话调用静态方法可以省略类名
show01();
//可以直接通过类名.方法名/属性名引用静态资源
System.out.println(show02.str);
show02.show03();
}
public static void show01() {
System.out.println("你好");
}
}
class show02 {
public static String str="静态属性";
public static void show03() {
System.out.println("静态方法");
}
}
3、静态代码块,在首次初始化类的时候,执行一次;
package test;
public class Learning {
public static void main(String arg[]) {
show03 show=new show03();
show03 show01=new show03();
}
}
class show03 {
static {
System.out.println("静态代码块");
}
show03() {
System.out.println("构造函数01");
}
}
输出:
静态代码块
构造函数01
构造函数01
关于静态代码块:
静态代码块对于定义在它之后的静态变量,不能访问。
静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次。
4、修饰内部类,通过static修饰的内部类,可以通过new 外部类.内部类进行引用。若没有static修饰,需要new一个外部类,在new一个内部类进行引用(外部类对象.new 内部类());
package test;
public class Learning {
public static void main(String arg[]) {
new show03.method();
}
}
class show03 {
public static class method{
method(){
System.out.println("静态内部类");
}
}
}