如果一个类中包含没有被实现的成员,那么称这个类为抽象类。
abstract
修饰abstract
定义抽象类的抽象方法abstract class Car3(val name: String) {
val carBrand: String //字段没有初始化值,就是一个抽象字段
def info() //抽象方法
def greeting(): Unit = {
println("Welcome to my car !")
}
}
抽象字段必须给出类型声明,否则编译不通过会报错。
一个类从上面一个类继承下来,使用extends
表示继承关系。
ovemride
关键字是可选的ovemride
关键字是必须的val
类型字段,不能重载var
字段abstract class Car4 {
val carBrand: String
def info()
def greeting() {println("Welcome to my car !")}
}
class BMWCar extends Car4 {
override val carBrand = "BMW"
def info() {printf("This is a %s car. It is expensive.\n", carBrand)}
override def greeting() {println("Welcome to my BMW car!")}
}
class BYDCar extends Car4 {
override val carBrand = "BYD"
def info() {printf("This is a %s car. It is cheap.\n", carBrand)}
override def greeting() {println("Welcome to my BYD car!")}
}
object MyCar{
def main(args: Array[String]): Unit = {
val myCar1=new BMWCar()
val myCar2=new BYDCar()
myCar1.greeting()
myCar1.info()
myCar2.greeting()
myCar2.info()
}
}
out:
Welcome to my BMW car!
This is a BMW car. It is expensive.
Welcome to my BYD car!
This is a BYD car. It is cheap.
Scala类的顶层是一个叫Any
的抽象类,所有的类都是从这里继承下来的。从Any类又派生出这些子类,一个是AnyVal
另外一个是AnyRef
。
所有的数据类型Char、Byte、Short、Int、Long
都是继承自AnyVal
,不可实例化,这些叫做值类型,它的值最终都是被放在寄存器当中去的。
所有的Scala的引用类型都是继承自AnyRef
这个子类的,可以实例化,它的对象被实例化之后都是被保存在堆当中去的。
这个对象生成之后实际上是生成了一个指针指向了堆当中的一个地址;所有引用类型的对象都是存在堆当中的。
Null
是所有引用类型的子类型。
Nothing
是所有类的子类,没有实例,用做错误处理和异常处理。
Option类是一个抽象类。
Option有个子类叫Some子类。只要返回值是Option类的,这些返回值最终返回的结果都会被封装成Some对象返回来。
Option里面还有一个对象叫None对象,None对象就是返回的东西是空,当返回东西为空时它会返回一个None,如果有东西就会封装到Some对象里面作为Some返回来。
scala> case class Book(val name:String,val price:Double)
defined class Book
scala> val books=Map("hadoop"->Book("Hadoop",35.5),"spark"->Book("Spark",55.5),"hbase"->B
ook("Hbase",26.0))//定义一个书名到书对象的映射
books: scala.collection.immutable.Map[String,Book] = Map(hadoop -> Book(Hadoop,35.5), spa
rk -> Book(Spark,55.5), hbase -> Book(Hbase,26.0))
scala> books.get("hadoop")//返回该键所对应值的Some对象
res0: Option[Book] = Some(Book(Hadoop,35.5))
scala> books.get("hive")//不存在该键,返回None对象
res1: Option[Book] = None
scala> books.get("hadoop").get//Some对象的get方法返回其包装的对象
res2: Book = Book(Hadoop,35.5)
scala> books.get("hive").get//None对象的get方法会抛出异常
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:529)
at scala.None$.get(Option.scala:527)
... 28 elided
scala> books.get("hive").getOrElse(Book("Unknown name",0))
res4: Book = Book(Unknown name,0.0)