深啃JAVA

来源:互联网 发布:宅男客栈新域名亚洲 编辑:程序博客网 时间:2024/05/28 04:53

最近在研读Effective JAVA这一本书,这本书可以说是开发阶段中对平时开发的设计提供了一个比较好的规范思想,避免设计时产生不必要的资源浪费,提高软件性能的一方面,废话不多话,让我们一步步进入开发中常见的做法及优化程序的方案。

一、认识类:考虑用静态工厂方法代替构造器

在类的使用中,我们避免对一个类进行创建,但是你是否知道,类创建的几个问题?

1、为什么要创建类

2、类什么时候被加载初始化和销毁

3、创建类多了有什么隐患

4、有什么好的方案代替类的构造器

 

那类什么时候被加载?

类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式加载类[eagerly load](也就是只要有其他类引用了它就加载),也可以是懒加载[lazy load](等到类初始化发生的时候才加载)

 

那类什么时候被加载?

类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式加载类[eagerly load](也就是只要有其他类引用了它就加载),也可以是懒加载[lazy load](等到类初始化发生的时候才加载)

 

类什么时候初始化?

加载完类后,类的初始化就会被触发一致发生,意味着它会初始化所有类静态成员,以下情况一个类被初始化:

1)、实例通过使用new()关键字创建或者使用class.forName()反射,但它有可能导致ClassNotFoundException。

2)、类的静态方法被调用

3)、类的静态域被赋值

4)、静态域被访问,而且它不是常量

5)、在顶层类中执行assert语句

反射同样可以使类初始化,比如java.lang.reflect包下面的某些方法,JLS严格的说明:一个类不能被任何除以上的原因初始化。


类是如何被初始化?

现在我们知道说明时候触发类的初始化了,还需了解一下类初始化的一些规则:

1)、类从顶至底的顺序初始化

2)、基类(父类)早于子类的初始化

3)、如果类的初始化是由于访问静态域而触发,那么只有声明静态域的类才被初始化,而不会触发超类的初始化或者子类的初始化,即使静态域被子类或子接口或它的实现类所实现

4)、接口初始化不会导致父接口的初始化

5)、静态域的初始化是在类的静态初始化期间,非静态域的初始化时在类的实例创建期间。这意味着静态域初始化在非静态域之前。

6)非静态域通过构造器初始化,子类在做任何初始化之前构造器会隐含地调用父类的构造器,它保证了非静态或实例变量(父类)初始化早于子类

初始化例子:

这是一个有关类被初始化的例子,你可以看到哪个类被初始化:

public class ClassInitializationTest {      public static void main(String args[]) throws InterruptedException {          NotUsed o = null;          Child t = new Child();          System.out.println((Object)o == (Object)t);      }  }     /**  * 父类  */  class Parent {      static { System.out.println("static block of Super class is initialized"); }      {System.out.println("non static blocks in super class is initialized");}  }     class NotUsed {      static { System.out.println("NotUsed Class is initialized "); }  }     /**  *  子类继承Parent */  class Child extends Parent {      static { System.out.println("static block of Sub class is initialized in Java "); }      {System.out.println("non static blocks in sub class is initialized");}  }  

以上程序的输出结果就是:

static block of Super class is initialized  

static block of Sub class is initialized in Java  

non static blocks in super class is initialized  

non static blocks in sub class is initialized  

false 

从上面结果可以看出:

1、父类的初始化早于子类

2、静态变量或者代码块初始化早于非静态块和域

3、没使用的类根本不会被初始化,因为它没有被使用


         (未完,待续......)


原创粉丝点击