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!

时间: 2024-10-19 01:59:45

static{}语句块的相关文章

static{}语句块详解

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例: 示例一 [java] view plain copy class Test{ public static int X=100; public final static int Y;=200 public Test(){ System.out.prin

java中static{}语句块详解

1.当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行: 2.先执行完static{}语句块的内容,才会执行调用语句: 示例二 public class TestStatic{    static{        System.out.println(1);    }    static {        System.out.println(2);    }    static {        System.out.println(3);    }    p

static语句块的执行时间

package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); System.out.println("p还没有初始化"); Class cls=Person.class; System.out.println("执行了语句:Class cls=Person.class;不知道static语句在这条语句之前是否有输出"); Person

Java中的static{}子句块

static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例: 示例一 class Test{ public static int X=100; public final static int Y;=200 public Test(){ System.out.println("Test构造函数执行");

Java中为什么finally语句块一定会被执行?

通过阅读JVM规范,得知编译器是通过冗余来实现finally语句块的.我们可以写段代码做一个验证. JDK版本:8 如下面的代码: import java.io.*; public class Main { public static void main(String[] args) { try { foo(); } catch (IOException e) { int a = 100; } catch (Exception e) { int b = 200; } finally { int

Java静态语句块、语句块、构造方法执行顺序

package com.imooc.practice; class Parent{ public Parent(){ System.out.println("Parent构造方法执行!"); } { System.out.println("Parent非静态语句块执行!"); } static{ System.out.println("Parent静态语句块执行!"); } } public class Child extends Parent{

关于 Java 中 finally 语句块的深度辨析

可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子. 清单 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1

左右 Java 于 finally 深度分析语句块

首先,让我们来问你一个问题:finally 声明块将运行? 很多人认为 finally 语句块是一定要运行.其中还包括了一些非常有经验的 Java 程序猿.不幸的是,没有像很多像人们想象,对于这个问题,当然,答案是否定的,让我们来看看这个样品之后. 清点1 public class Test { public static void main(String[] args) { System.out.println("return value of test(): " + test())

Finally语句块的运行

一.finally语句块是否一定运行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是.当然他们的回答是正确的,经过试验.至少下面有两种情况下finally语句是不会被运行的: (1)异常捕获机制finally块与try和catch块是关联的.既然是关联的假设try...catch...finally语句逻辑上达不到没有被运行,如在try语句之前就返回了,这样finally语句就不会运行,这也说明了finally语句被