我想知道为什么这段代码片段会编译并运行
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
的使用,而且根本不需要初始化它?
答案 0 :(得分:4)
你已经自己回答了这个问题!由于除了条件初始化之外没有对count
变量的引用,因此不会报告编译错误。只有在尝试在方法体中进一步引用变量时才会出现错误。
答案 1 :(得分:2)
答案很简单。最终变量不需要在声明步骤中初始化。它也被称为&#34;空白决赛&#34;。
答案 2 :(得分:1)
实际上,只有当count
变量是对象或类的字段时,这才会失败。
为什么?因为默认情况下为字段分配默认值。因此,您的陈述:
count = c.getCount()
会有效失败,因为它代表第二次任务......
但是,对于局部变量,在声明时不会分配默认值。
因此,您的代码完全有效,因为您的count
变量永远不会超过一次。
答案 3 :(得分:0)
这是一个完全有效的方案,因为您是第一次初始化变量count
。试试写:
final int count = 0;
您将收到编译错误