1.1继承类
- 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法。
class Person { var name = "zhangsan" } class Employee extends Person{ var salary = 0.0 def description = "员工姓名:" + name + " 薪水:" + salary }
1.2重写方法
- 重写一个非抽象方法需要override修饰符,调用超类的方法,使用super关键字。
class Person { var name = "" override def toString = getClass.getName + "[name=" + name + "]" } class Employee extends Person { var salary = 0.0 override def toString = super.toString + "[salary=" + salary + "]" }
1.3类型检查和转换
- 用isInstanceOf方法,测试某个对象是否属于某个给定的类型。
- 用asInstanceOf方法将引用转换为子类的引用。classOf获取对象的类名。
scala> a.isInstanceOf[String] <console>:23: warning: fruitless type test: a value of type Array[String] cannot also be a String (the underlying of String) a.isInstanceOf[String] ^ res59: Boolean = false scala> 4.isInstanceOf[Double] res64: Boolean = false scala> 3.asInstanceOf[Float] res63: Float = 3.0
1.4超类的构造
类有一个主构器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器或主构造器的调用开始。子类的辅助构造器最终都会调用主构造器,
- 只有主构造器可以调用超类的构造器。辅助构造器不可能直接调用超类的构造器。
- 在Scala的构造器中,你不能调用super(params)。
1.5 重名字段
- 子类改写父类或者抽象父类的字段
class Person1(val name:String,var age:Int){ println("主构造器已经被调用") val school="五道口职业技术学院" def sleep="8 hours" override def toString="我的学校是:" + school + "我的名字和年龄是:" + name + "," + age } class Person2(name:String, age:Int) extends Person1(name, age){ override val school: String = "清华大学" } scala> val a=new Person2("a",11) 主构造器已经被调用 a: Person2 = 我的学校是:清华大学我的名字和年龄是:a,11
注:1)def只能重写另一个def
2)val只能重写另一个val或不带参数的def
3)var只能重写另一个抽象的var
1.6 抽象类
- abstract关键字标记不能被实例化的类。
- 方法不用标记abstract,只要省掉方法体即可。
- 类可以拥有抽象字段,抽象字段就是没有初始值的字段。
abstract class Person(val pname: String) {//抽象类 val id: Int var name: String def idString: Int//抽象方法 } class Employee(pname: String) extends Person(pname) { val id = 5; var name = ">>>" def idString = pname.hashCode }
注:子类实现抽象方法不需要override
1.7 单例对象
对象是一个只有一个实例的类,被引用时会被懒惰地创建,就像懒惰的value一样。作为顶级值,对象是单例。
作为封闭类的成员或者本地值,它的行为和val完全相同。
- 定义单个对象
对象是一个值。对象的定义看上去像一个类,但使用关键字object
object Box
这是一个带有方法的对象的示例:
object Logger { def info(message: String): Unit = println(s"INFO: $message") }
该方法info
可以从程序中的任何位置导入。像这样创建实用程序方法是单例对象的常见用例。
如何info
在另一个包中使用,如下:
import lab13.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") }
info
由于import语句,该方法是可见的import lab13.Logger.info
,然后
导入需要导入符号的“稳定路径”,对象是稳定路径。