Scala学习——面向对象

Scala面向对象

三大特征:封装、继承、多态

1、类的定义和使用

package top.ruandb.scala.Course02
object Simple {
 
  def main(args: Array[String]): Unit = {
 
    val person = new People;
    person.name="张三"
    println(person.name +" "+ person.age)
    person.eat("香蕉")
    person.printInfo()
  }
 
  //类的定义
  class People(){
    //定义属性
    var name:String = _
    val age = 18
    //私有属性
    private[this] val gender= "male"
 
    //定义方法
    def eat(food:String): Unit ={
      println(name + "正在吃" + food)
    }
 
    def printInfo(): Unit ={
      println("gender:"+gender)
    }
  }
}

2、构造器

package top.ruandb.scala.Course02
 
object Constructor {
 
  def main(args: Array[String]): Unit = {
 
    //使用主构造器
    val person1 = new People("张三",18);
    println(person1.name + " " + person1.age + " " + person1.gender )
    //使用附属构造器
    val person2 = new People("李四",22,"male")
    println(person2.name + " " + person2.age + " " + person2.gender )
  }
 
  //主构造器
  class People(val name:String,val age:Int){
 
    var gender:String = _
 
    //附属构造器
    def this(name: String,age:Int,gender:String){
      this(name,age)//附属构造器必须首先调用主构造器或者其他附属构造器
      this.gender = gender
    };
  }
}

3、继承 extends

package top.ruandb.scala.Course02
 
import top.ruandb.scala.Course02.Constructor.People
 
object Constructor {
 
  def main(args: Array[String]): Unit = {
 
    val student = new Student("王五",89,"通信工程")
    println(student.name + " " + student.age + " " + student.major)
 
    println(student.toString)
 
  }
 
  //主构造器
  class People(val name:String,val age:Int){
 
    var gender:String = _
    val height:Float = 1.73f
 
    def this(name: String,age:Int,gender:String){
      this(name,age)
      this.gender = gender
    };
  }
  //Student类继承People类
  class  Student (name:String,age:Int,var major:String) extends People(name,age){
 
    //重写属性
    override val height =1.65f
    //重写toString方法
    override def toString: String = "name:" + name +" "+ "age:" + age + " " + "major:" + major
  }
}

4、抽象类

/**
    * 抽象类,只有方法定义,没有方法实现
    * 属性也只有定义
    */
  abstract class  People1{
    var name:String
    var age:Int
 
    def eat(food:String)
    def speak
  }
 
  /**
    * 继承抽象类,重写方法和属性
    */
  class Person1 extends People1{
 
    override var name: String = "赵六"
    override var age: Int = 100
 
    override def eat(food: String): Unit = println("吃"+food)
    override def speak: Unit ={
      println("大声说话")
    }
  }

5、伴生类和伴生对象

如果有一个Class,还有一个与Class同名的Object

那么就称这个Object是Class的伴生对象,Class是Object的伴生类,其中伴生对象是一个单例对象

伴生对象和伴生类可以互相访问其私有成员

package top.ruandb.scala.Course03
object Companion {
 
  def main(args: Array[String]): Unit = {
 
    for( i <- 1.to(10)){
      TestCompanion.incr
    }
    println(TestCompanion.count)//结果为10,说明伴生对象是一个单例对象
 
  }
}
 
/**
  * 伴生类和伴生对象
  * class TestCompanion是伴生对象Object TestCompanion的伴生类
  * object TestCompanion是伴生类class TestCompanion的伴生对象
  */
 
//伴生类
class TestCompanion{
}
 
//伴生对象
object TestCompanion{
 
  var count = 0
  def incr ={
    count += 1
  }
}

6、scala apply

package top.ruandb.scala.Course03
 
object ApplyApp {
 
  def main(args: Array[String]): Unit = {
 
    val at1 = ApplyTest()//实际是通过伴生对象apply方法进行了对象实例化,避免了手动new对象
  }
}
class ApplyTest{
}
object ApplyTest{
  def apply() = {
    println("object apply function")
    new ApplyTest
  }
}

 

posted @ 2019-04-08 22:05  技术小白丁  阅读(209)  评论(0编辑  收藏  举报