一、static关键字的作用
1、可以用来修饰成员变量和成员方法,被static修饰的成员,称为静态成员或者类成员,其不属于某个具体的对象,是所有对象所共有的。
2、修饰成员变量
举例:定义一个学生类,创建了多个学生,他们都在一个班级上课,此时就不需要给每个学生都赋值班级,代码实现如下:
public class Student{
public String name;
public int age;
public static String classRoom = "3班"; //班级都为三班
public static void main(String[] args) {
Student student1 = new Student();
System.out.println(student1.classRoom);//通过对象访问班级属性
System.out.println(Student.classRoom);//通过类名访问
}
}
1、被static修饰的成员变量,存放在方法区
2、既可以通过对象来访问,也可以通过类名来访问
3、随着类的加载而创建,类的卸载而销毁
3、修饰成员方法
public class Student{
public static void func(){ //静态方法
System.out.println("这是一个静态方法");
}
public static void main(String[] args) {
Student.func();//通过类名访问
}
}
4、特性
1、普通的成员方法中,可以使用静态的的成员变量/方法
2、静态的成员方法中,不能访问非静态的成员变量/方法,因为非静态的成员变量依赖于对象
二、初始化静态成员变量
1、代码块
2.实例代码块——初始化普通成员变量
只有实例化对象的时候,才会执行构造代码块
public class Student {
public String name;
public int age;
{
this.name = "jinjin"; //构造代码块
this.age = 22;
}
public Student(String name, int age) { //构造方法
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
Student student = new Student("nannan",20);//只有实例化对象的时候,才会执行构造代码块
System.out.println(student);
}
}
执行结果:
因为优先执行实例代码块,所以给student先赋值为“jinjin”,22;后来实例化对象的时候,又赋值为“nannan”,20;因此最终打印“nannan”,20。从字节码角度来看,是把实例化代码块当中的内容,拷贝到了构造代码块之前
3.静态代码块——初始化静态成员变
1、实例代码块,不依赖于对象,不需要实例化对象就可以执行,只要有main函数,静态代码块、就会自动执行
2、无论实例化多少个对象,静态代码块都只会执行一次
3、每实例化一次对象,构造代码块就会执行一次
public class Student {
public String name;
public int age;
public static String classRoom;
static { //静态代码块 优先构造方法执行
classRoom = "3班";
System.out.println("这是静态代码块1");
}
{
System.out.println("这是实例代码块1");
}
{
System.out.println("这是实例代码块2");
}
public static void main(String[] args) {
Student student1 = new Student(); //无论实例化多少个对象,静态代码块都只会执行一次
Student student2 = new Student();
}
}