Java静态变量加载赋值问题

Java静态变量加载赋值问题

static在JVM类加载->链接->准备阶段赋零值,在JVM类加载->链接->初始化阶段赋初值
static final 在JVM类加载->链接->初始化阶段赋初值

涉及的问题:

  1. 初始化阶段对字节码的读取是按顺序的,故静态语句块只能访问到定义在它之前的类变量 static

  2. final变量在编译时不定的情况下,如果客户程序这个时候访问了该类的静态变量,那就会对类进行初始化,所以静态final变量尽量不要放可变因素在里面,否则性能会有所下降。

  3. 对于类使用的静态字段,只会初始化定义该字段的类(如定义在父类中,不初始化子类。是否会触发子类的加载和验证,虚拟机规范没有明确规定,视虚拟机具体实现而定)

class ParentClass{
    protected static Integer variable =1;
    static{
        System.out.println("parent before staticblock");
    }
    {
        System.out.println("parent before block");
    }
    public ParentClass() {
        System.out.println("parent constructor");
    }
    static{
        System.out.println("parent after staticblock");
    }
}

class SubClass extends ParentClass{
    static{
        System.out.println("sub before staticblock");
    }
    {
        System.out.println("sub before block");
    }
    public SubClass() {
        System.out.println("sub constructor");
    }
    static{
        System.out.println("sub after staticblock");
    }
}

public class CLassExecuteTest {
    public static void main(String[] args) {
        System.out.println(SubClass.variable);
    }
}

输出:
parent before staticblock
parent after staticblock
1

JVM的相关知识整理和学习 - ImportNew http://www.importnew.com/16388.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值