我有时会看到类似下面的内容。
class Test(val str: String){
}
我用val
编写了一些示例代码,但我发现共同声明与val
的方式没有任何区别。
他们之间有什么区别? 什么时候应该使用?
答案 0 :(得分:6)
如果您添加// 'name' is a val
class Person(val name: String)
val p = new Person("Alvin Alexander")
p.name // String = Alvin Alexander
p.name = "Fred Flintstone" // error: reassignment to val
// 'name' is neither var or val
class Person(name: String)
val p = new Person("Alvin Alexander")
p.name // error: value name is not a member of Person
,您的变量将在课堂外显示。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp"
android:background="@drawable/cell_background">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="15dp"
android:text="New Text"
android:gravity="center"
android:background="@color/white"
android:id="@+id/textView"/>
</LinearLayout>
代码取自http://alvinalexander.com/scala/scala-class-examples-constructors-case-classes-parameters
答案 1 :(得分:2)
通过添加@ EntryLevelDev的答案,您可以使用javap
查看实际发生的情况。
1.scala
class Test(val str: String){
}
步骤1。 scalac 1.scala
步骤2。 javap测试
编译自&#34; 1.scala&#34;
public class Test {
public java.lang.String str();
public Test(java.lang.String);
}
2.scala:
class Test2(str: String){
}
步骤1。 scalac 2.scala
步骤2。 javap Test2
编译自&#34; 1.scala&#34;
public class Test1 {
public Test1(java.lang.String);
}
因此,当您添加val时,scala会根据参数的名称生成一个方法,并且会公开,因此可以从外部看到。