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 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)

  }

}

scala

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

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

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

你可能感兴趣的:(GitHub霸屏文章!清华教授手写保姆级笔记Scala - 类,网友:太香了)