我正在CodingBat.com(extraFront)上解决一个基本的Java字符串问题。
任务是给定一个任意长度的字符串,返回重复三次的两个第一个字符。第一个例子是我最终直观地做的事情:
public String extraFront(String str) {
if (str.length() <= 2){
String front = str;
}else{
String front = str.substring(0,2);
}
return front+front+front;
}
哪个给我一个错误,前面无法解决。我猜我需要在循环外定义变量,所以我将代码更改为以下代码,它可以正常工作:
public String extraFront(String str) {
String front;
if (str.length() <= 2){
front = str;
}else{
front = str.substring(0,2);
}
return front+front+front;
}
让我感到困惑的是,为什么这会产生影响,因为无论如何变量都会被宣布,不是吗?这是CodingBat如何处理代码的特性,还是这实际上是一个错误?如果是,为什么这个错误的代码到底是什么?如果它不是不正确的,它是不好的风格?
答案 0 :(得分:4)
让我感到困惑的是,为什么这会产生影响,因为无论如何变量都会被宣布,不会吗?
这是一个范围问题。变量仅在声明它的块中可见。这与CodingBat无关 - 它是Java语言的一部分。来自section 6.3 of the JLS:
声明的范围是程序的一个区域,声明声明的实体可以使用简单的名称引用该区域,只要它是可见的(第6.4.1节)。 ...
块(第14.4节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化器开始,并包括局部变量声明语句中右侧的任何其他声明符。
我还恳请您了解conditional operator,这可以帮助解决这些问题:
String front = str.length() <= 2 ? str : str.substring(0, 2);
答案 1 :(得分:1)
当您在block
中声明局部变量时,variable
只会在该块中显示,符合scoping
你可以看到一个简单的video:)
变量仅在其声明中可用,直到声明它的大括号末尾。程序文本中变量有效的区域称为其范围。