java对象的的初始化,Java对象初始化详解

构造器的作用是在new一个对象时对其进行初始化操作。使用new初始化一个对象的过程如下:

(1)

首先执行静态代码块,若该类有父类则先执行父类的静态代码块。

(2)

接着执行该类的构造方法,若该类有父类,则先执行父类的构造方法。由此可以形成一条构造方法链,直到顶层父类。

执行如下代码:

public class ObjTest {

public static void main(String[] args) {

Children obj = new Children();

}

}

class Children extends Parent{

static{

System.out.println("children static block...");

}

public Children(){

System.out.println("children constructor block....");

}

public void test() {

System.out.println("instance block....");

}

}

class Parent{

static{

System.out.println("parent static block...");

}

public Parent(){

System.out.println("parent constructor block...");

}

}

结果为:

parent static block...

children static block...

parent constructor block..

children constructor block....

由此我们可以了解到对象初始化的过程,这其中最重要的就是构造方法,构造方法是对一个对象进行初始化的操作。接下来说说构造方法。当我们没有为一个类指定构造方法时,编译程序会自动生成一个空构造方法。当我们为一个类指定一个非空构造方法时,编译程序就不会自动生成一个构造方法。

比如:

class Obj{

public static void main(String[] args) {

new Obj();

}

}new Obj()的作用就是新建一个对象,并调用默认构造器,即使我们没有指定构造器。

若修改代码如下:

class Obj{

public static void main(String[] args) {

new Obj();

}

public Obj(int a){

}

}

则编译器就会报错,因为我们已经指定了一个构造方法。就好象我们没有设置任何构建器,

编译程序会说:“你看来似乎需要一个构建器,所以让我们给你制造一个吧。”但假如我们写了一个构建器,编译程序就会说:“啊,你已写了一个构建器,所以我知道你想干什么;如果你不放置一个默认的,是由于你打算省略它。”

因此当我们顶一个类时,若指定了非空的构造方法时,一般也需要手动指定一个非空的构造方法,便于类的继承。

接下来说说this关键字,this关键字代表当前对象。

首先看下面的代码:

class Obj{

void f(int i){

}

public void test() {

Obj a = new Obj(),b = new Obj();

a.f(1);

b.f(2);

}

}

这是一个普通的对象调用方法,它内部是如何实现的呢?其实如下,

Obj.f(a,1);Obj.f(b,2);就是为某个方法指定一个句柄。我们也可以使用this关键字调用,this.f(1);但是事实上没有必要的,编译器会自动帮我们完成。但是对于那些特殊的类--需要明确使用当前对象的句柄,将当前对象的句柄返回时,需要使用this。

class Obj{

int a = 0;

void g(){

test().test().test();

}

Obj test(){

a++;

return this;

}

}

我们可以这样构造一个方法链。

若为一个类写了多个构建器,那么经常都需要在一个构建器里调用另一个构建器,以避免写重复的代码。可用this关键字做到这一点

class Obj{

int a = 0;

public Obj(int a){

this.a = a;

}

public Obj(String s){

}

public Obj(){

this(4);

//this("aa");

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

}

} 使用this可以在构造器里调用另一个构造器,而且this语句必须是第一条语句,并且不能使用两个this语句。在第一个构造器里,成员变量和局部变量重名了,还可以使用this关键字调用成员变量。 在对象的初始化过程中我们也说到了static关键字,static关键字修饰的成员变量,方法都属于类方法,是全局的,该类的所有实例都共享这些数据,不需要创建对象就可以使用这些数据。实例变量,实例方法(没有static修饰的)是属于某个实例的,必须先创建一个实例才可以使用这些数据.因此在静态方法中不可以调用实例方法,因为实例方法需要确定对象。需要说明一点,静态代码块。静态代码块在类的字节码加载时执行,可以做些全局的初始化操作。而构造方法,做某个具体实例的初始化操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值