一直想写点东西,但是不知道从哪里下手,想来想去,我们搞Java的,还是从jvm,从Java基础上说起吧。言归正传,先上代码,后分析!
public class Person {
static{
System.out.println("Person 静态块");
}
public Person(){
System.out.println("Person 构造函数");
}
}
public class Teacher {
public Teacher(){
System.out.println("Teacher 构造函数");
}
public Teacher(String name){
System.out.println("Teacher 构造函数+++" + name);
}
}
public class Student extends Person {
private Teacher t1 = new Teacher();
private static Teacher t2 = new Teacher("李四");
static {
System.out.println("Student 静态块1");
}
{
System.out.println("Student 非静态块1");
}
{
System.out.println("Student 非静态块2");
}
static {
System.out.println("Student 静态块2");
}
public Student() {
System.out.println("Student 构造函数");
}
public static void test() {
System.out.println("Studeng 静态方法");
}
}
public class Test {
public Test() {
System.out.println("Test 构造函数");
}
static {
System.out.println("Test 静态块");
}
{
System.out.println("Test 非静态块");
}
public static void main(String[] args) {
Test t = new Test();
t.startTest();
}
public void startTest() {
System.out.println("------------1-------------");
Student.test();
System.out.println("------------2-------------");
Student s = new Student();
System.out.println("------------3-------------");
}
}
运行结果:大家可以先试一遍再运行
Test 静态块
Test 非静态块
Test 构造函数
------------1-------------
Person 静态块
Teacher 构造函数+++李四
Student 静态块1
Student 静态块2
Studeng 静态方法
------------2-------------
Person 构造函数
Teacher 构造函数
Student 非静态块1
Student 非静态块2
Student 构造函数
------------3-------------
那么,现在解析一下。从运行结果1,我们得到类加载顺序:
静态块>非静态块>构造函数
从运行结果2,我们得到类加载顺序:
静态块(包括 static区和静态变量)>非静态块(包括 初始化区和实例变量)>构造函数。当有多个static区或者静态变量时,按代码的先后顺序进行加载,且只加载一次;非静态块与静态块加载顺序规则相同;
构造函数,只有当实例化类时(new),才会加载
从运行结果3和运行结果2得到的类加载顺序是:
在2的结果下,父类加载顺序>子类加载顺序
程序运行过程是:
1、在Test类中,首先加载static区、初始化区、构造函数,执行main方法
2、到达Student.test(),开始加载Student类,发现Student类有父类Person,先不加载Student,开始加载Person类,加载Person类的static区;返回加载Student,开始加载静态区(包括静态变量和static区),按代码的先后顺序,进行加载;执行静态方法test()
3、Student s = new Student(),实例化Student,因为Student类有父类Person,所以先加载Person的构造函数(静态块只加载一次,在过程2中都加载过了);返回加载Student,(静态块加载过了)加载非静态块,按代码的先后顺序,进行加载;加载Student构造函数
4、mian方法执行完毕
相关推荐
### JVM实战-JVM类加载机制案例分析 #### 实验背景与目标 本次实验的主要目的是深入理解Java虚拟机(JVM)中的类加载机制。通过实践操作,掌握类的加载、连接与初始化过程,了解不同类型的类加载器及其工作原理,...
在执行方法时JVM提供了invokestatic、invokevirtual、invokeinterface和invokespecial四种指令来执行 ...(4)invokespecial:JVM对于初始化对象(Java构造器的方法为:)以及调用对象实例中的私有方法时。
总结,Java性能调优中,理解JVM对象创建和内存分配机制是关键。通过合理的设计、优化策略以及JVM参数配置,可以显著提升应用的运行效率和内存管理效果。在实际工作中,应结合监控工具(如VisualVM、JProfiler等)...
垃圾回收是JVM中的一种机制,用于回收无用的对象以释放内存空间。垃圾回收机制可以分为两种:部分垃圾回收和完全垃圾回收。部分垃圾回收是指JVM在年轻代中回收无用的对象,而完全垃圾回收是指JVM在整个堆中回收无用...
理解JVM的构造对于优化代码性能、排查问题以及深入理解Java编程至关重要。以下是对"JVM构造思维导图"的详细解读。 1. **JVM结构** JVM主要由以下几个部分构成: - **类加载器子系统(ClassLoader Subsystem)**:...
【标题】"002 RJPOS:完成JVM对象的设计" 在Java开发中,理解JVM(Java虚拟机)的工作原理对于优化程序性能、解决内存问题以及深入掌握Java编程至关重要。RJPOS项目中的"完成JVM对象的设计"这一主题,主要探讨了如何...
3. **对象构造**:在分配好内存之后,JVM将执行构造方法,以初始化对象的状态。构造过程包括对对象头和实例数据的初始化。 4. **设置对象头**:对象创建完成后,JVM需要为对象设置必要的标志位,如哈希码、GC年龄等...
5. 垃圾回收:JVM自动管理内存,通过垃圾回收器回收不再使用的对象。 三、JVM编译过程 1. 分析和输入到符号表(Parse And Enter): - 词法分析:将源代码分解成一个个有意义的符号(tokens)。 - 语法分析:构建...
Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机,它是Java平台的核心组件之一。JVM使得Java程序可以在多种操作系统上运行而无需重新编译。这种跨平台性主要得益于Java字节码的独立性,它不是针对任何特定硬件或...
- 显式构造方法:可以通过定义一个或多个构造方法来自定义对象的初始化方式。 ```java public class Student { private int id; // 无参构造方法 public Student() { this.id = 0; // 初始化id } // 带...
JVM通过执行时验证机制确保字节码的安全性,防止恶意代码的执行。 #### 另一个示例 假设我们有一个简单的Java程序,包含两个类`Main`和`Helper`。`Main`类中有一个`main`方法,该方法调用了`Helper`类的一个静态...
### 面试必问之JVM与性能优化——关键知识点解析 #### 一、JVM加载Class文件的原理机制 在Java开发过程中,深入理解JVM如何加载Class文件至关重要,尤其是在面试时,这一知识点往往是考察的重点之一。下面将详细...
5. 内存管理(Memory Management):包括垃圾收集机制,自动回收不再使用的对象,避免内存泄露。常见的垃圾收集算法有标记-清除、复制、标记-整理和分代收集等。 6. 安全管理器(Security Manager):确保Java程序...
实际上变量v在准备阶段过后的初始值为0而不是8080,将v赋值为8080的putstatic指令是程序被编译后,存放于类构造器方法之中。但是注意如果声明为:public static final int v = 8080;在编译阶段会为v生成Constant...
#### 一、JVM的内部构造 JVM(Java虚拟机)是Java程序运行的基础环境,它为Java程序提供了一个独立于硬件平台的抽象计算机模型。JVM的设计使得Java程序可以跨平台运行,即编写一次代码可以在多个平台上运行。 - **...
JVM的核心组件之一就是字节码解释器,它负责执行字节码指令。此外,JVM还包含一个即时编译器(JIT Compiler),能够将热点代码编译成本地机器码,提高执行效率。 #### 3. 内存分配与回收策略 - **内存分配**:对象...
垃圾回收是JVM的自动内存管理机制,它负责回收JVM堆中不再使用的对象所占用的内存空间。主要的GC算法包括标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)和分代收集(Generational Collection...
Java虚拟机(JVM)作为Java程序的运行环境,其核心组件之一便是内存管理系统。理解JVM的内存布局对于开发高性能的应用程序至关重要。本文将详细介绍JVM内存结构及其各个组成部分的功能,并探讨如何通过优化这些组件来...
6. **方法调用与返回指令**:`invokevirtual`用于调用对象的虚方法,`invokespecial`用于构造函数调用和私有方法,`return`表示方法的结束。 7. **异常处理指令**:如`athrow`抛出异常,`catch`配合`try-catch`块...