博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道面试题深入了解java底层
阅读量:4181 次
发布时间:2019-05-26

本文共 1086 字,大约阅读时间需要 3 分钟。

Java code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public 
class 
StaticTest {
     
    
public 
static 
void 
main(String[] args){
                 
        
staticFunection();           
    
}
     
    
static 
StaticTest st = 
new 
StaticTest();
     
    
static
{
        
System.out.println(
"1"
);
    
}
     
    
{
        
System.out.println(
"2"
);
    
}
     
    
public 
StaticTest() {
        
// TODO Auto-generated constructor stub
        
System.out.println(
"3"
);
        
System.out.println(
"a ="
+ a +
", b="
+b);
    
}
     
    
public 
static 
void 
staticFunection(){
        
System.out.println(
"4"
);
    
}
     
    
int 
a = 
110
;
    
static 
int 
b = 
112
;
}

一开始我也猜错了,但是后来想通了,之前总以为调用构造函数之前必须完成类的初始化,其实不一定。

可以从类的生命周期和对象的初始化来分析:

1.类的生命周期是:加载->验证->准备->解析->初始化->使用->卸载,只有在准备阶段和初始化阶段才会涉及类变量的初始化和赋值,因此只针对这两个阶段进行分析;

2.类的准备阶段需要做是为类变量分配内存并设置默认值,因此类变量st为null、b为0;(需要注意的是如果类变量是final在加载阶段就已经完成了初始化,可以把b设置为final试试);

3.类的初始化阶段需要做是执行类构造器(类构造器是编译器收集所有静态语句块和类变量的赋值语句按语句在源码中的顺序合并生成类构造器,对象的构造方法是init,类的构造方法是cinit,可以在堆栈信息中看到),因此先执行第一条静态变量的赋值语句即st = new StaticTest (),此时会进行对象的初始化,对象的初始化是先初始化成员变量再执行构造方法,因此打印2->设置a为110->执行构造方法(打印3,此时a已经赋值为110,但是b只是设置了默认值0,并未完成赋值动作),等对象的初始化完成后继续执行之前的类构造器的语句,接下来就不详细说了,按照语句在源码中的顺序执行即可;

附答案:

2

3

a=110,b=0
1
4

转载地址:http://wmzoi.baihongyu.com/

你可能感兴趣的文章
《Android系统学习》第二章:如何制作OTA U盘升级包
查看>>
《Android系统学习》第五章:编译Android的JDK环境
查看>>
《C++特性》之引用类型
查看>>
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>
《Android系统学习》第十一章:Android应用程序Activity组件分析
查看>>
Android4.2 Input子系统
查看>>
《C++面向对象》结构体继承
查看>>
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
查看>>
指向指针的指针
查看>>
《tiny6410裸机程序》第三章:基础汇编test1
查看>>
《tiny6410裸机程序》第四章:汇编与C混合编程
查看>>
《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
查看>>
《tiny6410裸机程序》第六章:myled通过usb下载至nandflash不能运行
查看>>
《tiny6410裸机程序》第七章:S3C6410外部中断简介
查看>>
《tiny6410裸机程序》第八章:S3C6410外部中断控制寄存器
查看>>
《tiny6410裸机程序》第八章:S3C6410总中断控制寄存器
查看>>
《tiny6410裸机程序》第九章:tiny6410按键控制蜂鸣器程序
查看>>
有关free()函数的一个问题
查看>>