Scala入门之面向对象

/**
  * 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)
  }
}

调用objectapp

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

输出ide

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

/**
  * 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
  }
}
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)
}

输出scala

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

/**
  * 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
  }
}
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,男)接口

/**
  * 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
  }
}
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
  }
}
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)
  }
}

输出:get

大海
(女,山东)it

/**
  * Created by Administrator on 2018/9/28.
  * 特质(interface)
  * 在Scala中特质能够定义有实现的方法,也能够定义没有实现的方法
  */
trait ScalaTrait {
  //没有任何实现的方法
  def hello(name: String)
  def small(name: String) = {
    println(s"对$name 笑")
  }
}
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")
  }
}
trait ScalaTrait {
  def hello(name: String) = {
    println(s"$name")
  }
  def small(name: String) = {
    println(s"对$name 笑")
  }
}
trait Fly {
  def fly(name: String) ={
    println(s"$name 在飞")
  }

}
class Student {

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

输出:class

大东
牛牛 在飞

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 在飞

/**
  * Created by Administrator on 2018/9/28.
  * 使用abstract定义一个抽象类
  * 能够没有具体实现的方法
  * 也能够有具体实现的方法
  */
abstract class AbsClass {
  def eat(food: String): String
  def swimming(style: String) = {
    println(s"$style 游")
  }
}
/**
  * 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("高斯")
  }
}

输出:

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

/**
  * 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

trait Bird {
  type T
  def learn(s: T) ={
    println(s)
  }
}
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

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

/**
  * 默认实现了Serializable接口
  * 样例对象:case object 对象名
  * 模式匹配
  * 样例对象不能封装数据
  */
case object CheckHeartBeat
相关文章
相关标签/搜索