1. static的作用
- static可以修饰变量,被static修饰的变量叫做静态变量,程序运行时静态变量存放在方法区里面,因此,静态变量在类加载阶段赋值,并且只赋值一次。请看例1
- static可以修饰方法,被static修饰的方法叫做静态方法,不用创建对象就能能直接访问该方法,即使用类名.静态方法名的方式。静态方法不能访问非静态的数据,静态方法不能使用this。请看例2
- static可以定义静态语句块,静态语句块在类加载阶段执行,并且只执行一次,并且是自上而下的顺序执行,在构造方法之前执行。请看例3
- static修饰的变量、方法、代码块都是隶属于类(class)级别的,跟对象无关。某一类物体如果可以被多个其他物体所共享,那么可以将这类物体使用static修饰。
- 比如wifi,多个人可以共同使用同一个wifi,所以wifi可以使用static修饰。手机是每人使用自己的,就不能用static修饰。
2. 例子
public class StaticTest01 {
public static void main(String[] args){
Employee e = new Employee();
//可以通过对象名.静态方法名的方式访问,工作中不这样使用
System.out.println(e.company);
//可以通过类名.静态方法名的方式访问,工作中使用这种写法
System.out.println(Employee.company);
e = null;
System.out.println(e.company);//不会报空指针,说明静态变量跟对象无关。
}
}
class Employee{
private String name;
static String company = "阿里巴巴";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class StaticTest02{
//成员变量
int i;
//成员方法
//成员方法必须使用“引用.”调用
public void m1(){
System.out.println("m1方法");
}
//静态方法
//可以使用“类名.”方式调用.也可以用“引用.”,即使用的是“引用.”,底层还是用的“类名.”
//静态方法中不能直接访问非静态数据.
//静态方法中不能使用this
public static void m2(){
//m1();错误,静态方法中不能访问非静态的方法
//System.out.println(i);错误,静态方法中不能访问非静态的变量
System.out.println("m2方法");
}
public static void main(String[] args){
StaticTest02 st = new StaticTest02();
st.m1();
m2();
st.m2();//不建议这样使用
StaticTest02.m2();//建议这样使用
st = null;
st.m2(); //不会报出空指针异常
}
}
public class StaticTest03{
//静态语句块
static{
System.out.println("静态语句块1");
}
static{
System.out.println("静态语句块2");
}
static{
System.out.println("静态语句块3");
}
//构造方法
StaticTest03(){
System.out.println("构造方法");
}
public static void main(String[] args){
System.out.println("main main方法 1");
System.out.println("main main方法 2");
new StaticTest03();
new StaticTest03();//静态语句块只执行了一次
}
}
3. 问题
public class StaticTest04{
static{
System.out.println(i);
}
static int i = 100;
}
- 答案:上面代码编译报错,因为静态代码块的执行顺序是自上而下,静态代码块里面打印的变量i还没有声明。