4

我对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 类中没有默认构造函数。

4

7 回答 7

11

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

来源

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

于 2013-07-20T19:48:38.523 回答
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;
    }
}
于 2013-07-20T19:52:41.210 回答
0

当你在java中声明一个变量时,它默认初始化为它的默认值。对于原始类型是 0(或等效),对于对象是null

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

于 2013-07-20T19:56:44.347 回答
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//*                     
于 2014-04-08T16:13:59.507 回答
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);
    }
} 
于 2014-04-27T14:20:15.310 回答
0

公开课a

{

诠释 x;

公共 a(int z)

{

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

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

初始化实例变量的值 */

如果(z > 0)

{

x = z;

}

}

公共无效获取()

{

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

}

}

类调用

{

公共静态无效主要(字符串arg [])

{

B bb=新的 B();

}

}*/

谢谢...

于 2014-04-27T14:39:44.487 回答
0
public class Demo {
    static int a;
    Demo(int b )
{
System.out.println(" Constructor"); 
}
 public static int  func()
 {
     System.out.println(a);
     return 1;
 }
 public static void main( String args[])
 {

     new Demo(func());
 }
}

Output
0
Constructor

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

于 2016-07-03T10:38:33.757 回答