即使我们有一个构造函数,如何将变量初始化为默认值

时间:2013-07-20 19:44:44

标签: java constructor default default-constructor

我对java中的默认构造函数有疑问 尽管我已经阅读了java中的构造函数,但默认构造函数会将所有实例变量初始化为其默认值。但是如果我们为一个类定义一个构造函数,那么如果我们想要将变量初始化为默认值呢?

假设我有2个文件 a.java

public class a
{
    int x;

    public a(int z)
    {
        if(z > 0)
        {
            x = z;
        }
    }

    public  void get()
    {
        System.out.println(x);
    }
} 

和b.java

public class b
{
    public static void main(String[] args)
    {
        a obj = new a(-4);

        obj.get();
    }
}

现在这里条件(z> 0)失败,因此x被初始化为零。但这究竟是什么,因为它们在类a中没有默认构造函数。

7 个答案:

答案 0 :(得分:10)

  

声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值为零或null,具体取决于数据类型。

Source

这意味着编译器将在您构建程序时为您执行此操作。

答案 1 :(得分:2)

在您编写的a课程(下面重命名为A以遵循惯例)中,没有默认构造函数。类的默认构造函数是public且没有参数的构造函数。

使用您编写的代码,这将失败:

A a = new A();

只要在类中声明另一个构造函数,就不再有默认构造函数了。

对于实例变量,如果不显式初始化它们,则将它们设置为默认值。那就是:

public class A
{
    private int x;

    public int getX()
    {
        return x;
    }
}

如果你这样做:

final A a = new A();
System.out.println(a.getX());

这将打印出0。上面的类完全等同于:

public class A
{
    private int x /* = 0 -- default value for uninitialized int instance variables */;

    // redundant
    public A()
    {
    }

    public int getX()
    {
        return x;
    }
}

答案 2 :(得分:0)

在java中声明变量时,默认情况下将其初始化为默认值。 对于原始类型是0(或它是等价的),对象是null

因此,在您的示例中,x初始值为0,您永远不会覆盖它。

答案 3 :(得分:0)

在java中,如果我们不定义任何构造函数,它将自己的默认构造函数作为默认值。在创建对象时,我们将值初始化为构造函数。

public class Car{
  int numOfWheels;

public Car(int numOfWheels){                     //created constructor//

    this.numOfWheels=numOfwheels;
    }
    }
    public static void main(string[]args){

Car skoda = new Car(4);  
}                           *//initialized value to the object using constructor in  parenthesis//*                     

答案 4 :(得分:0)

public class a
{
    int x;

    public a(int z)
    {
    //as we know that every class base class is Object class this constructor first statement is super(); means compiler automatically add this statement that call object class default constructor and initialize default values
        if(z > 0)
        {
            x = z;
        }
    }

    public  void get()
    {
        System.out.println(x);
    }
} 

答案 5 :(得分:0)

公共课a

{

int x;

public a(int z)

{

/ *我们知道每个类基类都是Object .....

编译器自动添加super();调用Object类的默认构造函数

初始化实例变量* /

的值

if(z> 0)

{

x = z;

}

}

public void get()

{

的System.out.println(X);

}

} 公共课b

{

public static void main(String[] args)

{

    a obj = new a(-4);


    obj.get();

}

}

//其他例子在

之下

/ * A类

{

公开A()

{

System.out.println(" Arjun Singh Rawat和Ashish Chinaliya");

}

}

B类延伸A

{

公共B()

{

//编译器自动添加super();

}

}

课程调用

{

public static void main(String arg [])

{

B bb = new B();

}

} * /

感谢...

答案 6 :(得分:0)

    function findcontrol()
      {
          var textBoxQuantity = document.getElementsByClassName("field-text1");
for (var i = 0; i < textBoxQuantity.length; i++) {
              findvalue(textBoxQuantity[i].id);
          }
      }
function findvalue()
{
var Quantity = document.getElementById(quantity).value;
if (Number(Quantity) > 0){
// your calculations here
}

默认构造函数不是将字段初始化为默认值, 在这个程序中,即使没有默认构造函数,静态字段a也被初始化为0 由编译器添加。在调用构造函数之前,它也被初始化为0.