紧接着 疯狂Java 程序员基本功的16课(对象与内存的控制)心得(一),这篇是对类变量初始化的详解
类变量的初始化只是在第一次类初始化时为类变量分配一次内存空间和一次初始化,它可以初始地方有:
定义类变量时初始化
静态代码块中对类变量进行初始化
final 修饰的类变量初始化和类变量初始化时机一样。实例变量(包括用final修饰的实例变量)虽然最终本质是在构造器中初始化的,但类变量(包括用final修饰的类变量)是在静态初始化块中完成的,我测试的实例源码和用javap分析的结果如下:
class StaticTest{
static int first = 1;
static int second ;
static{
second = 2;
}
final static int three = 3;
final static int four ;
static{
four = 4;
}
final int five = 5;
final int six;
{
six= 6;
}
}
javap -c StaticTest显示如下:
D:\software>javap -c StaticTest
Compiled from "Test.java"
class StaticTest extends java.lang.Object{
static int first;
static int second;
static final int three;
static final int four;
final int five;
final int six;
StaticTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":
4: aload_0
5: iconst_5
6: putfield #2; //Field five:I
9: aload_0
10: bipush 6
12: putfield #3; //Field six:I
15: return
static {};
Code:
0: iconst_1
1: putstatic #4; //Field first:I
4: iconst_2
5: putstatic #5; //Field second:I
8: iconst_4
9: putstatic #6; //Field four:I
12: return
}
你是不是会问怎么final修改的类变量three怎么没有啊,因为它此时已是直接量(常量)。对于final变量,不管它是类变量、实例变量,还是局部变量,只要定义该变量时使用了final修饰符修饰,并在定义该final类变量时指定了初始值,而且该初始值可以再编译时就被确定下来,那么这个final变量本质上已经不再是变量,而是相当于一个直接量。对上面的类添加main方法看上例中的变量three和five是不是常量。代码如下:
public static void main(String[] args) {
System.out.println(three);
System.out.println(four);
StaticTest st = new StaticTest();
System.out.println(st.five);
System.out.println(st.six);
}
public static void main(java.lang.String[]);
Code:
0: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
3: iconst_3
4: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
7: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
10: getstatic #6; //Field four:I
13: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
16: new #7; //class StaticTest
19: dup
20: invokespecial #8; //Method "<init>":()V
23: astore_1
24: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
27: aload_1
28: invokevirtual #9; //Method java/lang/Object.getClass:()Ljava/lang/Clas
s;
31: pop
32: iconst_5
33: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
36: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
39: aload_1
40: getfield #3; //Field six:I
43: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
46: return
上面红色标记可以看到,three和five已是直接量(常量)也叫宏变量,编译器会把程序中用到该变量的地方都替换成改变量的值。
分享到:
相关推荐
疯狂Java 突破程序员基本功16课1 完全清晰版 5分超低分 挥泪相送啦!这是第二部分 记得下第一部分哇!
疯狂Java 突破程序员基本功16课1 完全清晰版 5分超低分 挥泪相送啦!这是1 记得下第二部分哇!
《疯狂Java:突破程序员基本功的16课2》是一本深入浅出的编程学习书籍,专注于提升程序员的基础技能。作者李刚以其丰富的教学经验,精心设计了16个课程,旨在帮助读者全面掌握Java编程的核心知识,为日后的职业发展...
《疯狂Java:突破程序员基本功的16课》是一本专为Java初学者和有经验的程序员设计的书籍,旨在通过一系列深入浅出的课程,帮助读者巩固和提升编程技能,从而达到“疯狂”提升Java编程能力的目标。这本书涵盖了程序员...
内容讲解的很详细,对java程序员有一个质的提升,欢迎大家下载
对于提升java程序员的基本功十分有帮助,让你深入理解java的内在。也可用于面试
疯狂Java:突破程序员基本功的16课.修订版 疯狂Java:突破程序员基本功的16课.修订版.pdf
李刚 著 ISBN:9787115263049
在《疯狂JAVA:突破程序员基本功的16课》中,作者深入浅出地探讨了Java编程中的核心概念和技术,旨在提升程序员的基本技能和解决问题的能力。以下是对这些知识点的详细阐述: 1. **Java基础**:Java是一种面向对象...
《疯狂Java:突破程序员基本功16课》是一本针对Java程序员进阶的教程,旨在提升读者在编程领域的技能和专业素养。这本书结合了理论与实践,通过16个关键课程,深入讲解了Java编程的核心概念和技术。源代码的提供使得...
Java程序员突破基本功的16课,打好基础,把基本练扎实。
本书把容易被Java程序员所忽视的内容整理成书,介绍了Java的对象、数组的内存分配,介绍了常见集合的实现细节、内存回收的细节、表达式、流程控制、面向对象、异常的“陷阱”,常用的数据结构和算法的实现以及其他...
中高级java开发教程,适合有一定基础的开发人员,不建议新手使用,讲解的比较好,精华部分
在《疯狂Java:突破程序员基本功的16课》中,李刚老师一改枯燥的教学方式,专门面向Java初学者可能会遇到的各种学习问题,由点及面,详细讨论了Java内存管理、Java编程过程中常遇陷阱、常用数据结构的Java实现和Java...
《疯狂JAVA 突破程序员基本功的16课》是一部专为初学者和进阶者设计的编程教程,旨在通过一系列深入浅出的课程,帮助读者巩固和提升JAVA编程的基础技能。这本书的配套源代码提供了丰富的实例,让读者能够在实践中...
疯狂Java_突破程序员基本功的16课(修订版)