Java学习笔记(成员变量的初始化)

类的初始化包括实例成员的初始化和静态成员的初始化:
1、静态成员变量的初始化
     静态变量的初始化方法:
          A)直接赋值 public static String variableA="hello",//当然也可以调用方法或者其它变量来赋值,但必须满足前向引用的原则.
          B)在静态从句中写赋值语句:static{//初始化语句块}
         其中直接赋值触发在第一次引用该变量时执行;而静态从句得触发有两个时刻,一是静态变量被引用时,二是在类第一次被实例化时. 
    如果同时包含A,B情况,其执行初始化顺序是A->B.这种初始化是一种规定,记住就好,当然,这种规则业必须满足合理性,这就是类第一次
   实例化前,静态变量必须被初始化的原因:实例初始化可能会访问静态变量,所以必须准备好.C#的静态变量初始化策略跟Java很类似,静态
   初始化从句的作用根C#的静态构造函数类似,静态变量的初始化都不是在类加载时,而是在类实例化时.类实例化的触发是在类变量第一次(类的
  静态变量)被调用时,或者对象第一次被实例化时。 
2、实例成员的初始化
      实例成员初始化有三个方式:
     A)直接赋值:public String variableA="hello";
     B)在实例初始化从句中
         public class A{
              //实例初始化从句.
              {
                   //这里写初始化语句.
              }

        }
     C)在构造函数中.
     实例成员变量初始化是在实例时执行,执行的顺序是A->B->C.

下面是测试代码:

public class ClassA {
	/*
	 * 静态成员变量
	 */
	public static String variableA="直接初始化值";
	public static String variableA1;
	/*
	 * 实例变量
	 */
	public String variableB;
	//静态初始化从句
	static{
              System.out.println("变量A:"+variableA);
	    variableA ="varibleA 在静态从句中 初始化!";
	    System.out.println("变量A:"+variableA);
	}
         //实例成员初始化从句块
	{
             System.out.println("初始化前变量B:"+variableB);
	    variableB ="varibleB 初始化!";
	    System.out.println("初始化后变量B:"+variableB);
	}
}


下面是调用测试代码:
//如下三个语句都可以导致静态初始化从句执行,但注意静态初始化从句仅执行一次
  //String theA=ClassA.varibleA;
  String theB=ClassA.variableA;
  //ClassA theCA=new ClassA();
 //下面这条语句并不会引起静态变量初始化.也就是说Java在类加载时并不进行
  //静态变量的初始化.
  String theNameString=ClassA.class.getName();
  但Class theC = Class.forName("ClassA")会导致静态从句执行.

初看起来,实例初始化从句没什么必要,完全可以用构造函数来替代,但这种机制对于匿名类来说非常关键,
因为匿名类是无法写构造函数的。C#中的匿名类型比Java的匿名类要简单很多。一个可能的原因是因为C#有
委托类型,而Java需要用匿名类来比较便捷的实现类似C#委托那样的功能。
弄清成员变量的初始化的机制,可以防止一些Bug的出现.

PS:Class.forName("ClassA")执行时会导致类加载,同时静态变量初始化。其实就是类本身实例化。对于ClassA.class.getName(),
调用ClassA.class显然需要加载ClassA类,但没有触发静态从句执行,说明类本身没有被实例化。请清楚整个机制的童鞋赐教。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值