大数据开发Scala面向对象(第二十七篇)

128 阅读4分钟

一、类(class)

1.1、class定义
  1. Scala中定义和Java一样,都是使用class关键字
  2. 和Java一样,使用new关键字创建对象
package com.strivelearn.scala
​
/**
 * @author strivelearn 
 * @version Person.java, 2022年11月12日
 */
class Person {
  var name: String = "scala";
​
  /**
   * 如果在定义方法的时候指定(),那么在调用的时候()可写可不写
   */
  def sayHello(): Unit = {
    println("Hello " + name)
  }
​
  /**
   * 如果在定义方法的时候没指定(),则调用方法的时候肯定不能带()
   * @return
   */
  def getName: String = name
}
package com.strivelearn.scala/**
 * @author xys 
 * @version PersonTest.java, 2022年11月12日
 */
object PersonTest {
  def main(args: Array[String]): Unit = {
    val person = new Person()
    person.sayHello();
    println("================================")
    println(person.getName)
  }
}
Hello scala
================================
scala
1.2、构造函数constructor
  1. Scala的主constructor是与类名放在一起的,与Java不同
  2. 注意:在类中,没有定义在任何方法或者是代码块之中的代码就是主constructor的代码
  3. 主构造函数可以通过默认参数,来给参数设置默认值
package com.strivelearn.scala.objectoriented
​
/**
 * @author strivelearn
 * @version Student.java, 2022年11月12日
 */
class Student(val name: String, val age: Int) {
  println("name  is " + name + " age is " + age)
}
package com.strivelearn.scala.objectoriented
​
/**
 * @author strivelearn
 * @version StudentTest.java, 2022年11月12日
 */
object StudentTest {
  def main(args: Array[String]): Unit = {
    val student = new Student("张三", 21)
  }
}
name  is 张三 age is 21
class Student(val name: String = "java", val age: Int = 21) {
  println("name  is " + name + " age is " + age)
}
1.3、辅助构造函数
  1. Scala可以给类定义多个辅助构造函数,类似于Java中的构造函数重载
  2. 辅助构造函数可以互相调用,第一行必须调用主构造函数
package com.strivelearn.scala.objectoriented
​
/**
 * 定义个主构造函数是空的
 *
 * @author strivelearn
 * @version Student.java, 2022年11月12日
 */
class Student {
  var name = "java"
  var age = 20
​
  def this(name: String) {
    this()  
    this.name = name
  }
​
  def this(name: String, age: Int) {
    this(name: String)
    this.age = age
  }
}

二、对象(object)

Scala中的class与Java中的class是类似的,Java中没有的内容叫做Object。

  1. object相当于class的单个实例,通常在里面放一些静态的field或者method
  2. object不能定义带参数的构造函数,只有空参构造函数
  3. 第一次调用object的方法时,会执行object的构造函数,仅执行一次
  4. object通常作为单例模式的实现,或者放class的静态成员
  5. object不能new,可以直接使用
package com.strivelearn.scala.objectoriented

/**
 * @author strivelearn
 * @version PersonObj.java, 2022年11月12日
 */
object PersonObj {
  var age = 1
  println("这是PersonObj")

  def getAge = age
}
2.1、伴生对象
  1. 如果有一个class。还有一个与class同名的object,那么就称这个object是class的伴生对象,class是obejct的伴生类
  2. 伴生类与伴生对象必须存放在一个.scala文件之中
  3. 伴生类和伴生对象最大特点在于可以互相访问private field
package com.strivelearn.scala.objectoriented.test1

import com.strivelearn.scala.objectoriented.test1.Person.fdNum

/**
 * @author strivelearn
 * @version Person.java, 2022年11月13日
 */
class Person(val name: String, val age: Int) {
  def sayHello: Unit = println("name:" + name + ",age:" + age + ",fdNum:" + Person.fdNum)
}

//伴生对象
object Person {
  private val fdNum = 1

  def getFdNum: Int = fdNum
}
package com.strivelearn.scala.objectoriented.test1

/**
 * @author strivelearn
 * @version PersonTest.java, 2022年11月12日
 */
object PersonTest {
  def main(args: Array[String]): Unit = {
    val zhangsan = new Person("zhangsan", 20)
    zhangsan.sayHello
  }
}
2.2、apply
  1. apply是object中非常重要的一个特殊方法,通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能
  2. 在创建对象的时候,就不需要使用new Class的方法了,而是使用class()的方式,隐式调用伴生对象的apply方法,这样会让对象创建更加简洁
package com.strivelearn.scala.objectoriented.test2

/**
 * @author strivelearn
 * @version Person.java, 2022年11月13日
 */
//伴生类
class Person(val name: String) {
  println("name: " + name)
}

//伴生对象
object Person {
  def apply(name: String): Person = {
    println("apply exec ...")
    new Person(name)
  }
}
package com.strivelearn.scala.objectoriented.test2

/**
 * @author strivelearn
 * @version PersonTest.java, 2022年11月13日
 */
object PersonTest {
  def main(args: Array[String]): Unit = {
    val jack = Person("jack")
  }
}

apply exec ... name: jack

三、main方法

  1. 和Java一样,在Scala中如果要运行一个应用程序,必须有一个main方法,作为入口

  2. Scala中的main方法必须定义在object中,格式为

    def main(args: Array[String]): Unit = {
       //todo
      }
    

四、接口(trait)

  1. 类继承trait后,必须实现trait中的抽象方法,实现时不需要使用override关键字
  2. scala不支持对类进行多继承,但是支持对trait进行多重继承,使用with关键字即可
package com.strivelearn.scala.objectoriented.test3

/**
 * @author strivelearn
 * @version Fly.java, 2022年11月13日
 */
trait Fly {
  /**
   * 使用xxx飞行
   *
   */
  def canFly()
}

trait Swimming {
  /**
   * 使用xxx游泳
   *
   */
  def canSwim()
}

class Person extends Fly with Swimming {
  /**
   * 使用xxx飞行
   *
   * @param skill
   */
  override def canFly(): Unit = {
    println("人类使用飞机进行飞翔")
  }

  /**
   * 使用xxx游泳
   *
   */
  override def canSwim(): Unit = {
    println("人类使用双手进行游泳")
  }
}

object Person {
  def main(args: Array[String]): Unit = {
    val person = new Person()
    person.canFly()
    person.canSwim()
  }
}

人类使用飞机进行飞翔 人类使用双手进行游泳