未调用默认构造函数

default constructor not invoked

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

我正在编译代码below.It 出现编译错误。

代码:

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();
    }
}

控制台错误:

当我只调用 parameterized constructor 时。当想用 parameterized constructor 调用 default constructor 时,它的工作 fine.but。编译器给出如图所示的编译错误。

我们将不胜感激任何直接的帮助。谢谢

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

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

but if a class contains parameterized constructors then default constructor is not provided by the compiler.

你定义了参数化构造函数,所以默认构造函数不是编译器提供的,需要你自己提供。

使用 javac ConstructorTest.java 编译时出现错误 因为您声明了参数化构造函数 - public ConstructorTest(int x,int y)。因此,编译器不会为您的 class 提供任何默认构造函数 [public ConstructorTest() ]。所以你不能在第 28 行调用 public ConstructorTest()

我不知道你为什么问这个问题。你自己说 "but if a class contains parameterized constructors then default constructor is not provided by the compiler."...所以这解释了!!

原因是因为这允许编写一个结构,例如:

struct Test
{ 
    int a;
    double d;
};

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

Test t;

最终结果是更少的打字。如果一个人关心变量是如何初始化的或者初始化它们的逻辑是不寻常的,那么就写一个构造函数。然后假定默认构造函数会做错或意外的事情,因此不提供。

对于析构函数也可以这样说。如果有人不关心,则提供一个默认析构函数,它以相反的顺序销毁您的成员并调用基本析构函数。如果覆盖它,则不会生成默认值。