static关键字:
        1.概念:
                    被该类的所有对象共享使用,不依赖于某个具体的对象,和对象无关,依赖于类,在内存中唯一只有一份

        2.类的加载过程:
                    第一次使用new创建Student类的对象时,首先检查.class文件,是否被加载到方法区中,如果没有,把
            Student类的.class文件加载到方法区中(此时还没有对象),如果.class文件中有static静态修饰的内容,
            会把static静态修饰的内容,加载方法区的静态区中,并且要完成静态成员的初始化然后: 才进行对象的创建。

        所以: 先有静态代码块,才加载对象。 

java 静态方法 创建map java创建静态对象_静态代码块

 static修饰成员变量的使用:

static修饰修饰成员变量(类变量: 依赖于类,与对象无关)
        1.定义格式:
                    static 数据类型 变量名称 = 数据值;

        2.使用格式:
                    类名.静态成员变量名称;        推荐使用
                    对象名.静态成员变量名称;      不推荐使用

static修饰成员方法的使用

static修饰成员方法(类方法: 依赖于类,与对象无关)
        1.定义格式:
                    public static 返回值类型 方法名称(参数列表...) {...}

        2.使用格式:
                   类名.静态成员方法名称(...)        推荐使用
                    对象名.静态成员方法名称(...)      不推荐使用
    
        3.注意:
                    静态成员变量也有默认初始化值

public class JavaEE372Student {
    String name;//不能使用static修饰: 属于每个对象的特有数据
    static String room;//使用static修饰: 属于所有对象的共享数据

    //定义静态方法
    public static void show() {
        System.out.println("班级: "+room);
    }
}
//测试类
public class Demo05Static {
    public static void main(String[] args) {
        System.out.println(JavaEE370Student.room);//null
        //创建JavaEE372Student类的对象
        JavaEE372Student stu = new JavaEE372Student();
        //不推荐使用对象调用静态成员
        System.out.println(stu.room);//null

        System.out.println("---------");
        //给静态成员赋值
        JavaEE372Student.room = "HMTBD1002";
        System.out.println(JavaEE372Student.room);//HMTBD1002
        System.out.println(stu.room);//HMTBD1002

        System.out.println("---------");
        JavaEE372Student stu2 = new JavaEE372Student();

        stu2.room = "HMTBD1003";

        System.out.println(stu.room);//HMTBD1003
        System.out.println(stu2.room);//HMTBD1003
        System.out.println(JavaEE372Student.room);//HMTBD1003

        System.out.println("---------");
        //调用静态成员方法
        //推荐使用类名调用
        JavaEE372Student.show();//班级: HMTBD1003

        //不推荐使用对象调用
        stu.show();//班级: HMTBD1003
    }
}

静态代码块

静态代码块
        1.格式:
            static {
                ...
            }

        2.特点:
            (1)假如只创建对象,静态代码块会优先于构造方法执行,唯一执行一次
            (2)静态代码块,随着类的加载而加载并唯一执行一次
            (3)完成静态成员变量的赋值,没有赋值,会有默认初始化值
            (4)静态代码块,仍然属于静态内容,内部不能使用非静态
            (5)完成项目的初始化工作

/*
    静态代码块
    1.格式:
        static {
            ...
        }

    2.特点:
        (1)假如只创建对象,静态代码块会优先于构造方法执行,唯一执行一次
        (2)静态代码块,随着类的加载而加载并唯一执行一次
        (3)完成静态成员变量的赋值
        (4)静态代码块,仍然属于静态内容,内部不能使用非静态
        (5)完成项目的初始化工作
 */
public class Demo07StaticKuai {
    public static void main(String[] args) {
        //创建对象
        //Person p = new Person();
        //Person p2 = new Person();

        System.out.println(Person.country);
    }
}
//此类只针对咱们中国人
public class Person {
    String name;//不能使用static修饰: 每个对象的特有数据
    static String country = "CHINESE";//必须使用static修饰: 所有的对象的共享数据

    //空参构造方法
    public Person(){
        System.out.println("空参构造被执行了...");
    }

    //静态代码块
    static {
        System.out.println("静态代码块执行了...");
        //(3)完成静态成员变量的赋值
        country = "CHINA";
        //(4)静态代码块,仍然属于静态内容,内部不能使用非静态
        /*
            name属于非静态成员变量,必须由对象调用,
            但是静态代码块执行时,还没有完成对象的创建,
            所以静态代码块中不能使用非静态的内容
         */
        //System.out.println(name);
        /*
            this代表对象,但是静态代码块执行时,还没有完成对象的创建
         */
        //System.out.println(this.name);

        //(5)完成项目的初始化工作
        init();
    }

    //模拟项目初始化的方法
    public static void init() {
        System.out.println("项目正在完成初始化,需要稍等10秒钟....");
        for (int i = 10; i > 0; i--) {
            //此代码直接复制,后面多线程中讲解
            try {
                Thread.sleep(1000);//1000毫秒,程序在此处休眠1000毫秒(1秒)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i);
        }
        System.out.println("项目初始化完成,你可以尽情使用了....");
    }
}

静态的注意事项

java 静态方法 创建map java创建静态对象_初始化_02

java 静态方法 创建map java创建静态对象_初始化_03