首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,...初始化父类的普通成员变量和代码块,在执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; 类的加载顺序: 父类静态成员变量、静态块>子类静态成员变量、 静态块>...父类普通成员变量、非静态块>父类构造函数>子类 普通成员变量、非静态块>子类构造函数 静态代码块:随着类的加载而执行,而且只执行一次 非静态代码块:每创建一个对象,就执行一次非静态代码块 关于各个成员简介

50430

【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

加载 -> 连接 ( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池的初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用类中的常量值 ; 在 连接 的 准备 阶段 , 为 普通 的...静态变量 进行 默认赋值 , 但是针对 静态常量 , 直接进行 指定赋值 ; 但是 普通的 静态变量 的 指定赋值 , 是在 初始化 阶段 完成的 ; 类 在 " 初始化 " 阶段 , 调用 静态代码块...; 二、常量加载示例 ---- 类加载时 , 如果只用到了类中的常量 , 则只进行 " 加载 -> 连接 ( 验证 , 准备 , 解析 ) " 两个过程 : public class Student...静态代码块 没有被执行 , 说明 类加载 的流程中 , " 初始化 " 步骤 , 没有被执行 ; 找到 Student.class 字节码文件 , 然后使用 javap -v -Student.class...; 出于最大限度性能优化的考虑 , 如果不使用该类的其它值 , 就不会执行 " 初始化 " 阶段 ; 因此这里不会调用 静态代码块 中的代码 ; Constant pool: #10 = Integer

3.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解Java变量

    # 静态变量的特点 静态变量只能使用 static 关键字进行修饰,它不能在方法中进行声明,不论是静态方法还是非静态方法。 静态变量会在程序运行前进行初始化,并且只初始化一次。...静态变量会有一个初始化顺序,我们后面说。 静态变量的所有实例共享同一个副本。...局部变量仅在方法的声明、构造函数或者块内可见,局部变量只能在调用这些方法、构造函数或者块的内部使用 局部变量没有默认值,所以局部变量应该在第一次使用或者声明的时候就应该初始化完成 #...成员变量和实例变量是否相同呢?我们下面有个回答 第一句就给出,实例变量和类变量都称为成员变量,然后给出了 JDK 官网手册对变量的定义。...换句话说,对于每个对象来讲,实例变量的值都是唯一的; 类变量(静态属性) :类变量就是使用 static 修饰符声明的字段,这就会告诉编译器:无论该类被实例化了多少次,该变量只存在一个副本。

    20020

    CC++中static变量和static函数的用法

    因为静态 成员数据不属于任何一个对象,所以他不能在构造函数中进行初始化(否则每定义一个对象就要 初始化一次),所以在类定义的时候就应该初始化。...这样会出现另外一个问题,如果在类的定义 中对静态成员数据进行初始化,那么当重复包含类头文件定义的时候,静态变量就会被重复初始 化。解决这个问题可以把类的声明和实现分开到两个文件中。...语言中使用,第三种只在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准). (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 下面就这三种使用方式及注意事项分别说明...(对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数,不管是否是static类型) 特点: static局部变量的”记忆性”与生存期的”全局性” 所谓”记忆性...使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

    2.3K30

    static–静态变量与普通变量的区别

    而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。...static全局变量与普通的全局变量 static全局变量只初使化一次,作用域被限制在该变量的源文件内有效,防止在其他文件单元中被引用 static局部变量和普通局部变量 static局部变量只被初始化一次...规则如下:  一个类的static构造函数在给定的应用程序域中仅执行一次。static构造函数由在应用程序域的下列事件的首次发生时触发:  1)该类的实例被创建。  ...只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。...对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用

    75810

    硬钢百度面试!

    具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。...,即使重名了也互不干扰 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在...,但不能使用 考虑类的情况 static成员变量:只与类关联,不与类的对象关联。...静态局部变量只初始化一次,并且之后再次调用函数时不再重新分配空间和赋初值,而保留上次函数调用结束时的值(而普通局部变量每调用一次就会重新分配空间并赋一次初值) 静态局部变量默认初始化为0 函数调用结束之后静态局部变量依然存在...,就应该在引用之前使用extern关键字对该变量进行声明,之后该全局变量的作用域就从声明处一直到文件结尾了 将某一个源文件中全局变量的作用域扩展到其他源文件中:一个C++项目很多情况是由多个源文件构成,

    19920

    Effective Java要点笔记

    有心的使用者会困惑,总是想看看到底是咋实例化的,单例?...再讲单例实现 常见的有三种 枚举 静态属性或静态块 双重检查锁 不需要实例化的类 尽量把构造器私有化,比如一些工具类,避免不必要的对象意外创建 对象如果可重用,就少创建点 但是如果因为多创建了实例而提高了程序的清晰性...当非静态成员类的实例被创建的是时候,它和外围实例之间的关联关系也随之建立起来&不能被修改 每当编写方法和构造器的时候,应该考虑他它的参数有哪些限制,应该把限制写到文档中,并在方法的开头处加上限制逻辑,私有方法...要注意是否允许调用者修改其内部的组件, 关于方法签名的设计: 方法名称尽量要风格一致,并选择大众认可的名称 类的方法设计太多,会使类难以学习,使用,文档化,测试以及维护 避免过长的参数列表,目标参数个数...要使局部变量的作用域最小化,最佳实践是在第一次使用它的地方声明它 异常 只针对异常的情况才使用异常, 不能利用异常来做其它投机取巧的逻辑 对于可恢复的情况且允许调用者能够进行适当的恢复使用受检异常,

    44210

    04.Java对象和类

    变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。...实例化:使用关键字new来创建一个对象。 初始化:使用new创建对象时,会调用构造方法初始化对象。 下面是一个创建对象的例子: ?...import 的作用是为了简化使用 package 之后的实例化的代码。假设 ....(数据共享时静态化) 该成员变量的数据是否是所有对象都一样: 如果是,那么该变量需要被静态修饰,因为是共享的数据。...变量在创建对象时实例化。成员变量可被类中的方法、构造方法以及特定类的语句块访问。

    95760

    Java中的static关键字详解

    ,在类被加载时自动进行初始化,可以通过类名.成员名直接调用(普通成员需要创建类的实例对象,通过实例对象.成员名进行调用); 二、static静态变量 1、变量分类 类的成员变量按照是否被static修饰...; 无法调用非静态成员; 4、静态变量使用场景 适合作为全局变量进行定义; 三、static静态方法 1、方法分类 类的成员方法按照是否被static修饰,分为静态成员方法和普通成员方法; 2、静态方法和普通变量的区别...备注:实例对象也可以调用静态方法,但不建议不这么做; 3、静态方法的优缺点 优点: 方便:属于类级别的,不需要创建对象就可以直接使用; 缺点: 线程不安全; 内存负担:长时间驻留在内存中,若静态变量过多...4、静态方法使用场景 经常被使用到工具类中; 四、static静态代码块 1、概述 static静态代码块不属于任何类成员,可以出现多个,类加载时会按照先后顺序执行,只会执行一次!...2、使用场景 对静态变量进行初始化; 五、补充 1、静态代码块、普通代码块、构造函数执行机制 静态代码块: 当类加载时,执行静态代码块,只执行一次; 普通代码块、构造函数: 当创建对象时,执行普通代码块和构造函数

    8610

    c#类及其方法和属性关键字权限

    ,并且不能访问任何对象的实例变量,只能被重载,而不能被重写,因为静态方法不属于类的实例成员,调用时也通过(类名.成员名)方式调用 使用选择:当定义的类不需要进行实例化时,我们使用静态类;如果需要实例化对象...,需要继承等特性时,应该使用非静态类,并且将统一使用的变量和方法设为静态的,那么所有实例对象都能访问。...(1)静态和非静态的不同的地方,就是静态的从程序一启动就会一直占用内存,而非静态的只在使用后(实例化)后才会占用内存.但是每实例化个一个对象时又会另外占用内存....像一个登录后台的方法,你只在登陆时候调用一次,就没有必要做成静态的了.那样一直驻存在内存中.在大型项目中,你如果都使用静态的那得要多少内存去支撑呀.嘿嘿 简单点,就是它经常要被调用时,就用静态的.相反则用非静态的...静态类可以有构造函数,但是只被调用一次。 就上面说的程序配置数据部分,如果使用非静态类,那么你需要在任何有可能访问到他的代码前手动初始化他,并且还要将他赋给一个静态变量后才能使用。

    72541

    02.创建型:单例设计模式2

    02.饿汉式实现方式饿汉式的实现方式比较简单。在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。...具体的代码实现如下所示://饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton { //static修饰的静态变量在内存中一旦创建,便永久存在 private...最好的方法应该在用到的时候再去初始化。不过,我个人并不认同这样的观点。...}}优缺点优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗代码分析当第一次加载Singleton 类的时候并不会初始化INSTANCE ,只有第一次调用Singleton...因此,第一次调用getInstance()方法会导致虚拟机加载SingletonHolder 类,这种方式不仅能够确保单例对象的唯一性,同时也延迟了单例的实例化。

    27220

    JavaScript 设计模式学习第七篇- 单例模式

    也就是说,第二次使用同一个类创建新对象的时候,应该得到与第一次创建的对象完全相同的对象。 1....FuncClass 的实例化流程了,而懒汉式的 LazySingleton 中 FuncClass 的实例化过程是在第一次 new 的时候才进行的。...单例模式在创建后在内存中只存在一个实例,节约了内存开支和实例化时的性能开支,特别是需要重复使用一个创建开销比较大的类时,比起实例不断地销毁和重新实例化,单例能节约更多资源,比如数据库连接; 2....单例模式对扩展不友好,一般 不容易扩展 ,因为单例模式一般自行实例化,没有接口; 2. 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化; 7....单例模式的使用场景 那我们应该在什么场景下使用单例模式呢: 1. 当一个类的实例化过程消耗的资源过多,可以使用单例模式来避免性能浪费; 2.

    49320

    【趣学程序】java面向对象(二)

    publicbooleanequals(Objectobj){} String类覆写了 Object的equals方法:只比较字符的内容是否相同 在String类中 equals()和 ==的区别 equals...直接写在类中的代码块: 优先于构造方法执行,每次实例化对象之前都会执行构造代码块。...使用static 修饰的构造代码块: 优先于主方法执行,优先于构造代码块执行,不管有创建多少对象,静态代码块只执行一次,可用于给静态变量赋值; 测试各代码块的优先级 /** * * 优先级顺序:...静态代码块  > 构造代码块 > 普通代码块 * 备注:无论创建几个对象,静态代码块只执行一次!...;//实例化对象的时候才会去调用! } static{ System.out.println("我是静态代码块!")

    38010

    C语言之static的应用

    而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。...由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 static全局变量只初使化一次,防止在其他文件单元中被引用;   2....static局部变量只被初始化一次,下一次依据上一次结果值;   3. static函数与普通函数有什么区别?    static函数与普通函数作用域不同,仅在本文件。...只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。...对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件. static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

    50730

    【说站】php单例模式如何理解

    php单例模式如何理解 说明 1、当需要保证对象只有一个实例时,单例模式非常有用。把创建对象的控制权交给了一个单一的点,应用程序随时只存在,只存在一个实例。单例不应该在类的外部实例。...注意 2、必须访问级别为private的构造函数,以防止类被随机实例化。 静态变量必须具有保存类实例。 必须有访问此实例的公共静态方法。...该方法通常被命名为getInstance() 必须有一个私有的空的clone方法,防止被复制。...实例 class Single {     public static $_instance;       private function __construct()     {     }       ...    {         echo "Hi \n";     } }   $single = Single::getInstance(); $single->sayHi(); 以上就是php单例模式的理解

    40930

    设计模式之单例模式

    使用单例模式,可以确保一个类只有一个实例,并且易于外部访问,还可以节省系统资源。如果在系统中,希望某个类的对象只存在一个,就可以使用单例模式。 那怎么确保一个类只有一个实例呢?...总结为: 私有构造方法 指向自己实例的私有静态变量 对外的静态公共访问方法 单例模式分为饿汉式和懒汉式。它们的主要区别就是,实例化对象的时机不同。饿汉式,是在类加载时就会实例化一个对象。...懒汉式,则是在真正使用的时候才会实例化对象。...4)使用静态内部类 思考一下,由于类加载是按需加载,并且只加载一次,所以能保证线程安全,这也是为什么说饿汉式单例是天生线程安全的。...同样的道理,我们是不是也可以通过定义一个静态内部类来保证类属性只被加载一次呢。

    58710

    如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)

    A:面向过程 优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大。...调用非静态方法 C 也是如此,你不清楚这个方法 C 中是否调用了费静态变量 1.6.2 什么是静态变量 static 修饰的变量也称作静态变量,静态变量属于类,所以也称为类变量,存储于方法区中的静态区,...内容 } 执行: 静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。 作用: 一般情况下,如果有些代码需要在项目启动的时候就执行,这时候 就需要静态代码块。...作用 :和构造函数的作用类似,都能对对象进行初始化,并且只创建一个对象,构造代码块都会执行一次。...StudenTest 是一个测试类,测试类一般只创建对象,调用方法,所以这个判断应该定义在Student类中。需要使用逻辑语句,而逻辑语句应该定义在方法中。

    1.2K10

    一起学习设计模式--01.单例模式

    Singleton(单例): 在单例类的内部实现只生成一个实例,同时它提供一个静态的GetInstance()方法,让客户可以访问它的唯一实例。...定义一个静态变量,并在定义的时候就实例化单例类,这样在类加载的时候就已经创建了单例对象。...如果单例类实例化需要的时间比较长,程序运行的时候又用不到,那么将会增加系统不必要的加载时间。 懒汉式单例类:在类第一次使用时创建。好处: 无需一直占用系统资源,实现了延迟加载。...静态构造函数: 是由.Net框架来执行的 没有参数,因为框架不知道我们要传什么参数 必须以static标识,并且没有 public 和 private 静态构造函数中不能初始化实例变量 静态构造函数的调用时机...,是在类被实例化或静态成员被调用的时候进行调用,并且由.NET框架来调用静态构造函数来初始化静态成员变量 一个类中只能有一个静态构造函数 无参的静态构造函数和无参的构造函数可以共同存在 静态构造函数只会被执行一次

    55510
    领券