在上章中讲解了类文件的生成和包含的信息,但是要加载到jvm中才能启动和运行;
#、一直以为 初始化和实例化 是一个意思,今天就来甑辩一下他们是否相同?
参看:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/
http://blog.csdn.net/moreevan/article/details/6968718
开头说到 :类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,[这里说的是类初始化和对象的初始化,显然这是两个不同的概念,只是他们在大多数情况下是紧密执行的];
一个类的整个生命周期如下:
在装载(loading)阶段,类装载器(Bootstrap ClassLoader 或者自定义的ClassLoader) 把编译形成的class文件载入内存;
连接(lingking)阶段又可以分为三个子步骤:验证(verification)、准备(preparation)和解析(resolution)。
验证阶段 确保java文件数据格式 的正确性,并适于JVM使用。
准备阶段 JVM为静态变量/静态块分配内存空间;
解析过程 就是在class文件的常量池中寻找类、接口、字段和方法的符号引用,当程序运行时需要使用某个符号引用可以再去解析它。
初始化(initialization),初始化的5个启动点:
1.new关键字创建实例(对象实例化会启动初始化过程)
2.反射方法实例化对象(实例化)
3.调用子类时,先初始化父类(可能不会调用其构造方法)
4.初始化主类(主类一般不会实例化)
5.其他指令或句柄如:getstatic、putstatic、invokestatic、REF_getStatic、REF_putStatic、REF_invokeStatic。
注:初始化接口并不需要初始化它的父接口。
所以jvm的启动不会主动进行类初始化,除了主类;
从前4条,可以理解,初始化和实例化是完全不同的概念,今后就不要再混淆了;
静态块 就是常说的 初始化方法:
public class Demos1 { static int a=45; static { System.out.println("i'm static block----"+a); } public static void main(String[] args) { System.out.println("i'm main funtion----"+a); } }} 输出: i'm static block----45 i'm main funtion----45
可以理解为,初始化就是为静态块、静态属性、静态方法分配空间的过程,从类的生命周期图看,他们是先于实例化(构造方法)执行的;
注:静态属性是要先于静态块执行的 储存在静态数据区,静态方法、方法也是在准备阶段存放在method area的;
所以当new一个对象实例的时候,先启动类的初始化过程(静态属性优先静态块执行),而不是先执行构造方法;
class Son{ static{ System.out.println("ok"); } static int a = 34; } public class Demos1 { public static void main(String[] args) { System.out.println(Son.a); } } 输出: ok 34
在这段代码中,调用了Son的属性,这个过程会对Son进行初始化,所以就会先执行Son的初始化过程,后返回; 所以先打印ok而不是34;
注:Son.class不会执行初始化方法;
class Father{ static { System.out.println("父类的初始化方法"); } static int b = 35; } class Son extends Father{ static int a = 34; static{ System.out.println("ok"); } } public class Demos1 { public static void main(String[] args) { System.out.println(Son.b); } } 输出: 父类的初始化方法 35
上段代码,没有输出ok,由于先要对父类进行初始化,先执行b的赋值和打印"父类的初始化方法",完成之后发现b是父类的属性,就不再需要对子类Son初始化了,等以后需要初始化Son时再初始化,如: System.out.println(Son.a);执行Son的初始化方法;
jvm运行时,初始化方法只执行一次,静态属性赋值可以执行多次;
class Father{ static { System.out.println("父类的初始化方法"); } static final int b = 35; } class Son extends Father{ static int a = 34; static{ System.out.println("ok"); } } public class Demos1 { public static void main(String[] args) { System.out.println(Son.b); } } 输出: 35
这段代码连父类的初始化方法都没有执行, 这又是为什么呢?
因为jvm将final声明的常量,放入到NonInitialization类的常量池中去了,它是属于NonInitialization的属性,与Father和Son活生生的脱离了关系,调用Son.b时指向了NonInitialization的这个属性,而不再执行类初始化方法;加上System.out.println(Son.a);可以得到验证:这一步才执行Father的初始化方法;
-XX:+TraceClassLoading
相关推荐
这是因为final方法已被声明为不可改变,静态方法与类关联而不是实例,而private方法在子类中是不可见的,所以无法在子类中定义相同签名的方法。 多态性是面向对象编程的一个核心特性。它允许我们通过子类对象调用...
但是,抽象类可以拥有构造方法,这是因为构造方法主要用于初始化对象,而不是创建对象。当子类实例化时,会调用抽象类中的构造方法进行初始化。 在Java中,实例化抽象类的一种常见方式是通过子类继承并实现抽象方法...
Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...
这会执行构造器中的代码,初始化对象的状态。 3. **构造器的执行**:当`new`关键字被调用时,会执行对应的构造器。在这个例子中,构造器将字符串"John"赋值给`name`属性。 4. **返回对象引用**:构造器执行完毕后...
其他初始化器,称为便利初始化器(convenience initializers),最终会调用指定初始化器,确保完整地初始化对象。 实例变量(instance variables)在Objective-C中存储对象的状态。它们的访问控制可以是`@public`、...
在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...
Java类的初始化和实例化详解 Java类的初始化和实例化是Java编程语言中两个非常重要的概念,它们都是Java类生命周期的重要组成部分。...只有当对象实例化进入堆内存中以后,非静态变量才会被初始化赋值。
主要是对php初始化对象和析构函数的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助。当对象内部的操作执行完毕的时候,__destruct()被调用, 然后对象所使用的内存被释放出来。
然而,在涉及到类继承时,一个重要的问题是类实例化时的初始化顺序。本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象...
这意味着静态成员和静态初始化块对于所有类的实例都是共享的,而实例成员和实例初始化块则是每个对象独有的。 在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时...
3. **静态成员变量与实例成员变量的初始化顺序** ```java public class TestOrder { // 静态成员变量初始化 public static TestA a = new TestA(); // 静态初始化块 static { System.out.println("静态初始...
在VB中,有多种方法可以初始化数组,本篇文章将深入探讨这些方法,并通过实例来说明。 ### 1. 静态初始化 静态初始化是在声明数组的同时为每个元素赋予特定的初始值。在VB中,可以使用以下语法: ```vb Dim 数组...
在实际编程中,如果类的成员对象是其他类的实例,我们同样可以通过初始化列表传递参数给这些成员对象的构造函数。例如: ```cpp class OtherClass { public: OtherClass(int value) : m_value(value) {} // ... ...
- **初始化对象**:通过构造器初始化新创建的对象,设置其初始状态。 - **赋值**:最后,将创建好的对象的引用赋给之前声明的引用变量。 例如,下面的代码展示了如何创建一个`A`类的对象: ```java A a1 = new A()...
构造方法用于初始化类的新实例,普通方法执行特定任务,静态方法与类关联而非实例,抽象方法则在接口或抽象类中定义,需由子类实现。方法的参数传递、返回值和重载也是重要的知识点,理解这些能帮助我们编写更灵活...
在Python中,面向对象主要涉及类(Class)的创建、实例化(Instantiation)、属性(Attributes)和方法(Methods)。 1. 类的创建与实例化: 在Python中,类通过`class`关键字定义。类名通常遵循“驼峰式命名”,...
spring配置对象实例化后执行的方法,两种实现比对,通过InitializingBean接口,并实现arterPropertiesSet()方法;或者通过applicationContext.xml配置init-method属性
总结,这个压缩包文件提供了关于Java中类和对象初始化的实例,包括静态和非静态成员的处理、继承、构造函数的调用顺序等。通过分析并运行这些代码,开发者可以更深入地理解Java的初始化机制。对于初学者来说,这是一...
当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...