Scala入门之面向对象

2019-08-20 16:11:59 浏览数 (1)

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/27.
  * 在Scala中的Object是一个单例对象,没办法new
  * object中定义的成员变量和方法都是静态的
  */
object ScalaStatic {
  val name: String = "liyitian"
  var age: Int = 22

  def saySomething(msg: String) = {
    println(msg)
  }

  def apply(food: String) = {
    println("米饭 "   food)
  }
}

调用object

代码语言:javascript复制
object TestMain {
  def main(args: Array[String]): Unit = {
    println(ScalaStatic.name)
    ScalaStatic.age = 18
    println(ScalaStatic.age)
    ScalaStatic.saySomething("你好")
    ScalaStatic.apply("西红柿")
    ScalaStatic("鸡蛋") //语法糖 suger
  }
}

输出

liyitian 18 你好 米饭 西红柿 米饭 鸡蛋

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/27.
  * 在Scala中定义类用class关键字修饰
  * 这个类默认有一个空参构造器
  * 定义在类名称后面的构造器叫主构造器
  * 类的主构造器中的属性会定义成类的成员变量
  * 如果主构造器中的成员属性没有val|var修饰的话,该属性不能被访问,相当于对外没有提供get方法
  * 如果成员属性使用var修饰的话,相当于对外提供了get和set方法
  * 如果成员属性使用val修饰的话,相当于对外提供了get方法
  */
class Teacher(var name: String,val age: Int) {
  var sex: String = _
  var prov: String = _
  //定义个辅助构造器,def this()
  def this(name: String,age: Int,sex: String) = {
    //在辅助构造器中必须先调用主构造器
    this(name,age)
    this.sex = sex
  }
  def this(name: String,age: Int,sex: String,prov: String) = {
    this(name,age,sex) //在上面一个构造器中调用了主构造器
    this.prov = prov
  }
}
代码语言:javascript复制
object TestApp extends App{
  private val techer = new Teacher("天天",23)
  techer.name = "花花"
  println(techer.name,techer.age)
  private val teacher1 = new Teacher("大大",45,"男","湖南")
  println(teacher1.name,teacher1.age,teacher1.sex,teacher1.prov)
}

输出

(花花,23) (大大,45,男,湖南)

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/27.
  * 在Scala中定义类用class关键字修饰
  * 这个类默认有一个空参构造器
  * 定义在类名称后面的构造器叫主构造器
  * 类的主构造器中的属性会定义成类的成员变量
  * 如果主构造器中的成员属性没有val|var修饰的话,该属性不能被访问,相当于对外没有提供get方法
  * 如果成员属性使用var修饰的话,相当于对外提供了get和set方法
  * 如果成员属性使用val修饰的话,相当于对外提供了get方法
  * 类的构造器访问权限,在构造器前加修饰权限
  * private在主构造器之前,这说明该类的主构造器是私有的,外部类或者外部对象不能访问
  * 也适用于辅助构造器
  */
class Teacher private (var name: String,val age: Int) {
  var sex: String = _
  var prov: String = _
  //定义个辅助构造器,def this()
  def this(name: String,age: Int,sex: String) = {
    //在辅助构造器中必须先调用主构造器
    this(name,age)
    this.sex = sex
  }
  private def this(name: String,age: Int,sex: String,prov: String) = {
    this(name,age,sex) //在上面一个构造器中调用了主构造器
    this.prov = prov
  }
}
代码语言:javascript复制
object TestApp extends App{
//  private val techer = new Teacher("天天",23)
//  techer.name = "花花"
//  println(techer.name,techer.age)
  //此时只能访问3参数的构造器
  private val teacher1 = new Teacher("大大",45,"男")
  println(teacher1.name,teacher1.age,teacher1.sex)
}

输出

(大大,45,男)

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/27.
  * 在Scala中定义类用class关键字修饰
  * 这个类默认有一个空参构造器
  * 定义在类名称后面的构造器叫主构造器
  * 类的主构造器中的属性会定义成类的成员变量
  * 如果主构造器中的成员属性没有val|var修饰的话,该属性不能被访问,相当于对外没有提供get方法
  * 如果成员属性使用var修饰的话,相当于对外提供了get和set方法
  * 如果成员属性使用val修饰的话,相当于对外提供了get方法
  * 类的构造器访问权限,在构造器前加修饰权限
  * private在主构造器之前,这说明该类的主构造器是私有的,外部类或者外部对象不能访问
  * 也适用于辅助构造器
  * 类的成员属性访问权限,如果类的主构造器中成员属性是private修饰的,它的set和get方法是私有的,外部不能访问
  */
class Teacher (private var name: String,val age: Int) {
  var sex: String = _
  var prov: String = _
  //定义个辅助构造器,def this()
  def this(name: String,age: Int,sex: String) = {
    //在辅助构造器中必须先调用主构造器
    this(name,age)
    this.sex = sex
  }
  private def this(name: String,age: Int,sex: String,prov: String) = {
    this(name,age,sex) //在上面一个构造器中调用了主构造器
    this.prov = prov
  }
}
代码语言:javascript复制
package test

/**
  * Created by Administrator on 2018/9/27.
  * 在Scala中定义类用class关键字修饰
  * 这个类默认有一个空参构造器
  * 定义在类名称后面的构造器叫主构造器
  * 类的主构造器中的属性会定义成类的成员变量
  * 如果主构造器中的成员属性没有val|var修饰的话,该属性不能被访问,相当于对外没有提供get方法
  * 如果成员属性使用var修饰的话,相当于对外提供了get和set方法
  * 如果成员属性使用val修饰的话,相当于对外提供了get方法
  * 类的构造器访问权限,在构造器前加修饰权限
  * private在主构造器之前,这说明该类的主构造器是私有的,外部类或者外部对象不能访问
  * 也适用于辅助构造器
  * 类的成员属性访问权限,如果类的主构造器中成员属性是private修饰的,它的set和get方法是私有的,外部不能访问
  * 类的访问权限,类的前面加上private[this]标识这个类在当前包下都可见,当前包下的子包不可见
  * 类的前面加上private[包名]表示这个类在当前包及其子包下都可见
  */
private[test] class Teacher (var name: String,val age: Int) {
  var sex: String = _
  var prov: String = _
  //定义个辅助构造器,def this()
  def this(name: String,age: Int,sex: String) = {
    //在辅助构造器中必须先调用主构造器
    this(name,age)
    this.sex = sex
  }
  private def this(name: String,age: Int,sex: String,prov: String) = {
    this(name,age,sex) //在上面一个构造器中调用了主构造器
    this.prov = prov
  }
}
代码语言:javascript复制
package test

/**
  * Created by Administrator on 2018/9/27.
  * 在Scala中定义类用class关键字修饰
  * 这个类默认有一个空参构造器
  * 定义在类名称后面的构造器叫主构造器
  * 类的主构造器中的属性会定义成类的成员变量
  * 如果主构造器中的成员属性没有val|var修饰的话,该属性不能被访问,相当于对外没有提供get方法
  * 如果成员属性使用var修饰的话,相当于对外提供了get和set方法
  * 如果成员属性使用val修饰的话,相当于对外提供了get方法
  * 类的构造器访问权限,在构造器前加修饰权限
  * private在主构造器之前,这说明该类的主构造器是私有的,外部类或者外部对象不能访问
  * 也适用于辅助构造器
  * 类的成员属性访问权限,如果类的主构造器中成员属性是private修饰的,它的set和get方法是私有的,外部不能访问
  * 类的访问权限,类的前面加上private[this]标识这个类在当前包下都可见,当前包下的子包不可见
  * 类的前面加上private[包名]表示这个类在当前包及其子包下都可见
  */
private[test] class Teacher (private var name: String,val age: Int) {
  var sex: String = _
  var prov: String = _
  //定义个辅助构造器,def this()
  def this(name: String,age: Int,sex: String) = {
    //在辅助构造器中必须先调用主构造器
    this(name,age)
    this.sex = sex
  }
  private def this(name: String,age: Int,sex: String,prov: String) = {
    this(name,age,sex) //在上面一个构造器中调用了主构造器
    this.prov = prov
  }
}

/**object Teacher叫类的伴生对象
  * 在伴生对象中可以访问类的私有成员方法和属性
  */
object Teacher {
  def apply(name: String,age: Int): Teacher = {
    //初始化工作
    new Teacher(name,age,"女","山东")
  }
  def main(args: Array[String]): Unit = {
    val teacher = new Teacher("大海",33)
    println(teacher.name)
    val halen = Teacher("海伦",23)
    println(halen.sex,halen.prov)
  }
}

输出:

大海 (女,山东)

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/28.
  * 特质(interface)
  * 在Scala中特质可以定义有实现的方法,也可以定义没有实现的方法
  */
trait ScalaTrait {
  //没有任何实现的方法
  def hello(name: String)
  def small(name: String) = {
    println(s"对$name 笑")
  }
}
代码语言:javascript复制
object ScalaTraitImpl extends ScalaTrait{
  override def hello(name: String): Unit = {
    println(s"hello $name")
  }

  def main(args: Array[String]): Unit = {
    ScalaTraitImpl.hello("hanmeini")
    ScalaTraitImpl.small("haoga")
  }
}
代码语言:javascript复制
trait ScalaTrait {
  def hello(name: String) = {
    println(s"$name")
  }
  def small(name: String) = {
    println(s"对$name 笑")
  }
}
代码语言:javascript复制
trait Fly {
  def fly(name: String) ={
    println(s"$name 在飞")
  }

}
代码语言:javascript复制
class Student {

}
object Person {
  def main(args: Array[String]): Unit = {
    /**
      * 在scala中可以动态混入N个特质
      */
    val student = new Student with ScalaTrait with Fly
    student.hello("大东")
    student.fly("牛牛")
  }
}

输出:

大东 牛牛 在飞

代码语言:javascript复制
object ScalaTraitImpl extends ScalaTrait with Fly{
  override def hello(name: String): Unit = {
    println(s"hello $name")
  }

  def main(args: Array[String]): Unit = {
    ScalaTraitImpl.hello("hanmeini")
    ScalaTraitImpl.small("haoga")
    ScalaTraitImpl.fly("liuda")
  }
}

输出:

hello hanmeini 对haoga 笑 liuda 在飞

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/28.
  * 使用abstract定义一个抽象类
  * 可以没有具体实现的方法
  * 也可以有具体实现的方法
  */
abstract class AbsClass {
  def eat(food: String): String
  def swimming(style: String) = {
    println(s"$style 游")
  }
}
代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/28.
  * 在scala中第一个继承抽象类或者特质,只能使用关键字extends
  * 如果想继承多个特质的话,可以在extends之后使用with关键字
  */
object AbsClassImpl extends AbsClass with Fly{
  override def eat(food: String): String = {
    s"$food 炸着吃"
  }

  def main(args: Array[String]): Unit = {
    println(AbsClassImpl.eat("牛杂"))
    AbsClassImpl.swimming("自由")
    AbsClassImpl.fly("高斯")
  }
}

输出:

牛杂 炸着吃 自由 游 高斯 在飞

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/28.
  * 在scala中,final修饰的类不能被继承
  * 方法不能被重写
  * 成员变量不能被重新修改(赋值)
  */
trait Fly {
  final def fly(name: String) ={
    println(s"$name 在飞")
  }

}

type

scala> type S = String defined type alias S

scala> val name: S = "gak" name: S = gak

代码语言:javascript复制
trait Bird {
  type T
  def learn(s: T) ={
    println(s)
  }
}
代码语言:javascript复制
object FireBird extends Bird{
  override type T = String

  def main(args: Array[String]): Unit = {
    FireBird.learn("火鸟")
    WaterBird.learn(34)
  }
}

object WaterBird extends Bird {
  override type T = Int
}

输出

火鸟 34

代码语言:javascript复制
/**
  * Created by Administrator on 2018/9/28.
  * 支持模式匹配,默认实现了Serializable接口
  * 样例类:case class 类名(属性...)
  */
case class Message(sender: String,messageContent: String)

/**
  * 默认实现了Serializable接口
  * 样例对象:case object 对象名
  * 模式匹配
  * 样例对象不能封装数据
  */
case object CheckHeartBeat

0 人点赞