关于java构造器的理解(Constructor)

来源:互联网 发布:大数据时代心得体会 编辑:程序博客网 时间:2024/06/10 23:19

java构造器

这个问题网上的前辈已经给出了具体全面的答案,本文在学习后记录如下。
文章大部分内容来源: http://tech.it168.com/j/2006-05-18/200605181021879.shtml
首先,构造器是一个创建对象时被自动调用的特殊方法,为的是初始化。构造器的名称应与类的名称一致。

当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null(因为java中不允许对不确定变量的操作),而构造器可以改变这种初始化。

构造器的作用: 构造器是用来生成一个类的实例是用来初始化这个实例用的,它是创建java对象的重要途径。
不过它虽然是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的。

我们需要注意的是:Java的构造器并不是函数,所以他并不能被继承,这在我们extends的时候写子类的构造器时比较的常见,即使子类构造器参数和父类的完全一样,我们也要写super就是因为这个原因。

  构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象、同步、静态等等访问限制以外的形式。

  因为构造器不是函数,所以它是没有返回值的,也不允许有返回值。但是这里要说明一下,构造器中允许存在return语句,但是return什么都不返回,如果你指定了返回值,虽然编译器不会报出任何错误,但是JVM会认为他是一个与构造器同名的函数罢了,这样就会出现一些莫名其妙的无法找到构造器的错误,这里是要加倍注意的。
 在我们extends一个子类的时候经常会出现一些意想不到的问题,我在这里说一些和构造器有关的。

  首先说一下Java在构造实例时的顺序(不讨论装载类的过程)。

  构造的粗略过程如下:

  1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。

  2、执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)。

  3、执行构造器

  4、将变量关联到堆中的对象上

  介绍一下准备知识,以备一会来详细说明这个的流程。

  this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误,注意此处,我们经常在继承父类的时候构造器中并不写和父类有关的内容,此时如果父类没有缺省构造器,就会出现编译器添加的缺省构造器给你添麻烦的问题了哦。例如:Class b extends a{public b(){}}就没有任何有关父类构造器的信息,这时父类的缺省构造器就会被调用。

举个例子:

 public class Manager extends Employee {  private String department;  public Manager(String name, double salary, String dept) {   super(name, salary);   department = dept; } public Manager(String n, String dept) {   super(name);   department = dept; } public Manager(String dept) {  // 这里就没有super(),编译器会自动地添加一个空参数的缺省super构造器,此时如果Employee类中没有空参数的缺省构造器,那就会导致一个编译错误   department = d; } }

为了避免出现子类构造器中递归调用父类构造器,而父类中没有缺省构造器造成编译错误的情况,我们在每个构造器中第一行都建议this()或super().否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。

总的来说,一句话:构造器不是方法,那么用来修饰方法特性的所有修饰符都不能用来修饰构造器(并不等与构造器具备这些特性,虽然不能用static修饰构造器,但它却有静态特性)构造器只能用 public private protected这三个权限修饰符,且不能有返回语句。

原创粉丝点击