我编写了一个 Scala 类Sheltie
来了解作用域在 Scala 中是如何工作的。我编写了一个等效的 Java Sheltie 类作为交叉引用。这就是我遇到麻烦的地方。
在 ScalaSheltie
类的主体中,有一个对被调用方法的方法调用bark
,以及在调用println
之后的语句bark
。等效的方法调用bark()
可以放在另一个方法内部的等效 Java 类中,但在任何方法之外,它可以理解地抱怨Duplicate method bark()
.
我了解 Java 代码的工作原理,所以这种行为(在 Java 中)并不奇怪。令人困惑的是 Scala 的行为方式为何如此。
我希望解决的是:为什么 Scala 允许在类主体中“调用”以及为什么它允许在 if 块中创建另一个 val 定义,而 Java 不允许。
Foo.scala
class Sheltie {
val barkNum = 10
def bark() {
//local barkNum of "bark" method
val barkNum = 20
if(true){
//local "barkNum" of if-block
val barkNum = 30 //why does Scala not complain of a duplicate local variable, when Java does in the equivalent program Sheltie.java
println("Inside if block: No of times Riley barked is " + barkNum)
}
println("Outside if block: No of times Riley barked is " + barkNum)
}
bark //Why does this work, when you can't do this in Java
println("Outside bark: No of times Riley barked is " + barkNum)
}