有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

类为什么实例变量在java中有默认值?

为什么类中声明的变量有默认值,而方法中声明的变量(称为“局部变量”)在Java中没有默认值

比如

class abc
{
   int a;

   public static void main(String ss[])
   {
        int b;

          abc aa=new abc();
          System.out.println(aa.a);
          System.out.println(b);
    }
 }

在上面的示例中,变量a的默认值为0,但变量b给出的错误是它可能尚未初始化


共 (2) 个答案

  1. # 1 楼答案

    局部变量初始化

    在方法和块中声明的变量称为局部变量。局部变量在方法调用时创建时未初始化。因此,局部变量在使用之前必须显式初始化。否则,在执行包含方法或块时,编译器会将其标记为错误

    示例:

    public class SomeClassName{
    
    public static void main(String args[]){
    int total;
    System.out.println("The incremented total is " + total + 3); //(1)
    }
    }
    

    编译器抱怨println语句(1)中使用的局部变量total可能未初始化。 在使用前初始化局部变量total可以解决此问题:

    public class SomeClassName{
    
    public static void main(String args[]){
    int total = 45; //Local variable initialized with value 45 System.out.println("The incremented total is " + total+ 3); //(1)
    }
    }
    

    字段初始化

    如果在声明或初始化程序块中没有为实例或静态变量提供初始化,则它将使用其类型的默认值进行隐式初始化。 每次实例化类时,实例变量都会用其类型的默认值初始化,,即针对从该类创建的每个对象。 在第一次加载类时,静态变量将使用其类型的默认值初始化

  2. # 2 楼答案

    tl;博士:这或多或少是一个随意的选择

    如果你问我,Java为实例变量设置默认值是一个错误。编译器应该在编译之前强制程序员对其进行初始化,就像局部变量一样

    默认值背后的基本原理是安全。当一个对象被实例化时,将为该对象分配一块内存,该对象包含实例变量指向的位置等。Java设计人员决定用零和空清除这部分内存是个好主意。这样,您就永远不会读取在分配对象之前碰巧存在的垃圾。他们本可以强制初始化;这个选择没有什么根本的意义。它可能使事情易于实现,并且对Java的设计者来说有足够的意义

    对于局部变量,设计者选择强制初始化(或者更准确地说,当仅声明局部变量时,他们选择不进行任何类型的初始化,因此编译器最合乎逻辑的行为是在使用前强制初始化变量)