【问题标题】:How come variables are initialized to their default values even if we have a constructor即使我们有构造函数,如何将变量初始化为其默认值
【发布时间】:2013-07-19 21:59:57
【问题描述】:

我对 java 中的默认构造函数有疑问。
正如我所读到的关于 java 中的构造函数的内容一样,默认构造函数将所有实例变量初始化为其默认值。但是如果我们为一个类定义了一个构造函数,那么如果我们想要变量如何初始化为它们的默认值呢?

假设我有 2 个文件 一个.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 类中没有默认构造函数。

【问题讨论】:

  • 你永远不会在这里调用a的默认构造函数...
  • Class a 没有默认构造函数。

标签: java constructor default default-constructor


【解决方案1】:

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

Source

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

【讨论】:

  • @juergen d - 默认构造函数不会将字段初始化为其默认值。如果不是,那么它在 java 中的用途是什么?
  • 否,默认构造函数的目的不是用默认值初始化变量。这是自动发生的。你应该在谷歌上搜索默认构造函数的使用。它可以用于可能的情况。
【解决方案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;
    }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在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//*                     
      

      【讨论】:

        【解决方案5】:
        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);
            }
        } 
        

        【讨论】:

          【解决方案6】:

          公开课a

          {

          int x;

          公共 a(int z)

          {

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

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

          初始化实例变量的值 */

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

          }

          }*/

          谢谢...

          【讨论】:

            【解决方案7】:
            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。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-16
              • 1970-01-01
              • 2015-01-12
              相关资源
              最近更新 更多