JVM是怎么处理类和对象的呢?
类的生命分为装载、连接和初始化三步。其中连接又分为:验证、准备和解析,解析在这里是可选的。
装载:读入该类型的二进制数据流,生成方法区数据结构,在堆上为该类型创建一个java.lang.Class类的实例。
验证:确认类型符合java的语义,比如检查是否一个final类拥有子类或者是否一个final方法被重载。
准备:JVM为类变量分配内存,设置默认初始值(不是java代码中指定的值,而是默认的缺省值)。
解析:就是在该类的常量池中寻找类、接口、字段和方法的符号引用,将其替换成直接引用。
初始化:在类或者接口被首次主动访问前,为类变量赋予正确的初始值,如果类存在父类,先初始化其父类。类变量的初始化和静态初始化都被放在类的clinit方法中。
clinit方法的执行顺序是按照声明的顺序排列的。
如果类中没有声明任何类变量和静态初始化语句,那么就不会生成clinit语句。
如果类中仅有类的final常量或者该常量的初始化语句是由编译期常量组成的语句,那么也不会生成clinit方法,即只有存在需要执行java代码的赋值才会生成clinit。
如:
final FINAL_VAL = -1;
static final int i = FINAL_VAL + 1;
主动使用:创建类的新实例、调用类中声明的静态方法(包括main方法)、操作接口和类中声明的非常量静态字段、反射方法、初始化一个类的子类。
public class StaticParent {
static int parent_time = (int)(Math.random());
static final int PARENT_FINAL = -1;
static {
System.out.println(">>>StaticParent初始化>>");
}
}
public class StaticChild extends StaticParent{
//不需要clinit函数初始化
static final int CHILD_STATIC_1 = -1;
//需要clinit初始化
static final int CHILD_STATIC_2 = (int)(Math.random()*10);
//blank final
static int CHILD_STATIC_3;
//缺省值
static int CHILD_STATIC_4 = 0;
static StaticChild staticChild = new StaticChild();
public StaticChild() {
System.out.println(">>>StaticChild构造函数>>>");
CHILD_STATIC_3 = 3;
CHILD_STATIC_4 = 4;
}
static {
System.out.println(">>>StaticChild静态初始化>>>");
CHILD_STATIC_3 = 1;
CHILD_STATIC_4 = 2;
}
public static StaticChild getInstance(){
return staticChild;
}
}
public class StaticMain {
public static void main(String []args){
StaticChild sc = StaticChild.getInstance();
System.out.println("CHILD_STATIC_1:"+sc.staticChild.CHILD_STATIC_1); System.out.println("CHILD_STATIC_2:"+sc.staticChild.CHILD_STATIC_2);
System.out.println("CHILD_STATIC_3:"+sc.staticChild.CHILD_STATIC_3);
System.out.println("CHILD_STATIC_4:"+sc.staticChild.CHILD_STATIC_4);
}
}
输出结果:
>>>StaticParent初始化>>
>>>StaticChild构造函数>>>
>>>StaticChild静态初始化>>>
CHILD_STATIC_1:-1
CHILD_STATIC_2:3
CHILD_STATIC_3:1
CHILD_STATIC_4:2

- 大小: 16 KB
分享到:
相关推荐
### JAVA解惑知识点详解 #### 知识点一:类字面常量及`.getName()`方法 **背景介绍**:在Java中,类字面常量是指直接引用一个类的对象,例如`Me.class`,这种方式可以获取到当前类的`Class`对象。`Class`对象提供...
### Java解惑知识点详解 #### 一、表达式谜题:奇数判断方法的问题与修正 **背景描述:** 在给定的代码片段中,提供了一个用于判断整数是否为奇数的方法`isOdd()`。该方法试图通过计算传入整数`i`对2取模的结果...
Java Puzzlers 中文版(Java解惑) Java 谜题 1——表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转 吗? public static boolean isOdd(int i){ return i % 2 == 1...
Java是一种广泛使用的编程语言,它有许多特性需要程序员深入理解才能有效避免编程中的一些陷阱和冷僻问题。从给定的文件内容中,我们可以提炼出以下几个知识点: 1. 取余操作符(%)的特性与陷阱 在Java中,取余...
### JAVA解惑知识点详解 #### 一、表达式谜题:奇数性的判断 **谜题背景**: 在《JAVA解惑》这本书中提到了第一个谜题:如何判断一个整数是否为奇数。该谜题提供了一个看似合理的解决方案,但实际运行时会出现问题...
### JAVA解惑中的关键知识点解析 #### 谜题1:奇数性的判断 在《JAVA解惑》一书中,作者通过一系列实例介绍了Java编程语言中的一些不易掌握的知识点。其中一个例子是关于如何正确判断一个整数是否为奇数。 **原始...
### Java解惑:深入解析Java中的谜题与陷阱 #### 谜题1:奇数性的判断误区 在Java编程中,判断一个整数是否为奇数看似简单,但实则隐藏着潜在的陷阱。一个常见的错误实现是通过检查一个整数`i`对2取模是否等于1来...
### Java解惑知识点详解 #### 一、表达式谜题概览 本书《Java解惑》专注于探索Java编程语言及核心类库中的复杂细节。作者通过一系列精心设计的谜题来帮助读者深入理解Java中的一些棘手问题。本书共包含了95个谜题...
### Java解惑中文版(带索引)知识点详解 #### 一、理解Java中的奇数检测方法 在Java中,判断一个整数是否为奇数是常见的编程需求。本章节介绍了一个具体的例子来探讨如何正确地实现这一功能。 **原始方法实现**:...
### 经典 Java 解惑知识点解析 #### 一、奇数判断方法的陷阱 **标题与描述中的知识点:** 在给定的标题“经典 java 解惑”和描述“java 解惑技术”中,主要涉及了一个关于Java编程语言中判断一个整数是否为奇数的...
### JAVA解惑知识点详解 #### 一、表达式谜题:奇数性的判断 **谜题背景** 在《JAVA解惑》文档中的第一个谜题关注的是一个简单的逻辑判断:一个整数是否为奇数。虽然这个问题看似简单,但在Java语言中却隐藏着一个...
在“JAVA解惑”这个主题下,我们主要探讨的是Java编程语言中常见的一些问题和解决方案。Java作为一种广泛应用的面向对象的编程语言,以其跨平台、高性能、安全性强等特点深受开发者喜爱。然而,对于初学者或者在开发...
### Java解惑 书籍类 谜题 #### Java谜题1——表达式谜题 **谜题1:奇数性** 本节讨论了一个看似简单的Java方法,旨在判断一个整数是否为奇数: ```java public static boolean isOdd(int i) { return i % 2 ==...
### JAVA解惑知识点详解 #### 一、表达式谜题:奇数判断 **知识点概述:** 本节探讨了一个常见的编程问题:如何准确地判断一个整数是否为奇数。虽然这个问题看似简单,但如果不小心处理Java中的取余运算符(`%`)...