【问题标题】:Uninitialized object is not null AND return in constructor未初始化的对象不为空并且在构造函数中返回
【发布时间】:2018-06-12 03:19:04
【问题描述】:

我有两个关于 Java 的问题:

  1. 我知道未初始化的对象会自动分配null,但这段代码不起作用 -

    A a;        //A is some valid user-defined object  
    System.out.println(a != null);
    

    这会产生错误:error: variable a might not have been initialized.
    这表明a 不为空。那么,我如何区分null 和这些变量呢?

  2. 我知道构造函数没有返回任何值,即使voidreturn 返回void,那么下面的代码如何才能完美运行?

    A() {
        //...Some code
        return;        //Works perfectly even if it returns void from inside construtor
    }
    

【问题讨论】:

  • 历史:在 C/C++ 中,所有变量都将被统一化。使用 java,所有 fields 都会自动归零以简化对象创建。但是对于局部变量,没有自动默认值,因为这会导致意外零/被遗忘情况的错误:int a; if (...) { a = 42; } else { ... }

标签: java constructor null initialization return


【解决方案1】:

从下一次开始,考虑一次只问一个问题。

我知道未初始化的对象被自动分配为空,但这段代码不起作用 -

这适用于实例成员。不适用于局部变量。如果您的代码在您应该考虑分配的方法中。

我知道构造函数不返回任何值,甚至不返回void,return返回void,那么下面的代码如何才能完美地工作呢?

只是一个普通的return; 终止那里的执行。它不会返回任何内容,并且是有效的,就像 break; 语句一样。

【讨论】:

  • @suresh,我知道 return 会终止那里的执行,但它会返回 void。它是如何处理的?编译器会忽略它吗?或者有一些内部机制。
【解决方案2】:

在第一个问题中,只有未初始化的全局变量被赋值为“null”,而不是局部变量。

在第二个问题中,返回在任何“返回给调用者”的方法中都有效。要更好地理解,请查看此代码。

class practice {
    practice(){
        for(int i=0 ; i<10 ; i++){
            System.out.println(i);
            if(i==5)return;
        }
    }
    public static void main(String[] args){
        new practice();
    }
} 

【讨论】:

    【解决方案3】:

    回答您的第一个问题:

    由于这个“a”是一个局部变量,如果没有明确定义,它们处于未定义状态。只有实例变量被分配为 null 作为默认值。这就是您收到上述编译错误的原因。

    请参阅 oracle 文档here 了解更多信息。

    The compiler will assign a reasonable default value for fields of the above types; 
    for local variables, a default value is never assigned
    

    回答第二个问题:

    在构造函数中你只能写return来停止执行。你不能用一些价值写回报。它基本上意味着该函数将完成当前例程的处理并返回到调用例程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2021-11-06
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多