【问题标题】:If we define own constructor then how does java initialize instance variables to their default value如果我们定义自己的构造函数,那么java如何将实例变量初始化为其默认值
【发布时间】:2012-06-14 04:25:34
【问题描述】:

Java 使用默认构造函数为实例变量分配默认值。但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,那么默认构造函数并没有添加)。

【问题讨论】:

    标签: java default-value default-constructor


    【解决方案1】:

    Java 使用默认构造函数为实例变量分配默认值。

    不,不是真的。它会在执行 any 构造函数之前自动为所有成员分配默认值。

    但是如果我们定义自己的构造函数,那么java是如何给出默认值的(因为那时我们编写构造函数时,并没有添加默认构造函数)。

    它仍然为所有成员分配默认值。

    class Test {
    
        int i;
        Object ref;
    
        Test() {
            System.out.println(i);
            System.out.println(ref);
        }
    
    
        public static void main(String[] args) {
            new Test();
        }
    }
    

    输出:

    0
    null
    

    【讨论】:

    • 意思是不需要在默认构造函数中给出值?
    • 只是补充一下,如果你想在构造函数中看到这个地方的断点,在构造函数中的语句执行之前,eclisp调试器将初始化运行所有成员变量。好答案+1
    • 默认构造函数中给出的值是为了覆盖 JVM 提供的默认值,就像上面给出的代码一样,你可能希望 i 默认为 20,但 JVM 将始终将其初始化为 0,所以在构造函数中,您将标记 i = 20;
    • 表示 JVM 通过“默认构造函数”以外的技术分配默认值
    • @swdeveloper,是的。默认值是自动初始化的,与默认构造函数无关。
    【解决方案2】:

    下面是使用new 创建对象时发生的情况;见JLS 12.5

    1. 对象的空间在堆上分配,对象的大小和类与对象相关联。

    2. 对象的所有字段都设置为默认值;即null 或引用类型,原始类型为零或假。

    3. 计算superthis 参数(如果有)的参数表达式,并递归调用构造函数链。

    4. 如果尚未评估它们(通过 this 链接),则按顺序评估/执行此类的任何实例字段初始化程序和任何初始化程序块。

    5. 执行构造函数体的其余部分(如果有)以完成对象初始化。

    无论是显式声明的构造函数还是默认构造函数,都使用相同的过程。默认构造函数只是调用 super() 的构造函数的简写。

    所以....

    Java 使用默认构造函数为实例变量分配默认值。

    实际上,在此之前分配了默认值,并且(确实)初始化器等被执行之前一个(空)默认构造函数被执行。

    默认构造函数不负责进行默认初始化。所以它没有被调用的事实并不重要。

    【讨论】:

      【解决方案3】:

      aioobe 的回答是对的。我只想说为什么/怎么会这样:

      与你是否有默认构造函数或自己的构造函数无关,java 编译器会为每一个构造实例初始化“方法”(称为 void <init>,使用构造函数的参数 - 如果你想查看反编译的字节码)。

      每个<init>“方法”的结构是:

      • 另一个构造函数的调用
      • 实例变量初始化器(您的实例变量初始化器,以及实例初始化器)
      • 构造函数主体。

      更多详情请见the JLS and JVMS,以及in this nice introduction

      【讨论】:

        【解决方案4】:
        public class DefaultValue {
        
            private boolean BOOLEAN;
        
            private byte BYTE;
        
            private  short SHORT;
        
            private  int INT ;
        
            private  long LONG;
        
            private  float FLOAT;
        
            private  double DOUBLE;
        
            private  char CHAR;
        
            private  Object OBJECT;
        
            public DefaultValue() {
                System.out.println("I did nothing!");
            }
        
            public static void main(String args[]) {
                DefaultValue dv = new DefaultValue();
                System.out.println(dv.BOOLEAN);
                System.out.println(dv.BYTE);
                System.out.println(dv.SHORT);
                System.out.println(dv.INT);
                System.out.println(dv.LONG);
                System.out.println(dv.FLOAT);
                System.out.println(dv.DOUBLE);
                System.out.println(dv.CHAR);
                System.out.println(dv.OBJECT);
            }
        
        }

        我重写了默认构造函数。虽然我在构造函数中什么也没做,但变量已经赋值了。

        【讨论】:

          猜你喜欢
          • 2013-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2015-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多