乐趣区

关于scala:Scala-类的定义

成员变量

在 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)
  }
}
退出移动版