静态static的内存以及静态代码块

本文探讨了Java中静态static变量的内存分配,解释了静态变量如何在方法区的静态区存储,并通过示例说明了静态代码块的执行时机及其在初始化静态成员变量时的作用。

1.静态static的内存

我们看这个代码:

public class Student {
    private int id;
    private String name;
    private int age;
    static String room;
    private static int idCounter = 0; // 学号计数器

    public Student() {
        this.id = ++idCounter; // 每当new了一个新对象的时候,计数器++
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.id = ++idCounter;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public static void main(String[] args) {
    // 首先设置以下教室,这是静态的东西,应该通过类名称进行调用
    Student.room = "101教室";

    Student one = new Student("易烊千玺",19);
    System.out.print("姓名:" + one.getName() + ",年龄:" + one.getAge());
    System.out.println(",教室:" +Student.room); // 建议写法
    Student two = new Student("王俊凯",20);
    System.out.print("姓名:" + two.getName() + ",年龄:" + two.getAge());
    System.out.println(",教室:" +Student.room); // 建议写法
}

我们知道,给Student类里的room设置成了静态变量,因此它的实例化对象都共享这个静态变量,当有一个对象给它赋值后,其他所有对象都可以通过共享取得这个值,那我们来分析以下,内存里是怎么实现这个操作的呢?

首先Student.class信息都存入到方法区中,我们可以观察到,有一个静态变量static String room,方法区其实有一个静态区,专门存储静态static的数据,当运行方法时,创建了局部变量student对象名one和two在栈里,new出来的对象带着参数则是在堆里开辟一个空间并将对象地址赋值给栈里的对象名。

而直接根据类名调用的静态变量room由于要赋值运行,也是先进的栈里,但它不经过堆,直接根据类名到方法区中找到同名变量,这个同名变量指向方法区里的静态区,接着就区静态区将值赋值给该静态变量。所以这个过程全程和对象没关系,只和类有关系。

2.静态代码块:

代码块的意思是,直接用一个大括号括起来的部分就叫代码块。

静态static关键字还有一个特殊用法叫做静态代码块,

静态代码块的格式是:

// 直接在类里写

public class 名称{

    static{

// 静态代码块的内容

}

举例:

public class Demo04Staticbox {
    static{
        System.out.println("静态代码块执行!");
    }
}

特点:当第一次用到本类时。静态代码块执行唯一的一次

但注意,静态内容总是由于非静态,所以静态代码比构造方法先执行,且静态代码块只在第一次使用类的时候执行唯一一次。

static{
    System.out.println("静态代码块执行!");
}
public Demo04Staticbox(){
    System.out.println("构造方法执行!");
}
// 调用了构造方法,所以会输出“构造方法执行了”
// 但注意,静态内容总是优于非静态,所以静态代码块比构造方法先执行。
Demo04Staticbox one = new Demo04Staticbox();

// 但是静态代码块只执行唯一一次。
Demo04Staticbox two = new Demo04Staticbox();

运行结果:

静态代码块的典型用途:用来一次性地堆静态成员变量进行赋值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值