1.static 成员(静态成员)

1.1 静态成员变量

static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共

享的。

static特点:

1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问

3. 类变量存储在方法区当中

4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

1.2 静态成员方法

被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。

静态成员一般是通过静态方法来访问的。

静态方法特性

1. 不属于某个具体的对象,是类方法

2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者

3. 不能在静态方法中访问任何非静态成员变量

4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

public static String getClassRoom(){
  System.out.println(this);
  return classRoom;
}
// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
public static String getClassRoom(){
  age += 1;
  return classRoom;
}
// 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量 age
public static String getClassRoom(){
  doClass();
  return classRoom;
}
// 编译报错:Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()
比特就业

2.静态成员变量初始化

* 10.1: 直接赋值初始化 public static String classRoom = "java107";

* 10.2: 默认初始化 public static String classRoom;

* 10.3: 通过构建方法初始化get(),set()

class Date {
    public static int year;
    public static int month;
    public int day;

    public void setDate(Date this, int year, int month, int day){
        this.day = day;
    }
// getMonth()方法进行初始化静态成员变量moth值
    public static int getMonth() {
        return month;
    }
// setMonth()方法进行获取初始化之后的成员变量moth的值
    public static void setMonth(int month) {
        Date.month = month;
    }
}
public class test {
    public static void main(String[] args) {
        Date date = new Date();
        Date.setMonth(1);
    }

}

* 10.4: 在构造对象的时候,可以在构造方法中进行赋值 (不建议这样)

* 10.5:通过代码块进行赋值:普通代码块() 构造块 静态块 实例代码块 同步代码块

2.1 代码块概念以及分类

分类:

1.普通代码块

public class Main{
    public static void main(String[] args) {
        { //直接使用{}定义,普通方法块
            int x = 10 ;
            System.out.println("x1 = " +x);
        }
        int x = 100 ;
        System.out.println("x2 = " +x);
    }
}
// 执行结果
x1 = 10
x2 = 100

2.构造代码块

定义:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。

作用:初始化非静态的数据成员

特点:只有在创建对象的时候才会被调用

class Date {
    public static int year;
    public static int month;
    public int day;
    {
        // 构造代码块
        year = 2021;
        month = 2022;
        System.out.println("非静态代码块/实例代码块/构造代码块!  ->初始化非静态的数据成员");
    }
}
public class test {
    public static void main(String[] args) {
    }
}

3.静态代码块

定义:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量

作用:初始化静态数据的成员,提前准备数据

特点:1.只要类被加载,就要执行静态代码块,再main方法中,不管创建多少个类对象,以及调用多少次类方法,静态类代码块只被调用一次

2.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)

class Date {
    public static int year;
    public static int month;
    public int day;
    {
        // 构造代码块
        year = 2021;
        month = 2022;
        System.out.println("非静态代码块/实例代码块/构造代码块!  ->初始化非静态的数据成员");
    }
    static {
        // 静态代码块:初始化静态数据的成员/提前准备一些数据
        // 只要类被加载,就要执行静态代码块,再main方法中,不管创建多少个类对象,
        // 以及调用多少次类方法,静态类代码块只被调用一次
        System.out.println("静态代码块");
    }
}
public class test {
    public static void main(String[] args) {
    }
}

4.同步代码块

此处等学完多线程再进行补充

2.2 不同代码块执行的顺序

class Date {
    public static int year;
    public static int month;
    public int day;
    {
        // 构造代码块
        year = 2021;
        month = 2022;
        System.out.println("非静态代码块/实例代码块/构造代码块!  ->初始化非静态的数据成员");
    }
    static {
        System.out.println("静态代码块");
    }

    public Date(int day) {
        this.day = day;
        System.out.println("含有参数的构造方法");
    }
    public Date(){
        System.out.println("不含有参数的构造方法");
    }

    public static int getMonth() {
        return month;
    }
    public static void setMonth(int month) {
        Date.month = month;
    }
    public void show(){
        {
            System.out.println("普通代码块");
        }
        System.out.println(year+" "+ month);
    }
}
public class test {
    public static void main(String[] args) {
        Date date = new Date();
        date.show();
        Date.setMonth(1);
        System.out.println(Date.getMonth());
    }
}




java 静态成员包括 java静态成员的特点_代码块


综上:

1.如果都是非静态的,看定义的顺序,如果是非静态和构造代码块放在一起的先执行非静态代码块

2.有静态代码块:先执行静态代码块,再执行非静态代码块,再执行构造方法。