默认构造函数未被调用

时间:2015-07-20 17:25:06

标签: java oop constructor default-constructor

为什么:
如果类没有提供任何constructors,那么编译时编译器会给出default constructor(constructor without parameter),但如果类包含parameterized constructors,则编译器不提供默认构造函数。

我正在编译下面的代码。它给出了编译错误。

代码:

class ConstructorTest
{
    // attributes
    private int l,b;

    // behaviour
    public void display()
    {
        System.out.println("length="+l);
        System.out.println("breadth="+b);
    }
    public int area()
    {
        return l*b;
    }

    // initialization
    public ConstructorTest(int x,int y) // Parameterized Constructor
    {
        l=x;
        b=y;
    }

    //main method
    public static void main(String arr[])
    {
        ConstructorTest r = new ConstructorTest(5,10);
        ConstructorTest s = new ConstructorTest();
        s.display();
        r.display();
        r.area();
    }
}

控制台错误:

enter image description here

当我仅调用parameterized constructor时。它的工作正常。但是想要用default constructor调用parameterized constructor。编译器会出现编译错误,如图所示。

任何直接的帮助都会非常值得注意。感谢

5 个答案:

答案 0 :(得分:5)

您的问题的答案在您提供的段落中。

  

但是如果一个类包含参数化构造函数,则编译器不会提供默认构造函数

您创建了一个参数化构造函数,因此未提供默认的非构造函数,而且必须自己创建

答案 1 :(得分:1)

如果提供构造函数,则默认构造函数不会添加到您的类中。你必须自己定义它。

答案 2 :(得分:1)

使用javac ConstructorTest.java进行编译时收到错误 因为您声明了参数化构造函数 - public ConstructorTest(int x,int y)。因此,编译器不会为您的类提供任何默认构造函数[public ConstructorTest()]。因此,您无法在第28行拨打公开ConstructorTest()

答案 3 :(得分:1)

我不知道你为什么问这个问题。你自己说“但是如果一个类包含参数化构造函数,那么编译器就不会提供默认构造函数。”......所以这就解释了!!

答案 4 :(得分:0)

之所以这样,是因为它允许人们编写如下结构:

struct Test
{ 
    int a;
    double d;
};

它没有构造函数。用户不在乎成员是否已初始化。它主要用于包含数据。然后可以通过以下方式使用它:

Test t;

最终结果是减少了打字。如果有人在意变量的初始化方式或初始化变量的逻辑与众不同,那就写一个构造函数。然后假定默认构造函数会执行某些错误或意外操作,因此就不提供它。

关于析构函数可以说同样的话。如果您不在乎,则提供了一个默认的析构函数,它以相反的顺序销毁您的成员并调用基本的析构函数。如果覆盖它,则不会产生默认值。