JavaSE-static关键字
1.static
1)static修饰变量(静态变量)
对象不再属于自己,而属于所属的类。即多个对象共享同一份数据。
如上图中的教室就是公共属性(所有对象都可以使用的属性)
public class Student {
private int id;
private int age;
private String name;
static String room;
}
①何时使用static定义属性?
当描述共享属性或者是不受实例化对象限制的属性时才会使用。
2)static修饰方法(静态方法)
public class Demo{
public static void main(String[] args) {
methodStatic();//因为是本类,所以类名称可以省略.=Demo.methodStatic()
}
public void method(){
System.out.println("这是一个普通方法");
}
public static void methodStatic(){
System.out.println("这是一个静态方法");
}
}
①注意事项:
静态不能直接访问非静态
原因:在内存当中是【先】有的静态内容,【后】有的非静态内容。
静态方法当中不能用this。
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。(使用了static定义就用不上对象了)
②何时使用?
不保存普通属性时定义static方法。
产生实例化对象是因为在堆内存中可以保存属性信息,所以如果一个类中没有属性产生,就没必要再去开辟堆内存保存属性内容了,就可以考虑使用static了。
③总结static定义属性、方法
static修饰的变量和方法可以通过 “类名.对象名”访问,而不用static修饰的变量和方法只能通过对象名访问。
3)static内存图分析:
4)静态代码块:
使用static定义的代码块。(静态块会优先调用,并且只执行唯一的一次)
public class Student {
static{
System.out.println("这是一个静态代码块");
}
public Student(){
System.out.println("这是一个构造方法");
}
}
//创建两个对象
Student s1 = new Student();
Student s2 = new Student();
//这是一个静态代码块
//这是一个构造方法
//这是一个构造方法
JDK1.7之前的BUG:静态块会优先于主方法执行。(main–主方法是一切程序的起点)
何时使用?
用来一次性地对静态成员变量进行赋值。