java中的构造器初始化

在java中我们可以使用构造器(即构造方法)来进行初始化。首先,必须牢记:无法阻止自动初始化的进行,它将在构造器被调用之前发生。如下面的代码:
public class Counter{
int i;
Counter(){
i = 7;
}
}



这个程序的内部运行过程分为两步:
(1)先将 i= 0   (2)再调用构造方法,将i= 7.
对于所有的基本类型、对象的引用、在定义时已经指定初值的变量,都符合这个规律。
首先,我们先来分析类内部的初始化顺序:
在类内部,变量定义的先后顺序决定了变量的初始化顺序。即便类的定义分布在类的方法之间,还是会先在任何方法之前调用之前将变量初始化(包括构造器)。
下面的例子可以明显的体现内部的运行步骤(特别是 b2 和 b3 的运行结果):
package Test;

public class Initial {
    public static void main(String[] args) {
        A a = new A();
        a.f();
    }

}

class A {
    B b1 = new B(1);

    public A() {
         b3 = new B(33333);
    }

    void f() {
        System.out.println("f()");
    }

    B b2 = new B(2);
    B b3 = new B(3);
}

class B {
    public B(int i) {
        System.out.println("B(" + i + ")");
    }
}


运行结果如下:
B(1)
B(2)
B(3)
B(33333)

f()

结果中显示,b3对象被初始化了两次,第一次是在构造器初始化之前,第二次是在调用构造器中进行初始化的。这样,第一次引用的对象将被丢弃,等待垃圾回收器回收。


接下来,我们来看第二个大部分,对于静态数据的初始化:
例如 :
class C{
 static int i;
 public C(){
i = 7;
}
}


首先要注意一下几点:
(1)无论创建多少个对象,静态数据都只用一份存储区域。
(2)static不能应用与局部变量。
(3)如果是基本类型,默认初始值为基本类型的标准初值,如果是引用类型,默认初值为null
初始化的顺序为 先静态 --->  非静态
其实构造方法实际上就是静态方法
《java编程思想》这本书中,详细总结一个对象的创建过程,假设有为 Dog的类:
1.当首次创建Dog对象时,或者Dog类的静态方法,或者静态域首次被访问时,java的解释器会查找类的路径,定位。class文件。(.class文件是java程序   编译后生成的可执行文件)
2.载入Dog.class文件,有关静态初始化的所有方法都会执行。即,静态初始化只会在加载.class文件的时候执行一次。
3.new Dog对象时,会在堆上为该对象分配足够的存储空间。
4.该存储空间清零。并设置Dog对象的默认值。
5.执行所有出现在字段定义处的初始化动作。
6.执行构造器。

第三个,显式的静态初始化
例如:

public class C{
     static int i;
     static{
          i = 7;
      }
}
这段代码看起来像是方法,其实是一段跟在 static 关键字后面的代码,这段代码也只执行一次,在首次生成该类的对象时。

第四个, 非静态实例初始化
这是普通的初始化,这里就不过多的解释了。



 





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值