Java static{} 语句详解
来源:互联网 发布:抓阄软件 编辑:程序博客网 时间:2024/06/07 03:27
一、static{}(即static块)、会在类被加载的时候执行且仅会执行一次,一般用来初始化静态变量和静态方法。
因为JVM虚拟机的生命周期中一个类只被加载一次;又因为static{}是伴随类加载执行的,所以不管你new多少次对象实例,static{}都只执行一次。
二、准确理解类加载的准确含义:
1、实例化一个类时,Test t = new Test();和Test t =(Test)Class.forName().newinstance();等价
2、调用类的静态方法的时候,需将main()函数的内容改为:类名.方法名。
3、调用类的静态变量的时候,需将main()函数的内容改为:System.out.println(类名.变量)
注意:1、在调用类的静态常量的时候,是不会加载类的,即不会执行static{}语句块。(JVM的规定,当访问类的静态常量时,如果编译器可以计算常量的值,则不会加载类,否则会加载类)
2、用Class.forName()形式的时候,我们也可以自己设定要不要加载类,如将Class.forName(“Test”)改为Class.forName(“Test”,false,StaticBlockTest.class.getClassLoader()),则Test没有被加载,static{}没有被执行。
三、static{}语句块的执行次序:
1、当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;
2、先执行完static{}语句块的内容,才会执行调用语句;
public class Test{ static{ System.out.println(1); } static { System.out.println(2); } static { System.out.println(3); } public static void main(String args[]){ System.out.println(5); } static { System.out.println(4); }}结果:12345
3、如果静态变量在定义的时候就赋给了初值(如static int X=100),那么赋值操作也是在类的加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,同样遵循“先定义先执行”的原则;
package test.java;class Test2{public static int X=200;static{ System.out.println(X); X=300; System.out.println(X);}}public class Test{public static void main(String args[]){ System.out.println(Test2.X);}}结果:200300300
总结:类加载特性:
**1、在虚拟机的生命周期中一个类只被加载一次。
2、类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。**
类加载的时机:
1)第一次创建对象要加载类.
2)调用静态方法时要加载类,访问静态属性时会加载类。
3)加载子类时必定会先加载父类。
4)创建对象引用不加载类.
5) 子类调用父类的静态方法时
(1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类
(2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类
6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类。
参考链接:
http://blog.csdn.net/newjerryj/article/details/8650268
- Java static{} 语句详解
- Java:static{}语句块详解
- Java static{}语句块详解
- Java static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- java中static{}语句块详解
- ubuntu14.04安装python-dev提示版本依赖的解决办法
- 仿微博导航条
- 《UNIX环境高级编程》笔记76--规范模式和非规范模式
- 图文演示关于系统流程图如何制作的使用方法
- WIN10 FOR mysql-5.7.18安装,MySQL服务无法启动
- Java static{} 语句详解
- 什么是BI、ETL、DW
- Java Web 3.2.3课后思考
- 感知器算法----Matlab实现
- Codeforces 474F(分块)
- Hadoop2.6.4运行Wordcount程序
- 属性动画AnimatorDemo
- Android基于线性加速度计的惯性导航
- 什么是手机App界面设计规范?