Java类在哪些情况下才会被初始化?
答:根据Java虚拟机规范,只有在程序首次主动使用一个类或者接口时才会初始化它。要说明Java类在哪些情况下会被初始化,就是要找出哪些活动被视作程序对类或接口的主动使用。主要6个活动会使得Java类被初始化:
(1)最基本的就是创建类的实例,这个肯定是要对类进行初始化的。创建类的实例的途径主要有:使用new语句创建实例,或者通过反射、克隆以及反序列化手段来创建实例。
(2)调用类的静态方法。
(3)访问某个类或者接口的静态变量,或者对该静态变量赋值。
(4)调用Java API中某些反射方法,比如调用Class.forName("xxx")方法,假定xxx类还没有被初始化,那么forName()方法就会初始化xxx类,然后返回代表这个类的Class实例。
(5)初始化一个类的子类。对子类的初始化可以看作对它父类的主动使用,因此会初始化它的父类。
(6)Java虚拟机启动时被标明为启动类的类。比如,我们使用Java xxx来执行程序,那么这个xxx被看作是启动类,Java虚拟机会首先初始化它。
除了以上6中情况,其他使用Java类的情况都会被看作类的被动使用,都不会导致类的初始化。
举一个例子说明一下Java虚拟机不对类进行初始化的情况:
import java.lang.*;
class UnloadedClassTesting{
public static final int a=2*3;
static {
System.out.println("Class Loaded!!");
}
}
public class TestInit{
public static void main(String[] args){
System.out.println("a="+UnloadedClassTesting.a);
}
}
程序段打印的结果是:
Lab-Computer-0db2f6:JavaExercises labuser$ javac TestInit.java
Lab-Computer-0db2f6:JavaExercises labuser$ java TestInit
a=6
Lab-Computer-0db2f6:JavaExercises labuser$
显然没有对UnloadedClassTesting类进行初始化,UnloadedClassTesting类中的变量a是编译时常量,在编译阶段就已经计算初始化好了,当使用UnloadedClassTesting.a访问变量a的时候并没有导致类的初始化。
但是,如果上面的实例中的静态常量在编译阶段不能取得固定的值,那么程序对类的这种变量的使用,被看作时对类主动使用,会导致类的初始化。把上面的例子稍微改动一下:
import java.lang.*;
import java.util.*;
class UnloadedClassTesting{
public static final int a=(int)(Math.random()*10)/10+1;
static {
System.out.println("Class Loaded!!");
}
}
public class TestInit{
public static void main(String[] args){
System.out.println("a="+UnloadedClassTesting.a);
}
}
程序运行的结果:
Lab-Computer-0db2f6:JavaExercises labuser$ javac TestInit.java
Lab-Computer-0db2f6:JavaExercises labuser$ java TestInit
Class Loaded!!
a=1
可以从结果中看出,类已经被加载和初始化了。
分享到:
相关推荐
java 面试java 面试java 面试java 面试java 面试
【标题】:“日语java面试问题集”揭示了在针对日本客户的Java外包项目中,面试者可能遇到的技术和语言双重要求。这类面试通常旨在测试应聘者的Java编程基础、问题解决能力,以及与日本客户沟通的技能。 【描述】:...
JAVA面试问题总结 JAVA是一种广泛应用的编程语言,作为一名JAVA开发者,需要具备扎实的基础知识和实践经验。本文总结了常见的JAVA面试问题,涵盖了JAVA基础、JSP、Servlet、XML、J2EE、MVC、数据库等方面的知识点。...
JAVA面试资料JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA面试资料 JAVA...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
Java面试宝典是Java程序员求职面试的重要参考资料,它涵盖了Java编程语言的核心概念、高级特性、设计模式、并发处理、框架应用、数据库交互等多个方面。以下将详细解析这些关键知识点: 1. **Java基础**:面试中,...
常见Java面试问题,里面涵盖了基础的Java面试问题,有助于准备面试
9. **头条java面试题**:这个可能是特定平台或公司对Java开发者的技术要求,可能包含更具体的热点问题和技术趋势。 10. **2024 Java offer 收割指南**:这份指南可能提供求职策略、面试技巧、简历优化建议,帮助...
《Java面试宝典2018版》是针对Java开发者准备面试的重要参考资料,它涵盖了Java编程语言、Java虚拟机(JVM)、并发编程、框架、设计模式等多个关键领域的重要知识点。这本书旨在帮助Java程序员深入理解技术原理,...
在准备2022年的Java面试时,了解和掌握关键知识点是至关重要的。Java作为一款广泛应用的后端开发语言,其面试通常会涵盖基础语法、面向对象编程、集合框架、多线程、JVM内存管理、数据库交互以及开源框架等方面。...
《JAVA面试宝典》是一本全面涵盖Java技术体系和求职面试知识的指南,旨在帮助Java开发者准备面试,提升技能。本书共分为十章,从基础知识到框架应用,再到项目实战和面试题解析,覆盖了Java开发者的必备技能。 第一...
本资源包"Java面试宝典和2018Bat公司面试题"包含了针对Java程序员精心整理的面试资料,旨在帮助求职者全面了解并掌握Java技术的核心知识点,以及在BAT(百度、阿里巴巴、腾讯)等知名互联网公司面试中可能遇到的问题...
总的来说,准备Java面试时,你需要深入理解这些技术的原理、应用场景和最佳实践,结合实际项目经验进行回答,才能在面试中展现出专业水平。通过这份1000+面试题的资源,你可以系统地复习并测试自己的知识深度,提升...
最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 35道 BTA 常问的 Java基础39道常见面试题及详细答案 Dubbo面试题 47道 ElasticSearch面试题 30道 Git常用命令面试题 60道 Java并发...
从数据结构,到开发设计模式,再到java基础详细讲述java面试常见问题,让你面试轻松过关,并且懂得面试技巧,增加自身基础知识
Java面试宝典2017版是一份集大成的面试资源,专为准备Java相关...通过深入理解和熟练掌握上述知识点,你可以更好地应对Java面试,展现出扎实的技术功底和解决问题的能力。不断学习和实践,是成为优秀Java开发者的关键。
为了在激烈的求职竞争中脱颖而出,理解和掌握Java面试中的常见问题至关重要。"2017java面试题"这个压缩包文件提供了丰富的资源,帮助Java开发者准备面试,深化对Java开发的理解。 文档"Java面试宝典2017.doc"可能...