Java-6 static关键字

一、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();
    }
}

 

猜你喜欢

转载自blog.csdn.net/benxiangsj/article/details/129472582