类的加载二

class A
{
    public static final int a = 6 / 3;
    static
    {
        System.out.println("static");
    }
}

public class FinalTest
{
    
    public static void main(String[] args)
    {
        System.out.println(A.a);
    }

}

代码的运行结果为:2

package proxy;

import java.util.Random;

class A
{
    public static final int a = new Random().nextInt(100);
    static
    {
        System.out.println("static");
    }
}

public class FinalTest
{
    
    public static void main(String[] args)
    {
        System.out.println(A.a);
    }
}

运行结果为:

static

30

这是因为第一个例子在类编译的时候就确定了值为2.类的初始化涉及到主动使用,这个类没有初始化。第二个例子只有在类运行的时候才知道a的值是多少。所以在运行时必须初始化。

如果把final去掉则在例子一中静态代码块也能执行。



package proxy;

class Parent
{
    static int a = 3;
    static
    {
        System.out.println("Parent static block!");
    }
    
    static void doSomething()
    {
        System.out.println("Parent doSomeThing!");
    }
}

class Child extends Parent
{
    static
    {
        System.out.println("Child static block!");
    }
}

public class Test2
{
    
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(Child.a);
        Child.doSomething();
        
    }
    
}

结果:

Parent static block!
3
Parent doSomeThing!

只有当程序访问的静态变量或静态方法确实是当前类或当前接口中定义时,才可以认为是对类或接口的主动使用。



package proxy;

class Parent
{
    
    static
    {
        System.out.println("Parent static block!");
    }
    
}

public class Test2
{
    
    /**
     * @param args
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws ClassNotFoundException
    {
        ClassLoader cl = ClassLoader.getSystemClassLoader();
        Class<?> cla = cl.loadClass("proxy.Parent");
        System.out.println("-------------------------------");
        cla = Class.forName("proxy.Parent");
    }
    
}

打印结果:

-------------------------------
Parent static block!


第一个只是把类加载到内存,并没有对类的主动使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值