成员变量
在java中,我们定义一个类是这样的:
public class JavaPerson {
private String name;
private Integer age;
// 省略name、age的setter和getter方法
}
调用是这样的:
public static void main(String[] args) {
JavaPerson javaPerson = new JavaPerson();
javaPerson.setAge(18);
javaPerson.setName("张三");
System.out.println("姓名:" + javaPerson.getName() + ",年龄:" + javaPerson.getAge());
}
在scala中,会比较简洁一点,类的定义如下,因为scala中变量的定义都要有初始值,所以我们这边可以定义为下划线说明是空。
class ScalaPerson {
var age: Integer = _
var name: String = _
}
调用是这样的:
val scalaPerson = new ScalaPerson
scalaPerson.age = 18
scalaPerson.name = "张三"
println(s"姓名:${scalaPerson.name},年龄:${scalaPerson.age}")
看起来我们是直接调用对象的属性,实际上是scala隐藏了setter和getter,我们看看反编译的代码,这个是ScalaPerson反编译后的代码,可以看到他的属性其实是private的,然后还有类似setter和getter的方法,比如age()和age_$eq()方法
有时候为了兼容java框架,需要setter和getter方法,我们只要在属性上面加@BeanProperty
注解就可以用setter和getter方法了。
class ScalaPerson2 {
@BeanProperty
var age: Integer = _
var name: String = _
}
object ScalaPerson2 {
def main(args: Array[String]): Unit = {
val scalaPerson = new ScalaPerson2
scalaPerson.age = 17
scalaPerson.setAge(18)
scalaPerson.name = "张三"
println(s"姓名:${scalaPerson.name},年龄:${scalaPerson.getAge}")
}
}
我们知道,scala的变量声明包括val和var,如果在类中定义val,那这个变量就是final类型的,比如上面的name通过val定义,他类似于下面的java代码,并且只有get方法。
private final String name = "张三";
构造器
无参构造
无参的话,可以在类名加括号,也可以不加
class ScalaConstruct1 {
var name: String = _
var age: Int = _
}
object ScalaConstruct1 {
def main(args: Array[String]): Unit = {
val construct = new ScalaConstruct1
construct.name = "张三"
construct.age = 18
}
}
有参构造器
有参的话,变量的修饰符包括没有修饰符、val和var。下面用例子来说明这三种情况。
class ScalaConstruct2(param1: String, var param2: String, val param3: String) {
}
object ScalaConstruct2 {
def main(args: Array[String]): Unit = {
val construct = new ScalaConstruct2("aa", "bb", "cc")
//println(construct.param1) //error
//construct.param1 = "aaa" // error
construct.param2 = "bbb"
println(construct.param2)
//construct.param3 = "ccc"// error
println(construct.param3)
}
}
param1是没有修饰符的,所以他是ScalaConstruct2的局部变量,这样在类外面就不能调用了。
param2是可以修改的,所以既可以读取也可以修改。
param3是不能修改的,所以只能读取不能修改。
主构造器
上面无参的以及放在类名后面的有参构造器都是主构造器,另外主构造器还可以执行类中能够执行的语句。
所以下面运行后会直接打印hello ScalaConstruct3
class ScalaConstruct3() {
println("hello ScalaConstruct3")
}
object ScalaConstruct3{
def main(args: Array[String]): Unit = {
new ScalaConstruct3
}
}
辅助构造器
java中用类命当做构造器的名称,在scala中辅助构造器用this来声明,他必须直接或者间接的调用主构造器。类的实例化,跟java类似。
class ScalaConstruct4() {
var age: Int = _
var name: String = _
def this(name: String) {
this()
this.name = name
}
def this(name: String, age: Int) {
this(name)
this.age = age
}
}
object ScalaConstruct4 {
def main(args: Array[String]): Unit = {
new ScalaConstruct4
new ScalaConstruct4("张三")
new ScalaConstruct4("张三",18)
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。