`
zhuxiaoqiu
  • 浏览: 46060 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java基础知识温习系列一:Static

阅读更多
说明:最近在看臧圩人的博客(http://zangweiren.iteye.com),他的博客在年度排行榜上排第4位,是为很厉害的人物,写的博客内容也非常不错,简单易懂而不失深度,特别是他的Java面试题解惑系列。我看这个解惑系列,然后对基础知识再梳理了一次。这个温习系列里面的大部分内容和代码均来自臧圩人的面试题解惑系列。

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
public class InitialOrderTest {
	// 静态变量
	public static String staticField = "静态变量";
	// 变量
	public String field = "变量";
	// 静态初始化块
	static {
		System.out.println(staticField);
		System.out.println("静态初始化块");
	}
	// 初始化块
	{
		System.out.println(field);
		System.out.println("初始化块");
	}
	// 构造器
	public InitialOrderTest() {
		System.out.println("构造器");
	}
	public static void main(String[] args) {
		new InitialOrderTest();
	}
}

运行以上代码,我们会得到如下的输出结果:
静态变量
静态初始化块
变量
初始化块
构造器

这种结果的原因是什么呢?实际上就是对关键字static的理解。用static修饰的成员变量或者成员方法是依赖类而存在的。要使用普通的成员变量或者方法,首先要new出一个对象来,然后在借助这个对象来调用成员变量或者方法。而使用static修饰的变量或者方法可以采用classname.instancevariable或者classname.methodname()的形式来调用。最典型的就是main()方法,因为它是程序的入口,这时还没有任何对象被创建,所以main()方法要被标记为static。
换句话说就是,使用static修饰的元素(可以是实例变量、方法或者代码块)是和类一起同生共死的。在类加载器加载类的时候就会初始化这些static元素。所以在初始化的时候static元素就会放在第一位。
对于变量和初始化块的顺序可以这样理解,变量的初始化顺序肯定在初始化块的前面。因为初始化块中要用到变量,所以如果变量没有先初始化,那怎么用得了呢?
至于构造方法肯定是在最后的。因为它是在new一个对象的时候构造方法才会被调用。类的加载,实例变量的初始化完成等等工作都OK了,才有可能用new来创建对象啊。所以,构造方法是在最后面的。
相关的话题是,在类继承时父类和子类的这些东东的顺序会是怎样的呢?下回再表。已经是凌晨1点20分了,昏觉了
分享到:
评论
2 楼 oyprunner 2009-04-09  
反编译的结果:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public static java.lang.String staticField;

public java.lang.String field;

public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   ldc     #2; //String 变量
   7:   putfield        #3; //Field field:Ljava/lang/String;
   10:  getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream;
   13:  aload_0
   14:  getfield        #3; //Field field:Ljava/lang/String;
   17:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   20:  getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream;
   23:  ldc     #6; //String 初始化块
   25:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   28:  getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream;
   31:  ldc     #7; //String 构造器
   33:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   36:  return

public static void main(java.lang.String[]);
  Code:
   0:   new     #8; //class Test
   3:   dup
   4:   invokespecial   #9; //Method "<init>":()V
   7:   pop
   8:   return

static {};
  Code:
   0:   ldc     #10; //String 静态变量
   2:   putstatic       #11; //Field staticField:Ljava/lang/String;
   5:   getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream;
   8:   getstatic       #11; //Field staticField:Ljava/lang/String;
   11:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   14:  getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  ldc     #12; //String 静态初始化块
   19:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
   22:  return

}
1 楼 wangzaixiang 2009-04-02  
呵呵,理解基本正确。不过,了解的方法却不甚有效。

给你推荐一个方法,使用javap -c 反编译你的代码,然后你就会更加明白为什么会这样。如果看不懂的话,推荐买一本Java虚拟机的书放在旁边翻翻。

不过说老实话,这样研究技术,很难的,当务之急,还是尽快去做一些实际的项目、写一些有目标的代码,这样才能培养感觉。别钻这些太深了,却没有实践经验。

相关推荐

    Java基础知识点汇总

    此资源是对Java基础知识点的汇总,阅读后能够对Java知识点有更清晰的认识,可以用来温习。

    资料java温习资料实用教案.pptx

    这份“资料java温习资料实用教案.pptx”主要涵盖了Java编程的基础知识、考试范围以及重点难点,为学习者提供了一份全面的复习指南。 首先,我们来关注Java的基础知识点: 1. **Java语言特性**:Java的特点包括平台...

    中考化学基础知识点温习6.pdf

    中考化学基础知识点温习6.pdf

    基于Java语言的Spring MVC知识温习与实践设计源码

    该项目为Java语言编写的Spring MVC知识温习与实践设计源码,包含54个文件,包括33个XML配置文件、10个Java源文件、7个JSP文件、1个Markdown文件、1个IntelliJ IDEA项目文件、1个属性文件和1个PNG图片文件。...

    精品(2021-2022年)资料金融市场基础知识.docx

    ### 一、证券从业资格考试金融市场基础知识三色笔记使用法 #### 1. 三色勾画法 - **红色**:表示重点记忆内容,需要重点关注和记忆。 - **蓝色**:表示次重点记忆内容或较难理解内容,同样需要重视。 - **黑色**:...

    梅州中考生物第一部份基础知识第二单元第一讲显微镜和细胞检测温习.pdf

    梅州中考生物第一部份基础知识第二单元第一讲显微镜和细胞检测温习.pdf

    资料java温习资料PPT学习教案.pptx

    【Java程序设计基础】 Java是一种广泛使用的面向对象的编程语言,以其平台无关性、安全性、分布式计算和多线程等特点而著称。Java程序的运行依赖于Java虚拟机(JVM),它是一种软件实现的虚拟计算机,使得Java程序...

    中考语文文言文基础知识:重要词语决战中考2021系列.doc

    《中考语文文言文基础知识:重要词语决战中考2021系列》是针对初中毕业生复习文言文基础知识的重要参考资料。文言文是中国古代书面语言,掌握其重要词语和语句的翻译是中考语文的关键部分。以下是对这些内容的详细...

    Java综合技能知识库

    本文档是自己从学习Java语音编程开始,到现在工作这几年精心积累总结的技术文档,郎阔了Java方面全面的最常用的基础技术知识和目前企业级开发主流框架技术。包含 Java面向对象、Java基础类库、JDBC数据库访问、Web...

    计算机二级公共基础知识教程+根据各章要点进行温习

    计算机二级公共基础知识教程+根据各章要点进行温习

    java后端1年经验和技术总结

    2. **忽视基础知识**:认为基础知识已掌握而不再复习,实际上任何领域的专业知识都需要不断温习和深化理解。特别是对于计算机程序来说,深入了解底层原理对于提高代码质量和解决问题能力至关重要。 3. **追求高端...

    用Java开发学生信息系统:Maven工程构建与标准库应用

    本文详细介绍了一个Java简易程序实例—学生信息管理系统的制作流程,涵盖创建Maven项目、配置pom.xml、编写实体类(Student)、业务管理类(StudentManager)以及主控类(Main),并介绍数据如何存于本地txt中。...

    C语言基础知识与编程技巧详解及其应用场景

    内容概要:本文章提供了针对C语言的一系列基础知识问答。内容涵盖了从简单的C程序构成、基本的数据类型、基本的语法和运算符、到一些常见的编程陷阱和错误识别等方面的知识。同时,也涉及到一些特定的问题实例解析...

    Java网络爬虫MySpider.zip

    Java网络爬虫MySpider,特点是组件化,可插拔式的,可以根据一套接口实现你自己自定义的网络爬虫需求(本人JavaSE的温习项目,适合java新人) 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++...

    J2EE学习以及Linux组件学习的日常总结,适合想了解和温习基础知识的童鞋。目前计划包含的内容有设计模式、Spri.zip

    在IT领域,J2EE(Java 2 Platform, Enterprise Edition)和Linux是两个重要的组成部分,对于任何想要深入理解企业级应用开发和系统管理的人来说,掌握它们的基础知识是至关重要的。这个压缩包文件“J2EE学习以及...

    经典的java例题,常用

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能、丰富的类库和...对于新手而言,通过解题可以更好地理解和掌握Java语言,对于有经验的开发者,这些例题也可以作为温习基础知识和探索新应用场景的途径。

    (完整word)C语言基础知识测试题-全面完整.doc

    测试题共18道,涵盖了C语言的基础知识点,适合C语言初学者或需要温习C语言基础知识的人员。 1. C语言标识符的规则:C语言标识符不能以数字开头,且只能包含字母、数字和下划线等字符。 2. C语言程序的执行顺序:...

Global site tag (gtag.js) - Google Analytics