写点什么

GitHub 霸屏文章!清华教授手写保姆级笔记 Scala - 类,网友:太香了

发布于: 2021 年 05 月 10 日
GitHub霸屏文章!清华教授手写保姆级笔记Scala - 类,网友:太香了

上一篇是分享的是《《MySQL 主从复制》,这篇给大家分享《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 ScalaPersonscalaPerson.age = 18scalaPerson.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) }}
复制代码

scala

  • 以上就是《Scala - 类的定义》的分享。

  • 也欢迎大家交流探讨,该文章若有不正确的地方,希望大家多多包涵。

  • 你们的支持就是我最大的动力,如果对大家有帮忙给个赞哦~~~

用户头像

还未添加个人签名 2021.04.26 加入

还未添加个人简介

评论

发布
暂无评论
GitHub霸屏文章!清华教授手写保姆级笔记Scala - 类,网友:太香了