java初始化

看了一篇CSDN的帖子,整理了一下,并且MARK学习

package org.test;

public class Tester5 {
    public static void main(String[] args){
        aaa();
    }
    static Tester5 st=new Tester5();
    static{
        System.out.println("1");
    }
    {
        System.out.println("2");
    }
    Tester5(){
        System.out.println("3");
        System.out.println("a="+a+" b="+b);
    }
    public static void aaa(){
        System.out.println("4");
    }
    int a=110;
    static int b=112;
}

这里的答案居然是

2
3
a=110 b=0
1

4

JAVA中赋值顺序

1.父类的静态变量赋值
2.自身的静态变量赋值
3.父类成员变量赋值
4.父类块赋值
5.父类构造器赋值
6.自身成员变量赋值
7.自身块赋值
8.自身构造器赋值
原因:JVM中类的装载机制和实例化机

看起来和上例有些矛盾,但仔细一看就知道是那里面的static变量st初始化引起的。使非静态变量加载插入到的静态变量加载中去了,导致后面的static还没加载完,非静态的就已经加载


另外类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载,只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,但final变量是特殊的,第一步加载阶段就处理完成了,如果把上例的静态变量b改成final,确实是第一步就执行了

package com.cy.mybatis.service;

public class Tester5 {
    public static void main(String[] args){
        aaa();
    }
    static Tester5 st=new Tester5();
    static{
        System.out.println("1");
    }
    {
        System.out.println(b);
        System.out.println("2");
    }
    Tester5(){
        System.out.println("3");
        System.out.println("a="+a+" b="+b);
    }
    public static void aaa(){
        System.out.println("4");
    }
     int a=110;
    final static int b=112;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值