• static{}语句块


    1、static{}(即static块),会在类被加载的时候执行,且仅会被执行一次,一般用来初始化静态变量和调用静态方法。

    public class Hello {
    
        public static final int i;
        static{
             i=1;
             System.out.println("static 块语句");
         }
        public Hello() {
            // TODO Auto-generated constructor stub
        }
        static void say(){
            System.out.println("say----------------");
        }
    }

    static块语句的执行时机(即何为加载?)

    1、实例化一个类的时候

            Hello t=new Hello();

    2、类装载

    Class.forName("main.Hello");

    或者

    Hello t=(Hello)Class.forName("main.Hello").newInstance();

    3、调用类的静态方法或静态变量

    Hello.say();

    static块语句在say的前面执行。

    4、如果静态变量在定义的时候就赋给了初值(如 static int X=100),那么赋值操作也是在类加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,同样遵循“先定义先执行”的原则;

        public static int x=500;
        static{
             System.out.println("static 块语句--x="+x);
             i=1;
             x=90;
             System.out.println("static 块语句--x="+x);
         }

    输出Hello.x

    static 块语句--x=500
    static 块语句--x=90
    90

    5、如果定义final成员变量不直接赋值,则必须在static块语句赋值,否则出错

    注意:

    1、调用类的已赋值静态常量的时候,是不会加载类的,即不会执行static{}语句块

    (这是java虚拟机的规定,当访问类的静态常量时,如果编译器可以计算出常量的值,则不会加载类,否则会加载类)

    2、用Class.forName()形式的时候,我们也可以自己设定要不要加载类,如将Class.forName("Test")改为 Class.forName("Test",false,StaticBlockTest.class.getClassLoader()),你会发现程序什么都没有输出,即Test没有被加载,static{}没有被执行。

    类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载。

    Done!

  • 相关阅读:
    JAVA SE 基础复习-虚拟机
    不错的博客
    如何分析问题
    由Contains开始的
    相关有用链接
    C++语法一二
    关于论文的些许想法
    C++中一些容易迷惑的语法点总结
    android中各种组件的生命周期问题
    android开源框架thinkinandroid相关研究
  • 原文地址:https://www.cnblogs.com/xingyyy/p/4230922.html
Copyright © 2020-2023  润新知