1. 对象
1.1. 单例对象
在 Scala 中没有静态方法和静态字段,但是可以使用 object 这个语法结构来达到同样的目的。
(1) 存放工具函数和常量
(2) 高效共享单个不可变的实例
(3) 单例模式
package logging
//使用关键字object定义单例对象
object Logger {
def info(message: String): Unit = println(s"INFO: $message")
}
单例对象的使用
//导入单例对象信息,使之在当前类可见
import logging.Logger.info
class Project(name: String, daysToComplete: Int)
class Test {
val project1 = new Project("TPS Reports", 1)
val project2 = new Project("Website redesign", 5)
//调用单例对象中定义的方法
info("Created projects") // Prints "INFO: Created projects"
}
1.2.伴生对象
在 Scala 的类中,与类名相同并且用 object 修饰的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性,他们必须存在同一个源文件中。
class AccountInfo {
//类的伴生对象的功能特性并不在类的作用域
//所以不能直接用newUniqueNumber()调用伴生对象的方法
var id = AccountInfo.newUniqueNumber()
}
object AccountInfo {
private var lastNumber = 0
private def newUniqueNumber() = {
lastNumber += 1; lastNumber
}
def main(args: Array[String]) {
//相当于Java中的静态方法调用
println(AccountInfo.newUniqueNumber())
}
}
1.3. apply 方法
通常我们会在类的伴生对象中定义 apply 方法,当遇到类名( 参数1,...参数n )时 apply 方法会被调用。
class AccountInfo {
}
object AccountInfo {
private var lastNumber = 0
private def apply(arg :Int) = {
lastNumber = arg*2 + 1; lastNumber
}
def main(args: Array[String]) {
println(AccountInfo(1))
}
}
1.4. 应用程序对象
Scala 程序都必须从一个对象的 main 方法开始,可以通过扩展 App 特质,不写 main 方法。
object Hello extends App{
println("Hello World")
}
等同于
object Hello {
def main(args: Array[String]): Unit = {
println("Hello World")
}
}
1.5. 提取器
带有 unapply 方法的对象,经常用在模式匹配或者偏函数中。
import scala.util.Random
object CustomerID {
def apply(name: String) = s"$name--${Random.nextLong}"
def unapply(customerID: String): Option[String] = {
val name = customerID.split("--").head
if (name.nonEmpty) Some(name) else None
}
}
//调用apply方法创建一个对象,等价于CustomerID.apply("Sukyoung")
val customer1ID = CustomerID("Sukyoung") // Sukyoung--23098234908
customer1ID match {
//调用unapply方法,提取name信息
case CustomerID(name) => println(name) // prints Sukyoung
case _ => println("Could not extract a CustomerID")
}
2. 继承
2.1. 扩展类和重写方法
在 Scala 中扩展类的方式和 Java 一样都是使用 extends 关键字。
在 Scala 中重写一个非抽象的方法必须使用 override 修饰符。
2.2. 类型检查和转换
2.3. 超类的构造
下面代码定义了一个子类和一个调用超类构造器的主构造器。
class Employ(name: String, age: Int, val Salary:Double) extends Person (name,age)
下面的代码展示类的继承,以及接口的实现等。
object ClassDemo {
def main(args: Array[String]) {
val h = new Human
println(h.byScala())
}
}
//相当于Java的接口
trait Coding{
def byJava(flag : Boolean): Unit ={
if(flag)
{
println("I can code by Java")
}
else{
println("I can't code by Java")
}
}
//未被实现的方法默认为抽象方法
def byScala(): String
}
//抽象类
abstract class Animal {
def run(): Int
val name: String
}
class Human extends Animal with Coding{
val name = "abc"
//打印几次"ABC"?
val t1,t2,(a, b, c) = {
println("ABC")
(1,2,3)
}
println(a)
println(t1._1)
//在Scala中重写一个非抽象方法必须用override修饰
override def byJava(flag: Boolean): Unit = {
println("Coding by Java and Scala")
}
def byScala(): String={
"coding by Scala"
}
//在子类中重写超类的抽象方法时,不需要使用override关键字,写了也可以
def run(): Int = {
1
}
}
本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!