构造函数如何在java中工作

时间:2012-04-19 19:46:51

标签: java

我试图了解类

中java中的以下构造函数之间的区别
Box
{
    Box(Box ob)
    {
     width = ob.width;
     height = ob.height;
     depth = ob.depth;
    }

    Box(double w, double h, double d)
    {
     width = w;
     height = h;
     depth = d;
    }

    Box()
    {
     width = 0;
     height = 0;
     depth = 0;

    }

    Box(double width, double height, double depth)
    {
     this.width = width;
     this.height = height;
     this.depth = depth;
    }
}

为每个人欢呼

3 个答案:

答案 0 :(得分:4)

首先是复制构造函数,用于在初始化期间将一个对象的值复制到另一个对象。

Second和Fourth是一个参数化构造函数,它包含该类的所有数据成员。但建议使用第四个和大多数IDE(我所知道的)将自动生成第4个,因为它更容易阅读并具有相同的上下文

第三个是默认构造函数。用于设置默认值。看它不接受任何输入(作为参数)

Box b = new Box();//Default constructor
Box b1 = new Box(1.0,2.0,3.0);//Parameterized constructor completely defining the object
Box b2 = new Box(b1);//Copy constructor will copy the values but both will have a different reference
b2 = b1;//b2 now refers to object referenced by b1. So the earlier reference for b2 will be taken by GC(garbage Collector)

答案 1 :(得分:3)

第一个通常称为复制构造函数,这意味着您要将现有实例中的值复制到新实例中。第2个和第4个(相同)正在创建一个新实例,从显式原始值初始化每个字段。第三个似乎是尝试使用字段的默认值创建实例,当您不想显式提供任何实例时。

顺便说一句,第二和第四之间的微不足道的差异在于,在第二个中,您使用的参数名称与字段名称不同,因此您不必在左侧说"this.fieldname"。在第4个参数中,参数与字段名称具有相同的名称,因此您必须在左侧使用"this,fieldname"来表示您正在从参数复制到字段,而不是反之亦然(或者从参数到自身,或从字段到自身)。

答案 2 :(得分:1)

好的,我首先假设您没有使用Box编写class关键字,并且还省略了宽度,高度和深度声明以保存输入。

在Java中,如果您不提供任何构造函数,默认情况下默认构造函数不带任何参数。所以,如果你没有像下面的类Box那样写任何东西,你仍然可以在main中调用它的基本构造函数:

class Box{
}

class CallingClass{
    public static void main(String args[]){
        Box box = new Box(); // this would work.
    }
}

如果你提供了另外一个构造函数,那么在你明确声明它之前,未声明的默认构造函数就不再可用了。

class Box{
    public Double height;

    public Box(Double height){
        this.height = height;
    }
}

class CallingClass{
    public static void main(String args[]){
        Box box = new Box((double)50); // this would work.
        Box anotherBox = new Box(); // this will give you an error.
    }
}

快速超过建设者:

public Box(){...} // default constructor in which you allow caller to not worry about initialization.

public Box(Box boxToCopy){...} // copy constructor for creating a new box from the values of an old one.

public Box(double height, double width, double depth){...} // should create a box with specified dimensions.