1901周记——scala笔记

文章目录

  • scala
      • field
      • 辅助constructor
      • 主constructor
      • 内部类
    • object
    • 伴生对象

scala

field

  • 定义不带private的 var field ,此时scala生成的面向JVM的类时,会定义private的field字段,并提供public的getter和setter方法
    而如果使用private修饰field,则生成的getter和setter也是private的
    如果定义val field,则只会生成getter方法
    如果不希望生成setter和getter方法,则将field声明为private[this]
  • 使用关键词 “var” 声明变量,使用关键词 “val” 声明常量
  • #自定义setter方法的时候一定要注意scala的语法规则限制,签名,=,参数间不能有空格 ex:
    1901周记——scala笔记_第1张图片
  • scala的getter和setter方法的命名与java是不同的,是field和field_=的方式
    如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解会生成4个方法
    <1> name:String
    <2>name_=(newValue:String):Unit
    <3>getName():String
    <4>setName(newValue:String):Unit
class Student {
  @BeanProperty var name = "leo";
}

辅助constructor

scala中可以定义多个辅助constructor,类似于java中的构造函数重载
辅助constructor之间可以互相调用,而且必须第一行调用主constructor

class Student {
  private var name = ""
  private var age = 0

  def this(name: String) {
    this()
    this.name = name
  }

  def this(name: String, age: Int) {
    this()
    this.name = name
    this.age = age
  }
}

主constructor

scala中,主constructor是与类名放在一起的,与java不同
而且类中,没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码,这点感觉没有java清晰

class Student(val name: String, val age: Int) {
  print("your name is " + name + ",your age is " + age)
}

//主constructor中还可以通过使用默认参数来给参数默认值
class Teacher(val name: String = "leo", val age: Int = 30) {
  print("your name is " + name + ",your age is " + age)
}

如果主constructor传入的参数什么修饰都没有,比如name:String,那么如果类内部的方法使用到了该field,则会声明为private[this] name,否则就只能被constructor代码使用而已

内部类

scala中,同样可以在类中定义内部类,但是与java不同的是,每个外部类的对象的内部类,都是不同的类
1901周记——scala笔记_第2张图片
1901周记——scala笔记_第3张图片

object

相当于class的单个实例,通常在里面放一些静态的field或者method
第一次调用object的方法时,就会执行object的constructor,也就是object内部不在method中的代码,但是object不能定义接收参数的constructor
object的constructor只会在第一次被调用时执行一次,以后再次调用就不会执行constructor了
object通常用户作为单例模式的实现,或者放class的静态成员,比如工具方法

伴生对象

如果有一个class,还有一个与class同名的object,那么就称这个object是class的伴生对象,class是object的伴生类
伴生类和伴生对象必须存放在一个.scala文件中
伴生类和伴生对象,最大的特点就在于互相可以访问private field

你可能感兴趣的:(周记,scala)