1

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

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;
}

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

它是否有效,因为编译器足够聪明,可以看到从那时count起没有任何用途,并且根本不需要初始化它?

4

4 回答 4

4

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

于 2012-10-12T13:19:14.107 回答
2

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

于 2012-10-12T13:21:15.330 回答
1

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

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

count = c.getCount()

实际上会失败,因为它将代表第二次分配......

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

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

于 2012-10-12T13:23:41.377 回答
0

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

final int count = 0;

你会得到一个编译错误

于 2012-10-12T13:20:12.000 回答