2011-02-25 111 views
3

我在面向对象编程中的第一堂课。我应该在哪里创建一个构造函数,并且我不应该在哪里?

我应该为每个类创建一个构造方法吗?

例如

public class Cube2 { 

    int length; 
    int breadth; 
    int height; 
    public int getVolume() { 
     return (length * breadth * height); 
    } 
    Cube2() { 
     this(10, 10); 
     System.out.println("Finished with Default Constructor"); 
    } 
    Cube2(int l, int b) { 
     this(l, b, 10); 
     System.out.println("Finished with Parameterized Constructor having 2 params"); 
    } 
    Cube2(int l, int b, int h) { 
     length = l; 
     breadth = b; 
     height = h; 
     System.out.println("Finished with Parameterized Constructor having 3 params"); 
    } 
    public static void main(String[] args) { 
     Cube2 cubeObj1, cubeObj2; 
     cubeObj1 = new Cube2(); 
     cubeObj2 = new Cube2(10, 20, 30); 
     System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume()); 
     System.out.println("Volume of Cube2 is : " + cubeObj2.getVolume()); 
    } 
} 
如果我想创建一个新的构造,我应该使用在前面(第一个)一个使用相同的参数

像构造Cube2(int l, int b, int h)具有相同的为这一个Cube2(int l, int b)除了变量(INT 1H)参数

+2

这不是一个立方体,它是一个矩形棱镜,如果两侧可以有不同的长度。 – Omnifarious 2011-02-25 18:49:00

回答

4

有很多情况下,当一个构造函数是没有必要的,特别是如果你打算使用inversion of control,其中需要单个默认构造函数。

但是,对于你的立方体的例子,它会使sence两个提供一个或两个构造函数。默认构造函数,如果您觉得有必要在构造后操作多维数据集参数,和/或需要实际创建多维数据集所需的三个参数。

然而使用或者您的前两个构造方法不会使SENCE我在这种情况下,因为通常没有这样的东西作为sensible defaults多维数据集initalizing的对象。 tcp连接的值timeout可能会有合理的默认值。

2

没有规则构造函数需要与另一个构造函数具有相同的参数。由于额外的构造函数通常只需要略有不同,这只是最终发生的事情。

任何没有为隐式定义构造函数的类都有一个没有参数的构造函数。但是,如果你需要,你必须声明一个无参数的构造函数,当你声明他人时。因此,除非您需要信息或逻辑来构建对象,否则不需要显式构造函数。

1

如果你的类有属性,但你不会传递新的值,或者你不希望程序员能够通过任何进入,在它的实例化,那么你可以只有默认的构造函数(即。没有参数)。

每类将(应该)至少有默认的构造函数,如:

public class Cube { 
    Cube(){} 
    } 
+0

这样的默认构造函数只有在你根本没有声明构造函数时才会生成。 – 2011-02-25 19:26:11

+0

对不起我的意思是你应该总是声明这种类型至少 – ScottC 2011-02-25 19:27:04

+0

,但感谢您的投票! – ScottC 2011-02-25 19:30:34

-1

Constructor必须在根据需要创建的。如果没有其他Constructor被创建,则编译器总是提供默认的Constructor

+0

不,只有在没有给出其他构造函数的情况下才会创建默认构造函数。 – 2011-02-25 19:24:12

3

每个类都至少有一个构造函数,不管它是否被明确定义。

如果你不不声明构造明确,一个是为YOUT定义:默认参数的构造函数—无操作—它调用父类的无参数构造函数(super())。

如果父类缺少无参数构造函数,即使它不执行任何操作,也需要声明构造函数—:如果父类只有带参数的构造函数,则必须显式调用父构造函数;因此,您需要为您的类定义至少一个构造函数。

如果类不会被公众实例化,您可能还想定义类的构造函数,使其可见性不是公共的(例如,private)。有人认为,总是保持类的构造函数的可见性受到限制,并且只允许通过工厂方法进行公开实例化是一种很好的做法,消费者不应该关心实际的对象类型是什么,而只是它是所需类型的子类型。这提供了更多的灵活性。

不要忘记,一旦实例完全构建,类实例应该“准备好使用”。 “准备使用”的定义当然是一个相当可调的概念。

+0

*每个类都至少有一个构造函数,无论它是否被明确定义。*这是重要的部分。所以不,你不必为每个类声明一个构造函数,因为默认提供了一个标准的构造函数。 – Bijan 2011-02-26 01:15:39

2

创建该类的用户将使用的构造函数。这实际上只是为用户设计API的更一般的想法的结果。尝试编写将首先使用你的类的代码,然后你会看到你需要什么方法。

如果您有一个方法与另一个方法相同,但添加了一个参数,则可以更容易地理解您是否一致地命名和排序其他参数。

你的第一个构造函数不是默认的构造函数。如果你不写任何东西,默认的构造函数就是你得到的 - 你不可能编写一个。你写的是一个无参数的构造函数。