在Scala里,继承一个父类类似Java很相似,只是需要注意的是:1.重写父类方法必须用override关键字;2.只有主构造函数才能向父类构造函数中传参数。
Scala的父构造函数必须调用主构造函数或则另一个副构造函数函数。只要在主构造函数中才能向基类的构造函数传参数。
在Scala里,Any类型是所有Scala类型的超类,如图:

Any是一个抽象类,它的直接后代是AnyVal和AnyRef。AnyVal是Scala里每个内建值类(Byte、Short、Char、Int、Long、Float、Double、Boolean、Unit,Unit大约对应Java的void类型,被用作不返回任何结果的方法的结果类型,Unit只有一个实例值,记作“()”)的父类,AnyRef是所有引用类型的基类。AnyRef直接映射为Java的Object,在Scala里使用它就如同在Java里使用Object一样。另外,Object也有些方法是无法通过Any或AnyVal的引用来调用的。AnyRef直接映射为Object, Any和AnyVal则是通过类型擦除成Object。
在Scala里的字段和方法属于相同的命名空间,因此可以将一个方法变为一个字段,那么在Scala里就不能在同一个类里用同样的名称定义字段和方法。
Scala的父构造函数必须调用主构造函数或则另一个副构造函数函数。只要在主构造函数中才能向基类的构造函数传参数。
class Person(val name: String, val age: Int) {
}
class Man(override val name: String, override val age: Int,
val gender: String) extends Person(name, age) {
override def toString(): String = {
this.name + " " + this.age + " " + this.gender
}
}
声明一个抽象类:abstract class AbstractTest {
def fun(): String
}
伴生对象与伴生类
Scala可以创建一个关联到类上的单例,这样的单例同该类共享相同的名字,类与伴生对象之间没有界限,它们可以互相访问彼此的private字段和private方法,包括构造函数。class Person private (val name: String, val age: Int) {
}
object Person {
def apply(name: String, age: Int): Person = new Person(name, age)
}
此时val a = Person("zero", 20)可以创建对象,但是val a = new Person("zero", 20)会报constructor Person in class Person cannot be accessed in object ClassTest。在Scala里,Any类型是所有Scala类型的超类,如图:
Any是一个抽象类,它的直接后代是AnyVal和AnyRef。AnyVal是Scala里每个内建值类(Byte、Short、Char、Int、Long、Float、Double、Boolean、Unit,Unit大约对应Java的void类型,被用作不返回任何结果的方法的结果类型,Unit只有一个实例值,记作“()”)的父类,AnyRef是所有引用类型的基类。AnyRef直接映射为Java的Object,在Scala里使用它就如同在Java里使用Object一样。另外,Object也有些方法是无法通过Any或AnyVal的引用来调用的。AnyRef直接映射为Object, Any和AnyVal则是通过类型擦除成Object。
在Scala里的字段和方法属于相同的命名空间,因此可以将一个方法变为一个字段,那么在Scala里就不能在同一个类里用同样的名称定义字段和方法。