天天看点

java之静态加载和动态加载类(隐式和显式)

    java语言是先把Java源文件编译成后缀为class的字节码文件,然后再通过ClassLoader机制把这些类文件加载到内存中,最后生成实例执行

    静态加载:程序编译时就自动加载所有的类

    对象的生成一般经过两个步骤:

    1、加载到内存中生成Class的实例对象

    2、通过new关键字生成对象

  动态加载:程序运行时通过Class.forName方法进行动态加载,加载类的过程中会初始化该类的static变量和代码块等,非static类型对于forName而言仅加载类, 并不执行任何代码

  //例一    

    public class Test54

{

    public static void main(String[] args)

        throws Exception

    {

        // 动态加载,绝对路径--运行时

        Class.forName("Utils");

    }

}

class Utils

{

    public static final String NAME = "这是我的地盘";

    // 静态代码块

    static

    {

        System.out.println("Do Something");

        System.out.println(NAME);

    }

}

运行结果:

Do Something

这是我的地盘

//例二    

public class Test54

{

    public static final String CAT = "Cat";

    public static final String DOG = "Dog";

    public static void main(String[] args)

        throws Exception

    {

        Test54 test54 = new Test54();

        test54.noise(CAT);

    }

    @SuppressWarnings("rawtypes")

    public void noise(String animalClass)

    {

        try

        {

            // 动态加载,绝对路径--运行时

            Class c = Class.forName(animalClass);

            Animal animal = (Animal)c.newInstance();

            animal.noise();

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

    }

}

class Cat implements Animal

{

    @Override

    public void noise()

    {

        System.out.println("猫的叫声:喵喵");

    }

}

class Dog implements Animal

{

    @Override

    public void noise()

    {

        System.out.println("狗的叫声:汪汪");

    }

}

interface Animal

{

    void noise();

}

运行结果:

猫的叫声:喵喵 

参照来源:《编写高质量代码:改善java程序的151建议》