类和trait

修饰控制符

package base

object obj {
  def main(args: Array[String]): Unit = {

    // 调用无参构造方法
    val ps = new Person()
    println(ps.name)

    val person = new Person("小明")
    person.name = "小张"
    println(person.name)

    // 自定义private 字段set方法使用
    person.myAge = 1
    println(person.myAge)

    person.otherPerson(new Person("小李"))
  }
}


class Person {

  // 默认是public 会自动生成get和set方法
  var name: String = _

  // 不会自动生成get和set方法
  val info1: String = "info1"
  
  protected var info3: String = _
  protected[this] var info4: String = _
  // 在 base 包及包下面使用
  protected[base] var info5: String = _

  // 私有字段
  private var age: Int = _

  // age 的get方法,不能和字段名字相同
  def myAge: Int = age

  // age 的set方法,不能和字段名字相同,注意格式
  def myAge_=(newAge: Int) {
    age = newAge
  }

  private[this] val info2: String = "info2"

  // private[this] 和 private的区别
  def otherPerson(other: Person): Unit = {
    println(this.age == other.age)

    // 报错! 不能访问仅在实例内部使用的字段
    //    println(this.info2.equals(other.info2))
  }

  // 生成有参构造方法
  def this(name: String) {
    // 调用无参构造方法
    this()
    // 初始化变量
    this.name = name
  }

}
null
小张
1
false

抽象类

package base

object absC {
  def main(args: Array[String]): Unit = {
    val c1 = new C1()

    c1.absF1("abs1")
    c1.absF2("abs2")
    c1.fun1("fun1")
  }
}

// 抽象类
abstract class absClass1 {
  // 抽象方法
  def absF1(name: String)

  def absF2(name: String): String

  def fun1(name: String): Unit = {
    println(s"fun1 name = $name")
  }
}

// 继承抽象类
class C1 extends absClass1 {

  // 实现抽象方法
  override def absF1(name: String): Unit = {
    println("implement absF1")
  }

  override def absF2(name: String): String = {
    println(s"implement absF2")
    name
  }

  // 重写抽象类的方法
  override def fun1(name: String): Unit = {
    println(s"overwrite fun1 name = $name")
  }
}
implement absF1
implement absF2
overwrite fun1 name = fun1

枚举类

package base

object absC {
  def main(args: Array[String]): Unit = {
    // 获取枚举
    val red = Enum.RED
    println(red)
    
    val red1 = Enum.RED1
    println(red1)
  }
}

// 继承 Enumeration 特质
object Enum extends Enumeration{

  // 定义多个枚举,返回的是自身
  val RED, YELLOW, GREEN = Value
  val RED1 = Enum
}
RED
Enum

特质

  • 像抽象类, 可以有抽象成员和非抽象成员
  • 像java接口, 可以多重继承, 第一个继承使用extends之后的使用with隔开
  • 当多个特质拥有相同名的方法时, 默认调用最右边的特质的方法
  • 需要调用多个特质的相同方法, 使用super调用父类的方式来实现链式调用
package base

object TraitDM {
  def main(args: Array[String]): Unit = {

    val t = new CT
    t.Log("this is a log!")

  }
}

trait T {
  // 普通方法
  def Log(info: String): Unit = {

  }
}

// 继承 T
trait T1 extends T {
  override def Log(info: String): Unit = {
    println(s"T1 info = $info")
    // 调用 父特质的Log方法
    super.Log(info)
  }
}

trait T2 extends T {
  override def Log(info: String): Unit = {
    println(s"T2 info = $info")
    super.Log(info)
  }
}

class CT extends T1 with T2 {
  override def Log(info: String): Unit = {
    super.Log(info)
  }
}
T2 info = this is a log!
T1 info = this is a log!

猜你喜欢

转载自www.cnblogs.com/studyNotesSL/p/11443807.html