为什么以下代码编译?

时间:2012-10-12 13:16:17

标签: java android

我想知道为什么这段代码片段会编译并运行

private BusRoute readRouteCursor( final Cursor c )
{
    final BusRoute result;
    final int count;
    if ( c == null || ( count = c.getCount() ) < 1 )
    {
        result = null;
    }
    else
    {
        /*
         * Reads cursor
         */
    }
    return result;
}

我让它工作得很好但是当我停下来思考它时我想知道为什么,因为变量countfinal但是如果第一个条件的话,它可能不会被设置符合if条款。

是否有效,因为编译器足够聪明,从那时起就看不到count的使用,而且根本不需要初始化它?

4 个答案:

答案 0 :(得分:4)

你已经自己回答了这个问题!由于除了条件初始化之外没有对count变量的引用,因此不会报告编译错误。只有在尝试在方法体中进一步引用变量时才会出现错误。

答案 1 :(得分:2)

答案很简单。最终变量不需要在声明步骤中初始化。它也被称为&#34;空白决赛&#34;。

答案 2 :(得分:1)

实际上,只有当count变量是对象或类的字段时,这才会失败。

为什么?因为默认情况下为字段分配默认值。因此,您的陈述:

count = c.getCount()

会有效失败,因为它代表第二次任务......

但是,对于局部变量,在声明时不会分配默认值。

因此,您的代码完全有效,因为您的count变量永远不会超过一次。

答案 3 :(得分:0)

这是一个完全有效的方案,因为您是第一次初始化变量count。试试写:

final int count = 0;

您将收到编译错误