【问题标题】:Initialization of Instance Variables in JavaJava中实例变量的初始化
【发布时间】:2013-08-14 17:37:15
【问题描述】:

当我们提供了自己的默认构造函数并且没有在其中初始化 id 时,如何将实例变量 id 初始化为 0?输出为 id:0 status:B id 0 怎么样?

`class Demo{
    private int id;
    private char status; 

    public Demo(){ 
    status = 'B';
    }

    public void display(){
    System.out.println("Id:="+id+" Status:"+status);
    }

    public static void main(String args[]){
    Demo ob = new Demo();
    ob.display();
    }
}`

【问题讨论】:

    标签: java


    【解决方案1】:

    下面是default intializations

    下表总结了上述数据类型的默认值。

    Data Type              |  Default Value (for fields)
    -----------------------+-----------------------------
    byte                   |   0
    short                  |   0
    int                    |   0
    long                   |   0L
    float                  |   0.0f
    double                 |   0.0d
    char                   |   '\u0000'
    String (or any object) |   null
    boolean                |   false
    

    【讨论】:

      【解决方案2】:

      在 Java 中,每个未初始化的变量都会自动初始化为其声明类型的默认值,即:

      • 浮点数:0.0f
      • int/short/byte: 0
      • 长:0L
      • 对象:空
      • 布尔值:假

      【讨论】:

        【解决方案3】:

        原始类型默认为某些值。对于 int,它是 0。

        【讨论】:

          【解决方案4】:

          TL;DR - 实例变量具有默认值。见[1]。


          您说值为零是正确的,或者更确切地说是 0。这是因为在 Java 中,实例变量是驻留在类中而非方法中的变量,不必手动初始化。

          在 Java 中,当声明实例变量时,如果没有给出值,编译器将应用默认值以允许程序运行。 虽然这可以用于您以后可能希望更改实例变量的值的情况,但它通常被认为是不好的做法。

          参见此处,Java 文档:

          默认值

          并不总是需要赋值 字段被声明。已声明但未初始化的字段将 由编译器设置为合理的默认值。通常来说,一般来说, 此默认值将为零或空,具体取决于数据类型。依靠 然而,在这样的默认值上,通常被认为是不好的 编程风格。

          有关按数据类型的默认值的信息,请参阅[1]。

          该文档有关于其他变量的更多信息,即本地:

          局部变量略有不同;编译器从不分配 未初始化的局部变量的默认值。如果你不能 在声明它的地方初始化你的局部变量,确保 在您尝试使用它之前为其分配一个值。访问一个 未初始化的局部变量将导致编译时错误。

          局部变量和实例变量(在 JVM 处理它们的方式上)之间存在差异的原因在于,实例变量被加载到称为“堆”[2] 的内存区域中,而局部变量被加载到称为“堆栈”[2]的单独内存区域中;虽然,现在,这有例外 [3]。堆存储对象和对对象的引用,因此,实例变量与其对象一起存储。最终,做出了一个相当随意的选择,强制初始化本地变量,而不是实例变量。

          [1]https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

          [2]https://www.guru99.com/java-stack-heap.html

          [3]Why do instance variables have default values in java?

          【讨论】:

            【解决方案5】:

            实例变量用默认值初始化,整数为0。

            【讨论】:

              【解决方案6】:

              id 是基本类型int,默认为0

              你在考虑对象

              哪些实际上是对对象的引用,它们默认为null,这意味着它们不指向任何对象。

              【讨论】:

                【解决方案7】:
                • 因为int类型的默认值为0
                • 所有实例变量都分配有默认值

                【讨论】:

                  【解决方案8】:

                  http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

                  声明字段时并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或空,具体取决于数据类型。然而,依赖这样的默认值通常被认为是糟糕的编程风格。

                  下表总结了上述数据类型的默认值。

                  +------------------------+----------------------------+
                  | Data Type              | Default Value (for fields) |
                  +------------------------+----------------------------+
                  | byte                   |               0            |
                  | short                  |               0            |
                  | int                    |               0            |
                  | long                   |              0L            |
                  | float                  |            0.0f            |
                  | double                 |            0.0d            |
                  | char                   |        '\u0000'            |
                  | String (or any object) |            null            |
                  | boolean                |           false            |
                  +------------------------+----------------------------+
                  

                  【讨论】:

                  • 如果我们在 main() 中声明一个变量而不初始化它并尝试打印它,它会显示错误“变量可能尚未初始化”。但是在实例变量的情况下,隐式默认构造函数被调用以将所有实例变量初始化为其默认值,但是如果这个隐式默认构造函数被显式默认构造函数覆盖,那么在创建对象时,应该调用这个显式默认构造函数并且不是隐含的。而在这个显式的默认构造函数中,如果我们还没有初始化 id 它是如何被初始化的呢?
                  【解决方案9】:

                  “对于int类型,默认值为0,即0”。
                  您可以在语言规范中查看默认值:http://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#96595

                  【讨论】:

                    【解决方案10】:

                    根据您的代码, id 是一个实例变量,如果未定义实例变量,则它采用默认值。 在你的情况下,因为 id 是 int 所以值是 0

                    【讨论】:

                    • 实例变量采用默认值,因为初始化它们的默认构造函数。但在这种情况下,默认构造函数已被覆盖,它不会初始化 id
                    猜你喜欢
                    • 2014-09-14
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-02-13
                    • 2016-06-17
                    • 2021-05-07
                    • 2012-09-17
                    • 2023-03-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多