Java中的构造方法分析

2012-04-29 18:05张红霞
电脑知识与技术 2012年26期
关键词:面向对象程序设计构造方法继承

张红霞

摘要:构造方法是Java语言中一个基本且重要的知识点。正确和熟练地使用构造方法,对掌握Java和面向对象编程非常重要。文章介绍了构造方法的概念和作用、对构造方法的调用和继承性进行了详细分析,并简单介绍了构造方法的访问权限。

关键词:面向对象程序设计;Java;构造方法;继承

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)26-6276-03

Analysis about Constructor in Java

ZHANG Hong-xia

(Department of Computer Science, GuangXi University of Finance & Economics, Nanning 530003, China)

Abstract: Constructor is a basic and important knowledge point in Java programming. Using constructor correctly and expertly is very important for mastering Java and Object-Oriented Programming. The article describes the concept and function of con? structor, analyses the calling and inheritance of constructor in detail, and simply introduces the access level of constructor.

Key words: Object-Oriented Programming; Java; constructor; inheritance

Java是一种纯面向对象的编程语言。面向对象的一个重要特征就是对相同类型的事物进行分析抽象后形成类,类定义好后,将用于创建实例对象,程序的执行则表现为对象之间的交互通信。在Java和C++等面向对象的编程语言中,创建对象是由构造方法来完成的,因此,构造方法是非常重要的内容。由于各方面原因,目前国内的很多Java教材在对构造方法的介绍方面并不够全面和详细,不利于初学者的学习和理解,本文对构造方法的一些最基本的知识方面进行了分析。

1构造方法的概念和作用

类的构造方法是方法名和类名完全相同,而且没有返回值的一种特殊的方法。在Java中创建对象时,编译器会自动调用相应的构造方法,为新建的对象分配存储空间和对其中的成员变量进行初始化。可以看出,构造方法的作用是确保程序中的每个对象都得到初始化,另外,构造方法有助于减少错误,并使代码更容易阅读。

构造方法的名字必须和类名相同,是由于以下原因:第一,除类名外,采用其它任何名字都可能与类中的某个成员名称冲突;第二,构造方法是由编译器自动调用的,所以必须让编译器知道应该调用哪个方法,采用和类名相同的方法名自然最简单并且更符合逻辑。

构造方法没有返回值,这和返回值为空(void)是明显不同的。构造方法也不能被继承。因此,构造方法又不是方法,在很多资料中构造方法又被称为构造器(Constructor)。

2构造方法的定义和调用

由于构造方法的重要性,Java中的每个类都会有一个或多个构造方法。即使类的设计者没有为类提供构造方法,编译器也会自动提供一个默认的无参的构造方法,它的方法体为空,当用这个类创建对象时,编译器会自动调用该默认的构造方法。但要注意的是:一旦为类定义了构造方法,编译器就不再提供默认的无参的构造方法。如:

public class Circle{

float radius ;

Circle(float r){

radius=r; }//在Circle类中显示定义了一个带参数的构造方法

…}

public class CircleTest{

public static void main(String[] args){

Circle c1=new Circle();//出错

Circle c2=new Clrcle(5.5f);//正确,调用类中提供的带参的构造方法

…}}

以上程序中在“Circle c1=new Circle();”处会出现编译错误,这是因为类中已经定义了一个带参的构造方法,此时编译器就不再提供默认的无参构造方法了,自然也不能再去调用这个方法了。如果希望在以上程序中能继续使用无参的构造方法,可以在类中增加一个无参的构造方法定义,如:

public class Circle{

float radius;

Circle( ){ }//在Circle类中定义一个无参的构造方法

Circle(float r){

radius=r; }//在Circle类中定义了一个带参的构造方法

…}

public class CircleTest{

public static void main(String[] args){

Circle c1=new Circle();//正确,调用类中无参的构造方法

Circle c2=new Clrcle(5.5f);//正确,调用类中带1个参数的构造方法

…}}

由上面的程序可以看出,构造方法可以重载,即在一个类中可以定义多个构造方法。同一个类中的多个构造方法之间还可以通过this关键字互相调用。但需要注意:在一个构造方法中只能调用一次其它的构造方法,并且这个调用语句必须是该构造方法的第一条语句。如:

class Circle{

float radius, area;

Circle( ){//无参构造方法

System.out.println("This constructor has not parameter.");}

Circle(float r){//带参的构造方法

this();//通过this调用无参构造方法,该语句必须位于方法中的第一行

System.out.println("This constructor has a parameter,its "+r);

radius=r; }

}

public class CircleTest{

public static void main(String[] args){ Circle c1=new Circle(8.5f);

}}

该程序的运行结果如下:

This constructor has not parameter.

This constructor has a parameter,its 8.5

3构造方法的继承性

Java中的构造方法不能被继承。但是当子类创建对象时,首先会自动调用其父类中的构造方法。所以虽然构造方法不能被继承,但父类中的构造方法却和子类对象的创建却息息相关。现讨论如下:

如果子类的构造方法中没有用super关键字显式调用父类的构造方法,则子类的构造方法会自动调用父类中的无参构造方法,如:

class base{ }//父类base

class derived extends base{//子类derived

public static void main(String[] args){

derived d=new derived();

}

}

上述程序中父类和子类的构造方法都是系统默认的无参构造方法,在创建子类对象时,首先自动调用父类中默认的无参构造方法,然后再调用子类中的默认构造方法。为了能看出这种自动调用,我们为父类和了类都显式加上一个无参的构造方法,程序如下:

class base{

base( )//父类中显式提供了无参的构造方法

{ System.out.println("base constructor"); }

}

class derived extends base{

derived( )//子类的构造方法中会自动调用父类中的无参构造方法

{ System.out.println("derived constructor"); }

public static void main(String[] args){

derived d=new derived();}

}

程序执行后输出结果如下:

base constructor

derived constructor

由以上程序执行结果可以看出构造方法的调用过程。将上面的程序修改一下,让父类中的构造方法带参数,修改后的程序如下:

class base{

base(int i)//注意:父类中的构造方法带了参数

{ System.out.println("base constructor"); }

}

class derived extends base{

derived()//注意:程序编译时这里会出错

{System.out.println("derived constructor"); }

public static void main(String[] args){

derived d=new derived();

}

}上述程序编译时会出错,这是因为父类中已经定义了带参的构造方法,编译器就不再提供默认的构造方法,所以在创建子类对象时自动调用父类中的无参构造方法时会出错。

要解决这个问题,有两种方法:一是为父类增加一个无参的构造方法定义;二是在子类的构造方法中用super(参数)显式调用父类中的带参数的构造方法,要注意的是:super(参数)语句必须位于第一行,程序如下:

class base{

base(int i){ System.out.println("base constructor"); }

}

class derived extends base{

derived(){

super(8);//通过super调用父类中的构造方法,该语句必须位于第一行

System.out.println("derived constructor"); }

public static void main(String[] args){

derived d=new derived();

}

}

4构造方法的访问权限

构造方法通常被声名为public的,但实际上根据需要,构造方法的访问权限声明为protected、private和默认访问级别都可以。比较特殊的是private级别的构造方法,它和单态模式有关,有兴趣的读者可以在这方面进一步深入学习。

5结束语

在Java中,构造方法是一个重要的基本知识,本文重点对构造方法的调用和继承问题等方面进行了研究,但对于构造方法的访问权限、外部类和内部类之间构造方法的调用等内容还需进行分析和研究。全面、正确和熟练地掌握构造方法,对掌握Java编程和面向对象编程非常重要。

参考文献:

[1]焦晓艺.Java中的构造方法[J].山东轻工业学院学报,2004,18(2):11-15.

[2]耿祥义,张跃平.Java 2实用教程[M].北京:清华大学出版社,2010.

[3]张桂珠,张平,陈爱国.Java面向对象程序设计[M].北京:北京邮电大学出版社,2010.

[4] Eckel B. Java编程思想[M].陈昊鹏,译.北京:机械工业出版社,2011.

[5]王丽丽,海丽.Java语言中的构造方法私有化[J].计算机光盘软件与应用,2010(15):98-99.

猜你喜欢
面向对象程序设计构造方法继承
DC-DC变换器分层级构造方法
《梦溪笔谈》“甲子纳音”构造方法的数学分析
基于MOOC的编译原理分阶段课程教学研究
几乎最佳屏蔽二进序列偶构造方法
浅谈杜审言、杜甫的祖孙关系:推崇、继承、发展
浅论紫砂艺术的继承与创新
论电影《暮光之城》的哥特文化
CDIO理念下《面向对象程序设计》教学改革研究
独立学院面向对象程序设计教学模式的探讨与实践
气象科技史研究领域又一重要学术成果