1、static是Java语言中的一个关键字,单词本身的含义是静态的。
2、使用static修饰的成员为静态成员,是属于某个类的;而不使用static修饰的成员为实例成员,是属于类的每个对象的。
3、一个类的成员包括变量、方法、构造方法、代码块和内部类。static可以修饰除构造方法外的所有成员。
1、static修饰变量:
static属性属于这个类所有,即由该类创建的所有对象共享同一个static属性。static变量和非static变量都是成员变量。主要区别是:
1)在内存中的份数不同
不管有多少对象,static变量只有一份。对于每个对象,实例变量都会有单独的一份。
2)在内存中的位置不同
静态变量在方法区中,实例变量在堆内存中。
3)访问的方式不同
实例对象:对象名.变量名。
静态变量:类名.变量名(推荐使用),也可以使用【对象名.变量名(不推荐使用)】。
4)在内存中分配空间的时间不同
实例变量:创建对象的时候才分配空间。
静态变量:第一次加载类的时候。
2、static修饰方法:
可以通过对象名.方法名和类名.方法名两种方式来访问。
3、static修饰代码块
当类被第一次加载时(可能是调用static属性和方法,或者创建其对象)执行静态代码块,并且只被执行一次,主要的作用是实现static属性的初始化。
4、static修饰内部类
属于整个外部类,而不是属于外部的每个对象。不能访问外部类的非静态成员(变量或方法),可以访问外部类的静态成员。
5、静态导入
import static java.lang.Math.*;
非导入类和接口,而是导入类和接口的静态成员。
注意:局部变量不可以使用static修饰。
其他:
1)java中Math、Arrays、Collections等工具类中大量的static属性和方法,通过类名可以直接调用。
2)Class.forName("com.mysql.jdbc.Driver");的作用是第一次加载类的时候调用该类的静态代码块,实现驱动注册。
3)JDK1.8之后在接口中可以出现static方法,但不能是抽象方法。JDK1.7之前是不可以的。